Использование JQuery getJSON с другими включенными JavaScripts дает ReferenceError - PullRequest
4 голосов
/ 29 сентября 2010

Я сделал небольшой пример HTML-страницы, чтобы заставить работать метод getJSON в JQuery.Это выглядит ниже (извините за неряшливость, это было просто доказательством концепции, которую затем позже добавили в более крупный проект):

<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 один и некоторые другие, которые я сделал, но они не используют JQuery или Mootools.Кто-нибудь может объяснить, почему я получаю эту ошибку?

Ответы [ 3 ]

5 голосов
/ 29 сентября 2010

Звучит так, как будто в некотором дополнительном коде, который вы ввели, не определен символ $. Фактически, возможно, вы включили некоторый код, который вызывает функцию jQuery noConflict, которая специально не определяет $.

jQuery, по сути, определяет это так:

$ = jQuery;

Это означает, что вы можете заменить символ $ в вашем коде на «jQuery», например:

jQuery.getJSON(...

или

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

Конечно, ярлык символа $, безусловно, удобен. Было бы стыдно отказаться от этого, так что вы могли бы переопределить его, чтобы заменить "jQuery" еще раз. Вы не хотели бы, чтобы он нарушал любой другой, не являющийся jQuery JavaScript, поэтому безопасный способ восстановления ярлыка $ состоит в том, чтобы обернуть весь ваш собственный код в замыкания. Параметр lone для каждой функции замыкания будет иметь значение «$», а аргумент, передаваемый каждому замыканию, будет «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, вызвав jQuery.noConflict () (см. http://api.jquery.com/jQuery.noConflict/).. Если вы будете использовать другой код JavaScript, кроме вашего кода и jQuery, это Рекомендуется вызывать эту функцию после загрузки всех файлов JavaScript, а затем использовать метод закрытия, описанный выше, чтобы вы могли безопасно перейти к ярлыку $ в своем собственном коде.

1 голос
/ 29 сентября 2010

$ is not defined означает, что jQuery не связан с переменной $ в точке ошибки.Это может быть по одной из двух причин:

  1. jQuery раньше задавался как переменная $, но больше не является.Например, вы могли вызвать jQuery.noConflict () .
  2. Вы еще не определили jQuery.Это может быть потому, что вы поместили этот скрипт над вызовом библиотеки jQuery.Убедитесь, что первый скрипт, на который вы ссылаетесь, является источником jQuery.
0 голосов
/ 29 сентября 2010

У вас конфликт с переменной $, поскольку mootools также пытается использовать эту переменную.Только 1 может использовать его одновременно.

Проверьте jQuery.noConflict () -> http://api.jquery.com/jquery.noconflict/

Вам не нужно вызывать конфликт до того, как будет предпринята любая попытка использовать jQuery.У вас есть несколько вариантов использования jQuery.noConflict ().Один из них - просто переназначить и использовать переменную, специфичную для 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, чтобы убедиться, что именно это и означает переменная $.

...