2010-03-10 2 views
6

В $.getJSON() документации говорится:Почему не jQuery автоматически добавляет обратный вызов JSONP?

If the specified URL is on a remote server, the request is treated as JSONP instead. See the discussion of the jsonp data type in $.ajax() for more details.

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

Loads in a JSON block using JSONP. Will add an extra "?callback=?" to the end of your URL to specify the callback.

Таким образом, кажется, что если я называю $.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.

Спасибо!

(Edit:. Я cross-posted this в форумах JQuery, если вы заинтересованы)

ответ

7

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

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', 
}); 
+1

В вашем примере вы на самом деле означаете 'jsonpCallback: 'alertResponse'', и да, это работает без меня, чтобы явным образом добавить« callback =? » параметр. Но это гораздо более многословно, чем элегантность '$ .getJSON()'. Было бы неплохо, если '$ .getJSON()' работал как документально ... –

3

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

+0

Хм ... я действительно неправильно понял? Предложение, которое я цитировал, довольно явственно: «Если указанный URL-адрес находится на удаленном сервере, вместо этого запрос обрабатывается как JSONP». –

+0

Вы правы. Это сбивает с толку. –

0

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

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

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

Смежные вопросы