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

时间:2010-09-29 13:52:03

标签: jquery json mootools getjson

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

<script type="text/javascript">

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;
      });
});

}

我会在使用

点击某些内容时调用该方法
<script type="text/javascript">

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

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

ReferenceError:$未定义

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

3 个答案:

答案 0 :(得分:5)

这听起来好像你带来的一些额外代码未定义$符号。实际上,你可能已经包含了一些调用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){
             $("<img/>").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文件之后调用该函数是个好主意,然后使用上面描述的闭包技术,这样你就可以安全地继续你自己的代码中的$快捷方式。

答案 1 :(得分:1)

$ is not defined表示jQuery在错误点没有链接到$变量。这可能是出于以下两个原因之一:

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

答案 2 :(得分:0)

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

查看jQuery.noConflict() - &gt; http://api.jquery.com/jquery.noconflict/

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

$jQ = jQuery.noConflict();

现在你可以使用$ jQ

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

在处理单独的JS文件时,您可以使用一个简单的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);

这个小小的美被称为自我调用的匿名函数。我们将$定义为输入参数,但是传入jQuery以确保这是$ variable的含义。