将JQuery getJSON与其他JavaScripts一起使用会产生ReferenceError

我创建了一个小示例HTML页面,以使JQuery的getJSON方法正常工作。 它看起来像下面(对不起,这只是一个概念certificate,然后加入一个更大的项目):

 function test() { $.getJSON("http://api.flickr.com/services/rest/?&method=flickr.people.getPublicPhotos&api_key=e999b3a5d47d013b780e8ac255c86266&user_id=24579658@N03&format=json&jsoncallback=?", function(data){ $.each(data.photos.photo, function(i,photo){ $("").attr("src", "http://farm5.static.flickr.com/" + photo.server + "/" + photo.id + "_" + photo.secret + ".jpg").appendTo("#images2"); //alert(); if ( i == 6 ) return false; }); }); 

}

然后我会在点击某些内容时调用该方法

  $(function() { $("#yo").click(test); });  

这在一个项目中运行良好,其中包含的唯一JS是JQuery,这些是唯一的function。 但是,一旦我将它添加到我的其他项目中,它就会出错。 另一个项目包含一些mootools库,我认为可能已经这样做了。 然而,即使在完全删除了mootools之后,只使用了这个jquery的东西,我仍然会得到以下错误:

ReferenceError:$未定义

我确实包含了其他javaScripts,例如google和其他一些javaScripts,但它们不使用JQuery或Mootools。 谁能解释为什么我会收到这个错误?

这听起来好像你带来的一些额外代码未定义$符号。 事实上,你可能已经包含了一些调用jQuery的noConflict函数的代码,它特别取消了$。

从本质上讲,jQuery定义如下:

 $ = jQuery; 

这意味着您可以使用“jQuery”替换代码中的$符号,例如:

 jQuery.getJSON(... 

要么

 jQuery(function() { jQuery("#yo").click(test); }); 

当然,$符号快捷方式当然很方便。 放弃它会是一种耻辱,所以你可以再次重新定义它以代替“jQuery”。 但是,您不希望它破坏任何其他非jQuery JavaScript,因此重新建立$快捷方式的安全方法是将所有自己的代码包装在闭包中。 每个闭包函数的唯一参数是“$”,传递给每个闭包的参数都是“jQuery”。 例如:

 (function($) { function test() { $.getJSON("http://api.flickr.com/services/rest/?&method=flickr.people.getPublicPhotos&api_key=e999b3a5d47d013b780e8ac255c86266&user_id=24579658@N03&format=json&jsoncallback=?", function(data){ $.each(data.photos.photo, function(i,photo){ $("").attr("src", "http://farm5.static.flickr.com/" + photo.server + "/" + photo.id + "_" + photo.secret + ".jpg").appendTo("#images2"); //alert(); if ( i == 6 ) return false; }); }); })(jQuery); 

请注意,匿名函数闭包具有参数$,因此在整个函数中,$将具有传递给匿名函数的值。 接下来,请注意,在函数定义的最后,我们立即调用我们刚刚定义的函数,并将jQuery作为参数传递。 这意味着在闭包内部,但在闭包内部,$现在是jQuery的快捷方式。

最后要注意的是,你可以通过调用jQuery.noConflict()来故意关闭jQuery对$符号的使用(参见http://api.jquery.com/jQuery.noConflict/ )。 如果你将使用除代码和jQuery之外的其他JavaScript代码,那么在加载所有JavaScript文件之后调用该函数是个好主意,然后使用上面描述的闭包技术,这样你就可以安全地继续您自己的代码中的$快捷方式。

$ is not defined意味着jQuery未在错误点链接到$变量。 这可能是出于以下两个原因之一:

  1. jQuery曾经被设置为$变量,但不再是。 例如,您可能已经调用了jQuery.noConflict() 。
  2. 你还没有定义jQuery。 这可能是因为您已将此脚本放在对jQuery库的调用之上。 确保您引用的第一个脚本是jQuery源代码。

你和$变量有冲突,因为mootools也试图使用变量。 一次只能使用1个。

查看jQuery.noConflict() – > http://api.jquery.com/jquery.noconflict/

在尝试使用jQuery之前,您不需要调用冲突。 你有几个使用jQuery.noConflict()的optons。 一种是在任何地方重新分配和使用jQuery特定变量:

 $jQ = jQuery.noConflict(); 

现在你可以使用$ jQ

 $jQ( "#yo" ).click( test ); 

处理单独的JS文件时,您可以使用一个简单的JSfunction来允许’$’变量在您的文件中表示“jQuery”:

 (function($) { function test() { $.getJSON("http://api.flickr.com/services/rest/ &method=flickr.people.getPublicPhotos&api_key=e999b3a5d47d013b780e8ac255c86266&user_id=24579658@N03&format=json&jsoncallback=?", function(data){ $.each(data.photos.photo, function(i,photo){ $("").attr("src", "http://farm5.static.flickr.com/" + photo.server + "/" + photo.id + "_" + photo.secret + ".jpg").appendTo("#images2"); //alert(); if ( i == 6 ) return false; }); }); })(jQuery); 

那个小小的美女叫做一个自我调用的匿名函数。 我们将$定义为输入参数,但传入jQuery以确保$变量的含义。