2011-01-17 23 views
8

Đã một thời gian kể từ khi tôi làm việc với jQuery; Tôi nghĩ tôi đang mắc một sai lầm ngu ngốc.

Dưới đây là một tiện ích Django:

class FooWidget(Widget): 

    # ... 

    class Media: 
     js = ('js/foowidget.js',) 

Dưới đây là file .js:

alert("bar"); 

$(document).ready(function() { 
    alert("omfg"); 
    $('.foo-widget').click(function() { 
    alert("hi"); 
    return false; 
    }); 
}); 

alert("foo"); 

Các chỉ alert() rằng đám cháy là người đầu tiên. Tôi có lỗi cú pháp ngu ngốc hay gì đó không?

Ngoài ra, nếu một số khác bao gồm tập lệnh trên trang xác định lại $(document).ready, tôi có phải lo lắng về điều đó không? Tôi đoán rằng các định nghĩa sau này sẽ ghi đè lên tôi, vì vậy nó an toàn hơn cho các định nghĩa tiếp theo để làm một cái gì đó như:

$(document).ready(function() { 
    document.ready() 
    // real stuff 
}); 

jQuery đã được bao gồm trong trang bằng cách lần foowidget.js là.

Cập nhật: Dựa vào liên kết @ lazerscience, tôi thử như sau thay vào đó, nhưng nó vẫn không giống như trước:

alert("bar"); 

$(function() { 
    alert("omfg"); 
    $(".set-widget").click(function() { 
    alert("hi"); 
    return false; 
    }); 
}); 

alert("foo"); 

Cập nhật 2: Thật kỳ lạ, khi tôi làm:

alert($); 

Tôi nhận được "không xác định". Điều này cho thấy jQuery thực sự không được khởi tạo. Điều này confuses me, vì <head> bao gồm:

<script type="text/javascript" src="/media/js/jquery.min.js"></script> 
<script type="text/javascript" src="/media/js/jquery.init.js"></script> 
<script type="text/javascript" src="/media/js/actions.min.js"></script> 
<script type="text/javascript" src="/static/js/foowidget.js"></script> 

Không đưa kịch bản của tôi sau khi kịch bản jQuery đảm bảo rằng $ sẽ được xác định?

Cập nhật 3: từ jquery.min.js:

/*! 
* jQuery JavaScript Library v1.4.2 
* http://jquery.com/ 
* 
* Copyright 2010, John Resig 
* Dual licensed under the MIT or GPL Version 2 licenses. 
* http://jquery.org/license 
* 
* Includes Sizzle.js 
* http://sizzlejs.com/ 
* Copyright 2010, The Dojo Foundation 
* Released under the MIT, BSD, and GPL Licenses. 
* 
* Date: Sat Feb 13 22:33:48 2010 -0500 
*/ 
(function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o<i;o++)e(a[o],b,f?d.call(a[o],o,e(a[o],b)):d,j);return a}return i? /* ... */ 

Trông đúng với tôi.

Đây là từ Firebug console:

Error: $ is not a function 
[Break On This Error] $(function() { 
foowidget.js (line 5) 
>>> $ 
anonymous() 
>>> jQuery 
undefined 
>>> $('a') 
null 
>>> $(document) 
null 

Cập nhật 4: $ được xác định trên tất cả các trang của trang web Django của tôi ngoại trừ ứng dụng quản trị. Odd ...

Cập nhật 5: Điều này thật thú vị.

jQuery.init.js:

// Puts the included jQuery into our own namespace 
var django = { 
"jQuery": jQuery.noConflict(true) 
}; 

Từ giao diện điều khiển:

>>> $ 
anonymous() 
>>> django 
Object {} 
>>> django.jQuery 
function() 
>>> django.jQuery('a') 
[a /admin/p..._change/, a /admin/logout/, a ../../, a ../, a.addlink add/] 
+0

Bạn có sử dụng bất kỳ công cụ nhà phát triển nào như Firebug hoặc Công cụ nhà phát triển Chrome không? –

+0

Bạn nên xác nhận rằng thẻ script /media/js/jquery.min.js thực sự trả về thư viện jquery. – Andrew

+0

Tôi đã xem tệp. Nó dường như là thư viện jQuery, mặc dù tôi đã không làm một sự khác biệt. –

Trả lời

1

Bạn có thể sử dụng $(document).ready()as often as you want to on one page.Nó không xác định lại bất cứ điều gì như bạn gọi nó, nhưng cuộc gọi của ready() thêm chức năng được gọi khi "tài liệu sẵn sàng". Để gỡ lỗi mã của bạn, ví dụ: sử dụng Firebug sẽ hiển thị cho bạn thông tin bị xóa nhiều hơn về nơi xảy ra lỗi nếu có bất kỳ lỗi nào!

+0

Firebug phàn nàn rằng $ không xác định (xem bên trên) –

+13

Nếu bạn đang sử dụng jQuery được tải bởi django, hãy bọc mã của bạn bằng '(function ($) { // mã của bạn ở đây… }) (django.jQuery); '! –

0

Trong Firefox, hãy xem mã nguồn của trang, sau đó nhấp vào liên kết "/media/js/jquery.min.js" để xem liệu nó có được tải hay không. Có lẽ bạn đang nhận được 404 vì bạn không xác định đúng URL phương tiện.

Bạn cũng có thể sử dụng máy chủ phát triển cho mục đích này, nó sẽ hiển thị cho bạn tất cả yêu cầu và mã trạng thái HTTP được trả lại.

+0

Tôi đã kiểm tra và không phải là 404. Đó là mã jQuery, như tôi đã cập nhật ở trên. –

3

Sử dụng bảng điều khiển Firebug hoặc Web Inspector JS và nhập $ và/hoặc jQuery. Đó là cách đơn giản nhất để tìm hiểu xem thư viện đã được tải chính xác chưa. Trong trường hợp khó, mà chỉ jQuery được xác định, bạn có thể quấn kịch bản của bạn vào phạm vi riêng của nó:

(function($){ 
    // your code here… 
})(jQuery); 

Nếu không có gì được xác định tại giao diện điều khiển, vấn đề là khả năng với các tập tin nhất và tôi muốn thử AndiDog của cách tiếp cận để xem có bất kỳ thứ gì được tải không.

+0

Bạn nói đúng, giao diện điều khiển không hiển thị các sự cố. (OP được cập nhật.) –

+0

Bạn có cơ hội bao gồm một thư viện khác sử dụng $, chẳng hạn như nguyên mẫu không? – polarblau

-1

Bạn có thể quên bao gồm {{ form.media }} trong mẫu của mình.

+0

Bạn có thấy các thẻ '

20

Thêm này để phía trên cùng của tập tin .js tôi sửa chữa nó:

var $ = django.jQuery; 

Tôi không chắc chắn làm thế nào để loại bỏ các tập tin jquery.init.js, cho rằng dự án của tôi không chứa bất kỳ kịch bản sử dụng $ cho một thứ khác ngoài jQuery.

3

tôi giải quyết vấn đề này trên con đường này, bạn phải bao gồm jquery.init.js (thường jquery.init.js từ admin) trong tập tin tiện ích này dòng sau:

var django = { 
    "jQuery": jQuery.noConflict(true) 
}; 
var jQuery = django.jQuery; 
var $=jQuery; 

và u có trong toàn bộ không gian làm việc jquery và $. Đối với mã tốt hơn tìm kiếm tôi thích tạo tập tin init jquery của riêng tôi trong dự án.

Các vấn đề liên quan