Почему jQuery не добавляет автоматически колбэк JSONP - PullRequest
6 голосов
/ 10 марта 2010

Документация $.getJSON() гласит:

Если указанный URL-адрес находится на удаленном сервере, запрос обрабатывается как JSONP. См. Обсуждение типа данных jsonp в $ .ajax () для более подробной информации.

Документация $.ajax() для состояний типа jsonp (выделение моя):

Загрузка в блок JSON с использованием JSONP. Добавит дополнительный "? Callback =?" в конце вашего URL укажите обратный вызов .

Похоже, что если я позвоню на $.getJSON() с междоменного URL, дополнительный "callback =?" Параметр должен автоматически добавляться. (Другие части документации поддерживают эту интерпретацию.)

Однако я не вижу такого поведения. Если я не добавлю "callback =?" явно, jQuery неправильно создает XMLHttpRequest (который возвращает нулевые данные, так как я не могу прочитать междоменный ответ). Если я добавлю его явно, jQuery правильно сделает запрос .

Вот пример:

var URL = "http://www.geonames.org/postalCodeLookupJSON" +
    "?postalcode=10504&country=US";

function alertResponse(data, status) {
  alert("data: " + data + ", status: " + status);
}

$.getJSON(URL, alertResponse);
// alerts "data: null, status: success"

$.getJSON(URL + "&callback=?", alertResponse);
// alerts "data: [object Object], status: undefined"

Так что происходит? Я неправильно понимаю документацию или что-то забыл?

Само собой разумеется, что это не так уж и сложно, но я создаю веб-API и специально установил параметр обратного вызова на «обратный вызов» в надежде приспособить его для использования jQuery.

Спасибо!

(Изменить: я опубликовал это на форумах jQuery, если вам интересно.)

Ответы [ 4 ]

7 голосов
/ 20 марта 2011

Оказывается, это была ошибка в документации по jQuery. Подробнее см. http://forum.jquery.com/topic/getjson-isn-t-automatically-appending-callback-to-my-cross-domain-url.

7 голосов
/ 12 марта 2010

Попробуйте это:

var URL = "http://www.geonames.org/postalCodeLookupJSON" +
    "?postalcode=10504&country=US";
function alertResponse(data, status) {
    alert("data: " + data + ", status: " + status);
}
$.ajax({
    url: URL,
    dataType: 'jsonp',
    jsonpCallback: 'alertResponse',
});
3 голосов
/ 12 марта 2010

Да, я думаю, вы не поняли. $.getJSON - это сокращение для $.ajax({datatype: 'json'...., как сказано в документации. Он никогда не вызывает JSONP, если вы не добавите параметр callback=?.

0 голосов
/ 18 февраля 2016

Я использую код ниже,

$. Ajax ({ URL: URL, dataType: 'jsonp', успех: функция (данные) { // сделай что-нибудь } ошибка: функция (jqXHR, textStatus, errorThrown) {}, jsonpCallback: 'login_callback', });

Но обратный вызов иногда добавляется в конце URL, а иногда и не в IE. В то время как его отлично работает в хром и FF.

...