Функция обратного вызова не работает при использовании функции getJSON в jQuery

Я пытаюсь использовать функцию getJSON в jQuery для импорта некоторых данных и запуска функции обратного вызова. Функция обратного вызова не запускается. Однако, если я попытаюсь сделать то же самое с функцией get, он отлично работает. Как ни странно, он работает с функцией get, даже когда я передаю «json» в качестве типа. Почему это происходит? Я протестировал следующий файл в Firefox 3 и IE 7:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html><head> <meta http-equiv='Content-Type' content='text/html; charset=UTF-8'> <title>ajax test</title> <script type="text/javascript" src="/jquery-1.3.2.min.js"></script> </head> <body> <input type="button" id="test1" value="get"> <input type="button" id="test2" value="getJSON"> <input type="button" id="test3" value="get with json type"> <script type="text/javascript"> $("#test1").click(function() { $.get("index.html", function(response) { alert('hi'); //works } ) }); $("#test2").click(function() { $.getJSON("index.html", function(response) { alert('hi'); //doesn't work } ) }); $("#test3").click(function() { $.get("index.html", function(response) { alert('hi'); //works }, "json" ) }); </script> </body></html> 

Это, похоже, происходит независимо от того, какой URL я получаю, если он находится в одном домене. Я попытался передать некоторые данные, и это не имеет никакого значения.

  • Наследование JavaScript: Object.create vs new
  • Инвертировать цвета изображения в CSS или JavaScript
  • Появление легенды AmChart
  • Unit Testing Угловая служба, которая использует $ timeout с часами Jasmine's Mock Clock
  • Что такое закрытие? У java есть закрытие?
  • Регулярное выражение для пароля должно содержать не менее восьми символов, как минимум одно число и буквы нижнего и верхнего регистра и специальные символы
  • Конечно, я могу обойти проблему, используя функцию get, как это было в моей третьей тестовой функции, но мне все еще интересно, почему это происходит.

    Я знаю, что здесь есть аналогичный вопрос, но он не ответил на мой вопрос.

  • Преобразовать в верхний регистр как типы пользователей, используя javascript
  • Как сравнить два значения цвета в jQuery / JavaScript?
  • Замените группу захвата Regex прописными буквами в Javascript
  • JQuery: $ (). Click (fn) vs. $ (). Bind ('click', fn);
  • Выделите текстовый диапазон с помощью JavaScript
  • Как установить фокус на последний элемент, для которого окно всплывает при ошибке
  • 8 Solutions collect form web for “Функция обратного вызова не работает при использовании функции getJSON в jQuery”

    Json должен быть действительным, иначе обратный вызов не будет срабатывать.

    $ .getJSON () – JSONP, поэтому измените его следующим образом:

     $("#test2").click(function() { $.getJSON("index.html?callback=?", function(response) { alert('hi'); } ) }); 

    Сервер получает param callback, заполненный чем-то вроде: jsonp1291077863309. В ответьте ответную функцию обратного вызова jsonp1291077863309 (PUT_JSON_HERE).

    Правильно! Спустя 2 дня, сумасшедший, пытаясь заставить $.getJSON принять хорошо сформированную строку JSon с сервера, проблема была действительно на сервере! Как и Carl_Platt, вы должны добавить значение обратного вызова, полученное как параметр url, к выходному файлу json ( $_GET['callback'] в PHP). Это называется «JSON-P output», на всякий случай, если вы хотите сообщить об этом в Google.

    Руки, вот страница, где они показывают решение в PHP:

    http://1080d.com/lang/en-us/2009/10/converting-php-to-jsonp-with-json_encode/

    И помните (действительно важно) добавить к URL-адресу, который вы вызываете callback=? параметр! (Необходимо только, если URL-адрес, который вы вызываете, находится не на том же сервере, на котором выполняется исполняемый сценарий jquery) …

    JQuery автоматически заменит '?' С удобным значением перед отправкой на сервер. Вам не нужно беспокоиться о том, какое значение используется, все будет легко для вас (если сервер делает правильную работу! И в этом была проблема в моем случае!) 🙂

    Надеюсь, поможет!

    Под поверхностью, когда вы вызываете getJSON , это то, что происходит:

     // ~ line 3216 getJSON: function( url, data, callback ) { return jQuery.get(url, data, callback, "json"); }, // ... rest of jQuery core 

    Таким образом, должно быть что-то еще, предотвращающее срабатывание обратного вызова …

    Я бы начал с ** alert ** с разными вещами (а не просто «привет») на каждом обратном вызове, таким образом, вы знаете, какой из них неудачен / преуспевает.

    Как уже упоминалось многими другими, для работы getJSON необходим действительный JSON (т.е. соответствует правилам на http://json.org/ ) (это означает, что вы не можете получить HTML через getJSON как в вашем примере).

    Причина последнего теста заключается в том, что последний параметр «json» не интерпретируется как «тип». Потому что следующее НЕ работает:

     $("#test3").click(function() { $.get("index.html", '', function(response) { alert('hi'); //works }, "json" ) }); 

    У меня была такая же проблема, несмотря на то, что я хорошо сформировал JSON и т. Д. Я смог запросить мой веб-сервис и получить ответ, однако моя функция обратного вызова не срабатывала. После scrounging сети, я большинство interwebers предложил использовать «jsonp», который я сделал, так как мое приложение выполняет некоторые перекрестные вызовы доменов, а также добавляет «обратный вызов»? К моему url. Это не сработало, но в том числе обратный вызов с возвращенным JSON решил мою проблему. В приведенном ниже коде объясняется, что я имею в виду:

     //server side json formed somewhere up here String data = callback + "("+ json +")" ; 

    Ответ, полученный в результате этого, похож на « jsonp1280403476086([{"Name":"Jack Sparrow », у которого jQuery, похоже, не было проблемы и поэтому так и не умерло на мне.

    Надеюсь это поможет.

    Используйте $.post вместо $.getJSON() , в MVC2, если вы используете $.getJSON или $.get , обязательно установите JsonRequestBehavior для AllowGet . Иначе это вернет ошибку HTML, из-за которой вы не должны инициировать обратный вызов.

    Убедитесь, что у вас нет [HttpPost], указанного выше вашего метода JsonResult, в вашем контроллере. Это не приведет к возврату данных в вызов .getJSON.

    JavaScript делает сайт умным, красочным и простым использованием.