TypeError: $ không phải là hàm khi gọi hàm jQuery


214

Tôi có một tập lệnh jQuery đơn giản trong một plugin WordPress đang sử dụng trình bao bọc jQuery như thế này:

$(document).ready(function(){

    // jQuery code is in here

});

Tôi đang gọi tập lệnh này từ trong Bảng điều khiển WordPress và đang tải nó SAU khung jQuery đã được tải.

Khi tôi kiểm tra trang trong Fireorms, tôi liên tục nhận được thông báo lỗi:

LoạiError: $ không phải là một hàm

$ (tài liệu). yet (function () {

Tôi có nên gói kịch bản trong chức năng này:

(function($){

    // jQuery code is in here

})(jQuery);

Tôi đã gặp lỗi này khá nhiều lần và không biết phải xử lý như thế nào.

Mọi sự trợ giúp sẽ rất được trân trọng.


3
Nếu bạn gõ $vào bảng điều khiển và nhấn enter - bạn thấy gì?
zerkms

Khi chạy $ trong bảng điều khiển, tôi nhận được "không xác định"
Jason

Câu trả lời:


320

Theo mặc định khi bạn sử dụng jQuery trong Wordpress, bạn phải sử dụng jQuery$không được sử dụng (điều này là để tương thích với các thư viện khác).

Giải pháp gói nó của functionbạn sẽ hoạt động tốt hoặc bạn có thể tải jQuery theo một cách khác (nhưng có lẽ đó không phải là một ý tưởng hay trong Wordpress).

Nếu bạn phải sử dụng document.ready, bạn thực sự có thể chuyển $vào lệnh gọi hàm:

jQuery(function ($) { ...

Tôi đã thử phiên bản thứ hai tuy nhiên nó không hoạt động, phiên bản đầu tiên đã làm nhưng tôi chỉ muốn chắc chắn rằng tôi sẽ không tăng gấp đôi khi gọi jQuery.
Jason

@Jason bạn thậm chí không cần điều đó; chính xác những gì tôi đã đăng: jsfiddle.net/vcbYJ
Thuốc nổ

Bạn có thể vui lòng xem câu hỏi này wordpress.stackexchange.com/questions/214858/ trên

Và nếu có bất kỳ công cụ chọn nào ở bên ngoài jQuery(function ($) { ..., bạn phải sử dụng jQuerythay vì$
Misha Rudrastyh

Cảm ơn nhé người anh em. Đánh giá cao
Desper 30/07/19

153

Điều này sẽ sửa nó:

jQuery(document).ready(function($){
  //you can now use $ as your jQuery object.
  var body = $( 'body' );
});

Nói một cách đơn giản, WordPress chạy kịch bản của riêng họ trước khi bạn có thể và họ phát hành $var để nó không va chạm với các thư viện khác. Điều này hoàn toàn có ý nghĩa, vì WordPress được sử dụng cho tất cả các loại trang web, ứng dụng và tất nhiên là blog.

Từ tài liệu của họ:

Thư viện jQuery đi kèm với WordPress được đặt ở chế độ noConflict () (xem wp-gồm / js / jquery / jquery.js). Điều này là để ngăn chặn các vấn đề tương thích với các thư viện JavaScript khác mà WordPress có thể liên kết.

Trong chế độ noConflict (), phím tắt $ toàn cầu cho jQuery không khả dụng ...


28

Giải pháp này hiệu quả với tôi

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

Di chuyển mã của bạn bên trong bao đóng và sử dụng $thay vìjQuery

Tôi đã tìm thấy giải pháp trên trong /magento/33348/uncaught-typeerror-undained-is-not-a-feft-when-USE-a-jquery-plugin-in-ma

... sau khi tìm kiếm quá nhiều


2
Giải pháp tuyệt vời. Lý do chính làm việc này là vì ";" đóng bất kỳ trường hợp nào khác của jquery đã hoạt động và đồng thời nó tuyên bố một cái khác mới cục bộ. Khi bạn chỉ có vài giây để thực hiện một bố cục trong sản xuất hoặc rất nhiều plugin wordpress đang chạy, điều này có thể làm điều đó thật tuyệt. Nhưng, lưu ý rằng bạn phải khắc phục sự cố, đây chỉ là hỗ trợ ban nhạc, nhưng nếu đó là trang thông tin thì không sao.
luis

@Martha James Điều này làm việc cho tôi vì vậy bao gồm nó. Nó có thể hoặc không thể làm việc cho người khác
Bikram Shrestha

19

Bạn có thể tránh xung đột như thế này

var jq=jQuery.noConflict();
jq(document).ready(function(){  
  alert("Hi this will not conflict now");
  jq('selector').show();
});

7
Hoặc $ = jQuery.noConflict ();
Cyssoo


13

Thử cái này:

<script language="JavaScript" type="text/javascript" src="jquery/jquery.js"></script>
<script>
    jQuery.noConflict();
    (function ($) {
        function readyFn() {
            // Set your code here!!
        }

        $(document).ready(readyFn); 
    })(jQuery);

</script>

8

Bạn phải vượt qua $ trong hàm ()

<script>
jQuery(document).ready(function($){

// jQuery code is in here

});
</script>

3
Làm thế nào là khác bất kỳ câu trả lời ở trên (từ ba năm trước)?
rnevius

8

thay thế $dấu bằng jQuery như thế này:

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

7

Kiểm tra kỹ các tham chiếu jQuery của bạn. Có thể là bạn đang tham chiếu nó nhiều lần hoặc bạn đang gọi hàm của mình quá sớm (trước khi jQuery được xác định). Bạn có thể thử như được đề cập trong các nhận xét của tôi và đặt bất kỳ tham chiếu jQuery nào ở đầu tệp của bạn (trong phần đầu) và xem điều đó có giúp ích không.

Nếu bạn sử dụng đóng gói jQuery thì không nên giúp đỡ trong trường hợp này. Vui lòng thử vì tôi nghĩ nó đẹp hơn và rõ ràng hơn, nhưng nếu jQuery không được xác định, bạn sẽ gặp các lỗi tương tự.

Cuối cùng ... jQuery hiện chưa được xác định.


Tôi nghĩ rằng nó thay vì một cái gì đó cố gắng truy cập JQuery trước khi nó được xác định, điều này sẽ phá vỡ mọi thứ. Hãy thử di chuyển scripttài liệu tham khảo nào của bạn JQuerylên đầu trang của bạn index.htmlvà nó có thể sẽ hoạt động
Dan Moldovan

Câu trả lời này cần nhiều tầm nhìn hơn. Có, những cái khác là hợp lệ nếu không gian tên tiêu chuẩn được lấy bằng một phiên bản jQuery được tải thông qua một số plugin khác. Nhưng hãy kiểm tra xem bạn không vô tình (và có thể không cần thiết) tải jQuery nhiều lần.
edkay


5

Sử dụng

jQuery(document).

thay vì

$(document).

hoặc là

Trong hàm, $ trỏ tới jQuery như bạn mong đợi

(function ($) {
   $(document).
}(jQuery));

4

Những gì làm việc cho tôi. Thư viện đầu tiên để nhập là thư viện truy vấn và sau đó gọi phương thức jQuery.noConflict ().

<head>
 <script type="text/javascript" src="jquery.min.js"/>
 <script>
  var jq = jQuery.noConflict();
  jq(document).ready(function(){
  //.... your code here
    });
 </script>


3
<script>
var jq=jQuery.noConflict();
(function ($) 
    {
    function nameoffunction()
    {
        // Set your code here!!
    }

    $(document).ready(readyFn); 
    })(jQuery);

Bây giờ sử dụng jq thay cho jQuery


3

Bạn gặp phải vấn đề này khi tên hàm của bạn và một trong các tên id trong tệp giống nhau. chỉ cần đảm bảo tất cả tên id của bạn trong tệp là duy nhất.


2

Bạn có thể dùng

jQuery(document).read(function(){ ... });

hoặc là

(function ($) { ... }(jQuery));
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.