2012-06-24 19 views
8

Tengo un problema con jsonp y jquery.jQuery JSONP no llama a la devolución de llamada

Este es mi código -

var myCallback = function(data) { 
    console.log(data); 
}; 

$.ajax({ 
    url: my_url, 
    type: 'GET', 
    dataType: 'jsonp', 
    jsonp: 'callback', 
    jsonpCallback: 'myCallback' 
}); 

jQuery añade algo así como ?callback=myCallback&_=1340513330866 a my_url y los datos devueltos por my_url es myCallback('abcd') - aunque en realidad se va a regresar algún código HTML en lugar de la abcd.

Problema: abcd no se registra en la consola a través myCallback. Entonces, ¿qué estoy haciendo mal? ¿Tenía la impresión de que los datos devueltos se ejecutarán tal como están dentro de las etiquetas de script?

+0

Podría publicar un ejemplo de la respuesta que desea – matt3141

+1

'myCallback' debe ser global ... ¿verdad? –

Respuesta

16

Si utiliza su propia función, entonces usted tiene que declarar explícitamente como global. Por ejemplo:

window.myCallback = function(data) { 
    console.log(data); 
}; 

DEMO


Explicación

Cada función que debe ser llamado en respuesta a una solicitud JSONP exitoso debe ser global. jQuery está haciendo esto también. Esto se debe a que JSONP no es nada más que incluir un archivo JavaScript (generado dinámicamente (la mayoría de las veces)) con una etiqueta <script>, que solo contiene una llamada a la función. Como cada script se evalúa en alcance global, la función que se llama también debe ser global.

+0

u salvaste mi tiempo. gracias – jasper

+0

@Felix - Gracias, el ejemplo que me diste me ayudó mucho. +10; – Aviator

+0

¡funciona, gracias! – shaosh

-1

Retire sola cita del método llamado esto funcionará, por favor compruebe el código aquí,

var myCallback = function(data) { 
     console.log(data); 
    }; 

$.ajax({ 
    url: my_url, 
    type: 'GET', 
    dataType: 'jsonp', 
    jsonp: 'callback', 
    jsonpCallback: myCallback 
}); 

Prueba este fiddle

+0

Eso no funcionará. De la documentación: * "A partir de jQuery 1.5, también puede usar una función para esta configuración, en cuyo caso el valor de jsonpCallback está ** establecido en el valor de retorno de esa función **." *. Tu violín no está configurado correctamente, así que me pregunto qué debería demostrar. –

+0

Pero cuando probé está trabajando en la muestra También he añadido un violín que funciona, puedes consultar el violín que agregué –

+0

Como dije, no sé qué se supone que muestra tu demo. Solo muestra una alerta con 'undefined' ... que no prueba nada. Ni siquiera usaste la URL JSONP para el violín. Si echas un vistazo a las herramientas de desarrollador (pestaña Red, asumiendo Chrome) verás que no se realiza ninguna solicitud ... la llamada Ajax no se realiza. Para que quede claro: Te alerta aparece porque jQuery está llamando a la función que asigna a 'jsonpCallback' ** para obtener el nombre de devolución de llamada **, tal como lo indica la documentación. No se llama ** ** en respuesta a una llamada exitosa de Ajax. –

0

Por qué no simplemente:

$.getJSON(my_url, myCallback); 

esta función se encargará de alcance y se ve mucho más simple

+0

Esto no funcionará con Jsonp –

Cuestiones relacionadas