jQuery Uncaught TypeError: Thuộc tính '$' của đối tượng [object Window] không phải là một hàm


92

Tất cả, tôi đã tải xuống một ứng dụng biểu mẫu JS / CSS được phân nhóm sẵn và tôi đang cố gắng sử dụng nó trong Wordpress. Tôi có mã sau:

$(document).ready(function () {


/*----------------------------------------------------------------------*/
/* Parse the data from an data-attribute of DOM Elements
/*----------------------------------------------------------------------*/


$.parseData = function (data, returnArray) {
    if (/^\[(.*)\]$/.test(data)) { //array
        data = data.substr(1, data.length - 2).split(',');
    }
    if (returnArray && !$.isArray(data) && data != null) {
        data = Array(data);
    }
    return data;
};

/*----------------------------------------------------------------------*/
/* Image Preloader
/* http://engineeredweb.com/blog/09/12/preloading-images-jquery-and-javascript
/*----------------------------------------------------------------------*/



// Arguments are image paths relative to the current page.
$.preload = function() {
    var cache = [],
        args_len = arguments.length;
    for (var i = args_len; i--;) {
        var cacheImage = document.createElement('img');
        cacheImage.src = arguments[i];
        cache.push(cacheImage);
    }
};


/*----------------------------------------------------------------------*/
/* fadeInSlide by revaxarts.com
/* Fades out a box and slide it up before it will get removed
/*----------------------------------------------------------------------*/


$.fn.fadeInSlide = function (speed, callback) {
    if ($.isFunction(speed)) callback = speed;
    if (!speed) speed = 200;
    if (!callback) callback = function () {};
    this.each(function () {

        var $this = $(this);
        $this.fadeTo(speed / 2, 1).slideDown(speed / 2, function () {
            callback();
        });
    });
    return this;
};


/*----------------------------------------------------------------------*/
/* fadeOutSlide by revaxarts.com
/* Fades out a box and slide it up before it will get removed
/*----------------------------------------------------------------------*/


$.fn.fadeOutSlide = function (speed, callback) {
    if ($.isFunction(speed)) callback = speed;
    if (!speed) speed = 200;
    if (!callback) callback = function () {};
    this.each(function () {

        var $this = $(this);
        $this.fadeTo(speed / 2, 0).slideUp(speed / 2, function () {
            $this.remove();
            callback();
        });
    });
    return this;
};

/*----------------------------------------------------------------------*/
/* textFadeOut by revaxarts.com
/* Fades out a box and slide it up before it will get removed
/*----------------------------------------------------------------------*/


$.fn.textFadeOut = function (text, delay, callback) {
    if (!text) return false;
    if ($.isFunction(delay)) callback = delay;
    if (!delay) delay = 2000;
    if (!callback) callback = function () {};
    this.each(function () {

        var $this = $(this);
        $this.stop().text(text).show().delay(delay).fadeOut(1000,function(){
            $this.text('').show();
            callback();
        })
    });
    return this;
};

/*----------------------------------------------------------------------*/
/* leadingZero by revaxarts.com
/* adds a leding zero if necessary
/*----------------------------------------------------------------------*/


$.leadingZero = function (value) {
    value = parseInt(value, 10);
    if(!isNaN(value)) {
        (value < 10) ? value = '0' + value : value;
    }
    return value;
};


});

Tôi đã giả định rằng Wordpress không có xung đột gây ra sự cố vì vậy tôi đã cập nhật dấu ngoặc cuối cùng trông giống như sau:

}, "jQuery");

Tuy nhiên, tôi vẫn nhận được lỗi tương tự. Có ai biết điều gì sẽ dẫn đến vấn đề này và làm thế nào để giải quyết nó?

Cảm ơn trước!

Câu trả lời:


260

Đây là vấn đề về cú pháp, thư viện jQuery đi kèm với WordPress tải ở chế độ "không xung đột". Điều này là để ngăn chặn sự cố tương thích với các thư viện javascript khác mà WordPress có thể tải. Trong chế độ "no-confict", phím tắt $ không khả dụng và jQuery lâu hơn được sử dụng, tức là

jQuery(document).ready(function ($) {

Bằng cách bao gồm $ trong ngoặc đơn sau lệnh gọi hàm, bạn có thể sử dụng phím tắt này trong khối mã.

Để biết chi tiết đầy đủ, hãy xem WordPress Codex


Tôi nên nói thêm rằng bạn cần phải nới lỏng "jQuery" ở cuối
RedEyedMonster

3
Bạn thật là một NGƯỜI TIẾT KIỆM CUỘC SỐNG !!! Sau 3 ngày gỡ lỗi, tôi thấy rằng đây là giải pháp chính xác cho sự cố của tôi. Mặc dù WordPress đang tải tệp jQuery, nhưng tôi không thể truy cập các fucntions được đề cập trong tài liệu đã sẵn sàng. Vì vậy, dòng mã chính xác này tức là đã jQuery(document).ready(function ($) {sửa nó cho tốt. Cảm ơn rất nhiều vì đã chia sẻ.
Devner

2
đây cũng là vấn đề tương tự trong Drupal. Giải pháp cũng hoạt động ở đó. Cảm ơn bạn
Yogesh Gupta

35

Cấu trúc không thân thiện với xung đột yêu thích của tôi:

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

Gọi jQuery bằng con trỏ hàm là một phím tắt cho $ (document) .ready (...)

Hoặc như chúng tôi nói trong coffeescript:

jQuery ($) ->
  # code here

Nếu $đã là một thể hiện jquery - thì có lý do gì để chuyển jQuery$đặt tên cho nó một lần nữa không?
zerkms

2
$ có thể không phải là một phiên bản jQuery nếu nó xung đột với một thư viện khác - chế độ không xung đột.
Julian

4
Nó là một lối tắt để $(document).ready(), không phải$(document).on('load')
Kevin B

Điều này đã làm việc cho tôi! Tất cả các chức năng custom.js trong chủ đề của tôi đã bị hỏng một cách khó hiểu. Tôi thay thế $ (document) .ready (function () {với điều này và nó làm việc như kỳ diệu :)
Ira Herman


1

Bạn có thể cân nhắc thay thế tập lệnh jQuery WordPress mặc định bằng Thư viện Google bằng cách thêm một cái gì đó như sau vào tệp chủ đề functions.php:

function modify_jquery() {
    if (!is_admin()) {
        wp_deregister_script('jquery');
        wp_register_script('jquery', 'http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js', false, '1.10.2');
        wp_enqueue_script('jquery');
    }
}
add_action('init', 'modify_jquery');

Mã lấy từ đây: http://www.wpbeginner.com/wp-themes/replace-default-wordpress-jquery-script-with-google-library/


Giải pháp tốt nhất nếu bạn đang sử dụng "bên ngoài" JQuery plugin bên ngoài của WP Nhược điểm: - Có thể - mâu thuẫn với một số plugin Wordpress - không có gì để ý đứng về phía tôi
RunsnbunsN

-1

có thể bạn có mã như thế này trước jquery:

var $jq=jQuery.noConflict();
$jq('ul.menu').lavaLamp({
    fx: "backout", 
    speed: 700
});

và họ đã xung đột

bạn có thể thay đổi $ thành (jQuery)


1
Tôi đã sử dụng nó giống như var $=jQuery.noConflict();Mine là một thiết lập java-webapp, nhưng tôi gặp lỗi tương tự!
coding_idiot
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.