Ответ 1
Json должен быть действительным, иначе обратный вызов не будет срабатывать.
Я пытаюсь использовать функцию 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, как это было в моей третьей тестовой функции, но мне все еще интересно, почему это происходит.
Я знаю, что здесь есть > подобный вопрос, но он не ответил на мой вопрос.
Json должен быть действительным, иначе обратный вызов не будет срабатывать.
$. getJSON() - JSONP, поэтому измените его следующим образом:
$("#test2").click(function() {
$.getJSON("index.html?callback=?",
function(response) {
alert('hi');
}
)
});
Сервер получает обратный вызов param, заполненный чем-то вроде: jsonp1291077863309. В ответьте обратную функцию обратного вызова jsonp1291077863309 (PUT_JSON_HERE).
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 автоматически заменит '?' с удобным значением перед отправкой на сервер. Вам не нужно беспокоиться о том, какое значение используется, все будет легко для вас (если сервер делает правильную работу! И в этом была проблема в моем случае!): -)
Надеюсь, что это поможет!
Под поверхностью, когда вы вызываете getJSON
, это происходит:
// ~ line 3216
getJSON: function( url, data, callback ) {
return jQuery.get(url, data, callback, "json");
}, // ... rest of jQuery core
Итак, должно быть что-то еще, предотвращающее срабатывание обратного вызова...
Я бы начал с ** alert
** при каждом обратном вызове разные вещи (а не только "привет" ), так что вы знаете, какой из них неудачен/преуспевает.
Как уже упоминалось многими другими, вам нужен действительный JSON (т.е. соответствует правилам http://json.org/) для getJSON
для (это означает, что вы не можете получить 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.