2012-12-22 216 views
5

我試圖在嘗試在我自己的django項目中實現它時調試一個使用python-django應用程序的JS/Jquery問題。我用我的瀏覽器的開發者控制檯來獲取以下錯誤:Jquery Javascript函數未定義

TypeError: 'undefined' is not a function (evaluating '$(this).yourlabsWidget()') 

所以我去查找功能「yourlabsWidget()定義在哪裏,它是直接在其上放置函數調用。

$.fn.yourlabsWidget = function(overrides) { ... } 

$(document).ready(function() { 
$('.autocomplete-light-widget[data-bootstrap=normal]').live('initialize', function() { 
    $(this).yourlabsWidget(); 
}); 

我對JavaScript或jquery瞭解不多,所以我完全不知所措。假設沒有任何語法錯誤,這樣的問題是否意味着jquery無法正常工作?我知道這不是很多信息,但我會添加任何其他需要的相關信息。

的應用程序和具體的文件給我找麻煩的位置(分別),

我測試過它自己的測試項目中的應用在我的開發服務器上,它可以在自己的測試項目中使用。但是,如果我將一個正在運行的測試應用程序安裝到我自己的django項目中,它將不再有效。

UPDATE:

全功能定義:

$.fn.yourlabsWidget = function(overrides) { 
var overrides = overrides ? overrides : {}; 

if (this.data('widget') == undefined) { 
    // Instanciate the widget 
    var widget = new yourlabs.Widget(this); 

    // Pares data-* 
    var data = this.data(); 
    var dataOverrides = {autocompleteOptions: {}}; 
    for (var key in data) { 
     if (!key) continue; 

     if (key.substr(0, 12) == 'autocomplete') { 
      var newKey = key.replace('autocomplete', ''); 
      newKey = newKey.replace(newKey[0], newKey[0].toLowerCase()) 
      dataOverrides['autocompleteOptions'][newKey] = data[key]; 
     } else { 
      dataOverrides[key] = data[key]; 
     } 
    } 

    // Allow attribute overrides 
    widget = $.extend(widget, dataOverrides); 

    // Allow javascript object overrides 
    widget = $.extend(widget, overrides); 

    this.data('widget', widget); 

    // Setup for usage 
    widget.initialize(); 

    // Widget is ready 
    widget.widget.attr('data-widget-ready', 1); 
    widget.widget.trigger('widget-ready'); 
} 

return this.data('widget'); 
} 

HTML(含)

<!DOCTYPE html> 
<html lang="en-us" > 
<head> 
<title></title> 
<link rel="stylesheet" type="text/css" href="/static/admin/css/base.css" /> 
<link rel="stylesheet" type="text/css" href="/static/admin/css/forms.css" /> 
<!--[if lte IE 7]><link rel="stylesheet" type="text/css" href="/static/admin/css/ie.css"  /><![endif]--> 

<script type="text/javascript">window.__admin_media_prefix__ = "/static/admin/";</script> 


    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js" type="text/javascript"></script> 

<script type="text/javascript" src="/static/autocomplete_light/autocomplete.js"></script> 
<script type="text/javascript" src="/static/autocomplete_light/widget.js"></script> 
<script type="text/javascript" src="/static/autocomplete_light/addanother.js"></script> 
<script type="text/javascript" src="/static/autocomplete_light/text_widget.js"></script> 
<script type="text/javascript" src="/static/autocomplete_light/remote.js"></script> 
<link rel="stylesheet" type="text/css" href="/static/autocomplete_light/style.css" /> 

HTML表單:

<span class="autocomplete-light-widget customer_order_products_set-0-product_id 
single" 
id="id_customer_order_products_set-0-product_id-wrapper" 
data-max-values="1" data-bootstrap="normal" 
data-autocomplete-url="http://127.0.0.1:8000/autocomplete/InventoryAutocomplete/" data-autocomplete-choice-selector="[data-value]" data-autocomplete-placeholder="THIS IS WORKING" 
> 

注:我知道這個網址是不是便攜。這只是爲了測試。

+0

你可以提供$ .fn.yourlabsWidget()的實現嗎? – nekman

+0

我認爲通過實現你的意思是函數的代碼。當然可以。我會更新這個問題。如果這不是你的意思,請讓我知道,我會糾正。 – Jglstewart

+0

如果'在開箱即用的自己的測試項目中工作'不清楚什麼是不同的,當你得到錯誤 – charlietfl

回答

0

你試過這樣:

$.fn.yourlabsWidget = function(overrides) { ... }; 
$(document).ready(function() { 
    $('body').on('load', function() { 
     $('.autocomplete-light-widget input[data-bootstrap=normal]').yourlabsWidget(); 
    }); 
}); 

,或者你可以嘗試這一個了:

$(document).ready(function() { 
    $('.autocomplete-light-widget input[data-bootstrap=normal]').yourlabsWidget(); 
}); 

我猜你缺少在代碼中輸入或選擇標籤參考。看看這個工程

+0

嗯,當我這樣做時,錯誤消失,但我的應用程序仍然無法正常工作。我真的不相信代碼本身存在問題,因爲我已經在我的開發服務器上用自己的測試項目測試了應用程序,並且它在自己的測試項目中開箱即用。我會在這個問題上加上這一點。 – Jglstewart

+0

看到更新的答案,希望這有助於。 – Jai

+0

感謝您的輸入。第二種選擇是給我完全相同的錯誤。 – Jglstewart

3

$(this).yourlabsWidget() undefined is not a function

這意味着$(this).yourlabsWidget是未定義的。

您正在加載的jQuery兩次:

  • jQuery是加載
  • 自動完成插件加載到jQuery的
  • jQuery是再次加載
  • 它不具備的自動完成插件
+0

這是正確的答案!您的base.html和其他擴展的html文件可能正在調用jQuery –