TypeError: $ не є функцією при виклику функції jQuery


214

У мене є простий сценарій jQuery в плагіні WordPress, який використовує обгортку jQuery, як це:

$(document).ready(function(){

    // jQuery code is in here

});

Я закликаю цей сценарій з інформаційної панелі WordPress і завантажую його після того, як завантажилася рамка jQuery.

Коли я перевіряю сторінку в Firebug, я постійно отримую повідомлення про помилку:

TypeError: $ не є функцією

$ (документ) .ready (функція () {

Чи варто, можливо, перетворити сценарій у цю функцію:

(function($){

    // jQuery code is in here

})(jQuery);

У мене була ця помилка досить багато разів, і я не знаю, як з нею впоратися.

Будь-яка допомога буде дуже вдячна.


3
Якщо ви введете $консоль і натисніть клавішу Enter - що ви бачите?
zerkms

При запуску $ в консолі я отримую "невизначений"
Джейсон

Відповіді:


320

За замовчуванням, коли ви запитаєте jQuery в Wordpress, ви повинні використовувати jQuery, і $не використовується (це для сумісності з іншими бібліотеками).

Ваше рішення про завершення functionроботи буде добре працювати, або ви можете завантажити jQuery іншим способом (але це, мабуть, не дуже гарна ідея в Wordpress).

Якщо потрібно скористатися document.ready, ви можете перейти $у виклик функції:

jQuery(function ($) { ...

Я спробував другу версію, проте вона не спрацювала, перша версія зробила, але я просто хочу переконатися, що я не подвоююся на виклик jQuery.
Джейсон

@Jason вам навіть цього не потрібно; саме те, що я розмістив: jsfiddle.net/vcbYJ
Вибухові таблетки

Чи можете Ви побачити це питання wordpress.stackexchange.com/questions/214858/…

І якщо якийсь селектор знаходиться поза jQuery(function ($) { ..., вам доведеться використовувати jQueryзамість$
Міша Рудрастих

Дякую брате. Оцініть це
Деспер

154

Це має виправити:

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

Простіше кажучи, WordPress запускає власні сценарії, перш ніж ви зможете, і вони випускають $var, щоб він не стикався з іншими бібліотеками. Це має повний сенс, оскільки WordPress використовується для всіх видів веб-сайтів, додатків і, звичайно, блогів.

З їх документації:

Бібліотека jQuery, включена до WordPress, встановлена ​​в режим noConflict () (див. Wp-include / js / jquery / jquery.js). Це запобігає проблемам сумісності з іншими бібліотеками JavaScript, до яких WordPress може пов'язувати.

У режимі noConflict () глобальний ярлик $ для jQuery недоступний ...


28

Це рішення спрацювало на мене

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

Перемістіть свій код всередину закриття та використовуйте $замість цьогоjQuery

Я знайшов вищезазначене рішення в /magento/33348/uncaught-typeerror-undefined-is-not-a-function-when-using-a-jquery-plugin-in-ma

... після занадто багато пошуків


2
Фантастичне рішення. Основна причина цього працює в тому, що це ";" закриває будь-який інший екземпляр jquery, який вже є активним, і в той же час оголошує ще один новий локально. Якщо у вас є лише кілька секунд, щоб реалізувати макет у виробництві чи багато та багато плагінів WordPress, які працюють, це може зробити це чудово. Але майте на увазі, що ви маєте виправити проблему, це лише довідковий засіб, але якщо це інформаційна сторінка, це все в порядку.
Луїс

@Martha James Це для мене працює, тому він включив його. Це може бути, а може і не працювати для інших
Bikram Shrestha

19

Ви можете уникнути подібних конфліктів

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

7
Або $ = jQuery.noConflict ();
Cyssoo



8

Вам потрібно здати $ in function ()

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

// jQuery code is in here

});
</script>

3
Чим це відрізняється від відповіді, наведеної вище (за три роки до цього)?
rnevius


7

Двічі перевірте свої посилання на jQuery. Можливо, що ви або посилаєтесь на нього не один раз або ви викликаєте свою функцію занадто рано (до визначення jQuery). Ви можете спробувати, як згадувалося в моїх коментарях, і помістити будь-яку посилання на jQuery вгорі свого файлу (в голові) і побачити, чи це допомагає.

Якщо ви використовуєте інкапсуляцію jQuery, це не повинно допомогти в цьому випадку. Спробуйте, тому що я вважаю, що це красивіше і очевидніше, але якщо jQuery не визначений, ви отримаєте ті самі помилки.

Зрештою ... jQuery наразі не визначений.


Я думаю, що це швидше, ніж щось намагається отримати доступ до JQuery, перш ніж буде визначено, що в свою чергу все порушує. Спробуйте перенести свої scriptпосилання JQueryна верхню частину вашого, index.htmlі це, мабуть, спрацює
Дан Молдован

Ця відповідь потребує більшої наочності. Так, інші дійсні, якщо стандартний простір імен займає версія jQuery, завантажена через якийсь інший плагін. Але переконайтеся, що ви неодноразово (і, можливо, непотрібно) завантажуєте jQuery не один раз.
edkay


5

Використовуйте

jQuery(document).

замість

$(document).

або

У межах функції $ вказує на jQuery, як ви очікували

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

4

Що працювало на мене. Перша імпортна бібліотека - це бібліотека запитів, а потім виклик методу 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);

тепер використовуйте jq замість jQuery


3

У цьому питанні ви стикаєтесь, коли ім’я функції та одне з імен ідентифікатора у файлі однакові. просто переконайтеся, що всі ваші імена id у файлі унікальні.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.