TypeError:调用jQuery函数时$不是函数


214

我在使用jQuery包装器的WordPress插件中有一个简单的jQuery脚本,如下所示:

$(document).ready(function(){

    // jQuery code is in here

});

我从WordPress仪表板内部调用此脚本,并在jQuery框架加载后将其加载。

当我在Firebug中检查页面时,我一直不断收到错误消息:

TypeError:$不是函数

$(document).ready(function(){

我是否应该将脚本包装在此函数中:

(function($){

    // jQuery code is in here

})(jQuery);

我已经有很多次此错误,并且不确定如何处理。

任何帮助将不胜感激。


3
如果您输入$控制台并按Enter键,您会看到什么?
zerkms 2012年

当运行$控制台我收到“未定义”
杰森

Answers:


320

默认情况下,当您将jQuery放入Wordpress中时,必须使用jQuery$而不使用(这是为了与其他库兼容)。

将其包装的解决方案function可以很好地工作,或者可以以其他方式加载jQuery(但这在Wordpress中可能不是一个好主意)。

如果必须使用document.ready,则实际上可以传递$给函数调用:

jQuery(function ($) { ...

我尝试了第二个版本,但是没有用,第一个版本了,但是我只是想确保我不会在调用jQuery时加倍。
杰森

@Jason你甚至不需要那个;正是我发布的内容:jsfiddle.net/vcbYJ
爆炸药


并且,如果有任何选择器在外面jQuery(function ($) { ...,则必须使用jQuery代替$
Misha Rudrastyh,

多谢兄弟。欣赏
Desper

153

这应该解决它:

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

简而言之,WordPress会先运行自己的脚本,然后发布 $ var,以免与其他库冲突。这是完全有意义的,因为WordPress用于各种网站,应用程序,当然还有博客。

从他们的文档中:

WordPress随附的jQuery库设置为noConflict()模式(请参阅wp-includes / js / jquery / jquery.js)。这是为了防止与WordPress可以链接的其他JavaScript库发生兼容性问题。

在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插件时,这样做会非常有用。但是请注意,您必须解决此问题,这只是一个创可贴,但是如果它是一个信息页面,则可以。
luis 2015年

@Martha James这对我有用,因此包含了它。它可能对别人不起作用
Bikram Shrestha


17
var $=jQuery.noConflict();

$(document).ready(function(){
    // jQuery code is in here
});

归功于Ashwani Panwar和Cyssoo的答案:https ://stackoverflow.com/a/29341144/3010027


13

试试这个:

<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

您必须在function()中传递$

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

// jQuery code is in here

});
</script>

3
这与上面给出的答案(距三年前)有什么不同?
rnevius '16

8

像这样替换$符号jQuery

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

7

仔细检查您的jQuery参考。您可能会多次引用它,或者您调用函数的时间过早(在定义jQuery之前)。您可以按照我的评论中的说明进行尝试,并将所有jQuery参考放在文件顶部(头部),看看是否有帮助。

如果使用jQuery封装,则在这种情况下无济于事。请尝试一下,因为我认为它更漂亮并且更明显,但是如果未定义jQuery,您将得到相同的错误。

最后... jQuery当前尚未定义。


我认为这不是在定义之前尝试访问JQuery的东西,这反过来会破坏一切。尝试将您的script引用移到您JQuery的顶部,index.html它可能会起作用
Dan Moldovan 2015年

这个答案需要更多的可见性。是的,如果标准名称空间与通过其他插件加载的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

当函数名称和文件中的ID名称之一相同时,就会遇到此问题。只要确保文件中的所有ID名称都是唯一的即可。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.