将JQuery getJSON与包含的其他Java脚本一起使用会产生ReferenceError

将JQuery getJSON与包含的其他Java脚本一起使用会产生ReferenceError,jquery,json,mootools,getjson,Jquery,Json,Mootools,Getjson,我制作了一个小示例HTML页面,以使JQuery的getJSON方法正常工作。它如下所示(很抱歉太草率了,这只是一个概念证明,然后添加到一个更大的项目中): 函数测试(){ $.getJSON(“http://api.flickr.com/services/rest/?&method=flickr.people.getPublicPhotos&api_key=e999b3a5d47d013b780e8ac255c86266&user_id=24579658@N03&format=json&js

我制作了一个小示例HTML页面,以使JQuery的getJSON方法正常工作。它如下所示(很抱歉太草率了,这只是一个概念证明,然后添加到一个更大的项目中):


函数测试(){
$.getJSON(“http://api.flickr.com/services/rest/?&method=flickr.people.getPublicPhotos&api_key=e999b3a5d47d013b780e8ac255c86266&user_id=24579658@N03&format=json&jsoncallback=?“,
功能(数据){
$。每个(data.photos.photo,函数(i,photo){
$("
}

然后,当使用

<script type="text/javascript">

                            $(function() {
                                $("#yo").click(test);
                            });
    </script>

$(函数(){
$(“#yo”)。单击(测试);
});
这在一个我只包含JQuery的JS的项目中运行得很好,这些是唯一的函数。但是,一旦我将它添加到我的另一个项目中,它就会出错。另一个项目中包含了一些mootools库,我认为可能已经在这样做了。然而,即使在完全删除了mootools的东西并使用了这个jq之后不幸的是,我仍然得到以下错误:

ReferenceError:$未定义


我确实包含了其他Java脚本,如google脚本和我制作的其他脚本,但它们不使用JQuery或Mootools。有人能解释我为什么会出现此错误吗?

$未定义
表示JQuery在错误点未链接到
$
变量。这可能是由于以下两个原因之一:

  • jQuery过去被设置为$variable,但现在不再是了。例如,您可能已经调用了
  • 您尚未定义jQuery。这可能是因为您已将此脚本置于对jQuery库的调用之上。请确保引用的第一个脚本是jQuery源

  • 由于mootools也在尝试使用$variable,您与该变量发生冲突。一次只能使用1个变量

    查看jQuery.noConflict()->

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

    $jQ = jQuery.noConflict();
    
    现在您可以使用$jQ

    $jQ( "#yo" ).click( test );
    
    处理单独的JS文件时,您可以使用litte JS功能,允许文件中的“$”变量表示“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){
          $("<img/>").attr("src", "http://farm5.static.flickr.com/" + photo.server + "/" + photo.id + "_" + photo.secret + ".jpg").appendTo("#images2");
          //alert();
              if ( i == 6 ) return false;
            });
      });
    })(jQuery);
    
    (函数($){
    函数测试(){
    $.getJSON(“http://api.flickr.com/services/rest/
    &method=flickr.people.getPublicPhotos&api_key=e999b3a5d47d013b780e8ac255c86266&user_id=24579658@N03&format=json&jsoncallback=?“,
    功能(数据){
    $。每个(data.photos.photo,函数(i,photo){
    $("
    
    这一小小的优点被称为一个自调用匿名函数。我们将$定义为一个输入参数,但传入jQuery以确保这就是$变量的含义。

    听起来您带来的一些附加代码似乎没有定义$符号。事实上,您可能包含了一些调用它的代码s jQuery的noConflict函数,该函数专门取消对$的定义

    jQuery本质上是这样定义的:

    $ = jQuery;
    
    这意味着您可以将代码中的$符号替换为“jQuery”,例如:

    jQuery.getJSON(...
    

    当然,$symbol快捷方式当然很方便。如果放弃它,那就太可惜了,所以你可以重新定义它来代替“jQuery”再一次。不过,您不希望它破坏任何其他非jQuery JavaScript,因此重新建立$shortcut的安全方法是将您自己的所有代码包装在闭包中。每个闭包函数的唯一参数是“$”,传递给每个闭包的参数是“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){
                 $("<img/>").attr("src", "http://farm5.static.flickr.com/" + photo.server + "/" + photo.id + "_" + photo.secret + ".jpg").appendTo("#images2");
                //alert();
                    if ( i == 6 ) return false;
                  });
            });
    })(jQuery);
    
    (函数($){
    函数测试(){
    $.getJSON(“http://api.flickr.com/services/rest/?&method=flickr.people.getPublicPhotos&api_key=e999b3a5d47d013b780e8ac255c86266&user_id=24579658@N03&format=json&jsoncallback=?“,
    功能(数据){
    $。每个(data.photos.photo,函数(i,photo){
    $("
    请注意,匿名函数闭包有参数$,因此在整个函数中,$将具有您传递给匿名函数的值。接下来,请注意,在函数定义的末尾,我们立即调用刚才定义的函数,并将jQuery作为参数传递。这意味着在闭包中仅在闭包内,$现在是jQuery的快捷方式


    最后一个注意事项是,您可以通过调用jQuery.noConflict()有意地关闭jQuery对$symbol的使用(请参阅)。如果您将使用除代码和jQuery之外的其他JavaScript代码,最好在加载所有JavaScript文件后调用该函数,然后使用上述闭包技术,这样您就可以在自己的代码中安全地继续使用$shortcut。

    好奇的是,为什么不使用
    $(“#yo”)。单击(测试);
    ,为什么要使用wrap函数?jquery是否处于noConflict模式?@Dimitar这是$(document.ready()的快捷方式我引用的第一个脚本是jquery库。当你说习惯设置为“$”时,你的意思是我不必再使用$了吗?如果我取出$,然后添加jquery.noConflict();在getJson调用之前,我得到以下错误:uncaughtreferenceerror:jQuery没有定义,否则如果我删除noconflict行和$,我得到:uncaughttypeerror:Object函数(el,nc){return document.id(el,nc,this.document);}没有方法“getJSON”加载jQuery库时,它会将$设置为对库的引用。如果需要,可以使用jQuery.noConflict()。其他库(如mootools)同时使用$variable,并且拥有多个库将导致命名冲突。您是否删除了对mootools库的引用
    jQuery(function() {
        jQuery("#yo").click(test);
    });
    
    (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){
                 $("<img/>").attr("src", "http://farm5.static.flickr.com/" + photo.server + "/" + photo.id + "_" + photo.secret + ".jpg").appendTo("#images2");
                //alert();
                    if ( i == 6 ) return false;
                  });
            });
    })(jQuery);