2010-03-10 8 views
6

Gli stati $.getJSON() documentazione:Perché jQuery non aggiunge automaticamente il callback 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.

La documentazione $.ajax() per il tipo di dati jsonp stati (sottolineatura mia):

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

Così sembra che se chiamo $.getJSON() con un URL tra domini, l'extra "callback =?" il parametro dovrebbe essere automaticamente aggiunto. (Altre parti della documentazione supportano questa interpretazione.)

Tuttavia, non vedo questo comportamento. Se non aggiungo il "callback =?" esplicitamente, jQuery crea erroneamente XMLHttpRequest (che restituisce dati nulli poiché non riesco a leggere la risposta tra domini). Se lo aggiungo esplicitamente, jQuery fa correttamente una richiesta > allo script <.

Ecco un esempio:

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" 

Allora, cosa sta succedendo? Sto fraintendendo la documentazione o dimenticando qualcosa?

Inutile dire che non si tratta di un grosso problema, ma sto creando un'API Web e ho impostato di proposito il parametro callback su "callback" nella speranza di adattarlo perfettamente all'utilizzo di jQuery.

Grazie!

(Edit:. Ho cross-posted this nei forum jQuery se siete interessati)

risposta

7

Prova questo:

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

Nel tuo esempio, in realtà intendi 'jsonpCallback: 'alertResponse'', e sì, funziona così senza che io debba aggiungere esplicitamente il" callback =? " parametro. Ma è molto più prolisso dell'eleganza di '$ .getJSON()'. Sarebbe bello se '$ .getJSON()' funzionasse come documentato ... –

3

Sì, penso che tu frainteso. $.getJSON è una scorciatoia per $.ajax({datatype: 'json'.... come dice la documentazione. Non esegue mai una chiamata JSONP a meno che non si aggiunga il parametro callback=?.

+0

Hmm ... ho davvero frainteso? La frase che ho citato è piuttosto esplicita: "Se l'URL specificato si trova su un server remoto, la richiesta viene invece considerata come JSONP." –

+0

Hai ragione. Questo è confuso. –

0

Sto usando il codice qui sotto,

$ .ajax ({url : URL, dataType: 'jsonp', successo: la funzione (i dati) {// fare qualcosa } di errore: function (jqXHR, textStatus, errorThrown) {}, jsonpCallback: 'login_callback', });

Tuttavia, il callback a volte viene aggiunto alla fine dell'URL e talvolta non in IE. Mentre funziona bene in cromo e FF.

Problemi correlati