2010-03-10 24 views
6

Los estados $.getJSON() documentación:¿Por qué jQuery no agrega automáticamente la devolución de llamada 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 documentación $.ajax() para el estados de tipos de datos jsonp (el énfasis es mío):

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

Así que parece que si llamo $.getJSON() con una URL de varios dominios, la "devolución de llamada" extra? el parámetro debería agregarse automáticamente. (Otras partes de la documentación respaldan esta interpretación.)

Sin embargo, no veo ese comportamiento. Si no agrego la "devolución de llamada =?" explícitamente, jQuery hace incorrectamente un XMLHttpRequest (que devuelve datos nulos ya que no puedo leer el dominio cruzado de respuesta). Si lo agrego explícitamente, jQuery hace correctamente una solicitud de script < >.

He aquí un ejemplo:

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" 

Entonces, ¿qué está pasando? ¿Estoy malentendiendo la documentación u olvidando algo?

No hace falta decir que esto no es una gran cosa, pero estoy creando una API web y premeditadamente establecí el parámetro de devolución de llamada en "devolución de llamada" con la esperanza de adaptarlo bien al uso de jQuery.

Gracias!

(Edit:. I cross-posted this en los foros jQuery si está interesado)

Respuesta

7

Prueba esto:

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

En su ejemplo, en realidad quiere decir 'jsonpCallback: 'alertResponse'', y sí, eso funciona sin tener que agregar explícitamente la" devolución de llamada =? " parámetro. Pero eso es mucho más detallado que la elegancia de '$ .getJSON()'. Sería bueno si '$ .getJSON()' funcionó como documentado ... –

3

Sí, creo que mal entendido. $.getJSON es un atajo para $.ajax({datatype: 'json'.... como dice la documentación. Nunca realiza una llamada JSONP a menos que agregue el parámetro callback=?.

+0

Hmm ... ¿Realmente lo entendí mal? La oración que cité es bastante explícita: "Si la URL especificada está en un servidor remoto, la solicitud se trata como JSONP". –

+0

Tienes razón. Eso es confuso –

0

estoy usando código de abajo,

$ .ajax ({ url: URL, tipoDatos: 'jsonp', éxito: function (datos) {// hacer algo } de error: función (jqXHR, textStatus, errorThrown) {}, jsonpCallback: 'login_callback', });

Pero, la devolución de llamada a veces se agrega al final de la url y, a veces, no en IE. Mientras funciona bien en cromo y FF.

Cuestiones relacionadas