функция обратного вызова не работает при использовании функции getJSON в jQuery - PullRequest
18 голосов
/ 21 апреля 2009

Я пытаюсь использовать функцию 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 я обращаюсь, если он находится в одном домене. Я попытался передать некоторые данные, и это не имеет значения.

Конечно, я могу обойти эту проблему, используя функцию get, как и в своей третьей тестовой функции, но мне все еще интересно, почему это происходит.

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

Ответы [ 8 ]

24 голосов
/ 21 апреля 2009

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

4 голосов
/ 30 ноября 2010

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

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

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

3 голосов
/ 26 сентября 2011

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

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

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

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

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

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

0 голосов
/ 16 октября 2012

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

0 голосов
/ 11 июля 2011

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

0 голосов
/ 29 июля 2010

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

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

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

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

0 голосов
/ 21 апреля 2009

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

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

$("#test3").click(function() {
    $.get("index.html",
        '',
        function(response) {
                alert('hi');
                //works
        },
        "json"
    )
});
0 голосов
/ 21 апреля 2009

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...