Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

Right! Спустя 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 script)...

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

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

Ответ 4

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

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

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

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

Ответ 5

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

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

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

Ответ 6

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

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

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

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

Ответ 7

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

Ответ 8

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