2012-03-02 14 views
7

Estoy haciendo un complemento de autosugestión (autocompletar) simple con jQuery. Lamentablemente tengo que usar jsonp. Está bien y funciona, pero cuando cancelo la solicitud arrojará un error.Anulando la solicitud JQuery JSONP lanzará el error

Uncaught TypeError: Property 'jQuery171036404498340561986_1330693563756' of object [object Window] is not a function 

existen códigos

if(xhr) {xhr.abort()}; 
xhr = $.ajax({ 
    url: "someurl/getmedata", 
    type: 'get', 
    dataType: 'jsonp', 
    data: {q: "query"}, 
    success: function(results) {}, 
    error: function() {} 
}) 

modo clásico con JSON, XML u otra solicitud funciona bien.

¿Alguna sugerencia?

+0

Esta pregunta es un duplicado de la [petición de aborto JSONP ajax con jQuery] anterior (http://stackoverflow.com/questions/6472509/abort-jsonp-ajax- request-with-jquery), aunque esa pregunta nunca fue respondida correctamente y esta fue. –

Respuesta

14

JSONP hace no uso XMLHTTPRequest pero en realidad crea una etiqueta <script> dentro del documento para poder realizar las solicitudes entre dominios.

Simplemente no puede cancelar las solicitudes JSONP.

Se afirma en la $.ajax() documentación:

Algunos tipos de peticiones Ajax, como JSONP y entre dominios peticiones GET, no utilizan XHR; en esos casos, los parámetros XMLHttpRequest y textStatus pasados ​​a la devolución de llamada no están definidos.

En cuanto a jQuery 1.5 +, previamente fue devolver el objeto XHR de $ .ajax(), ahora se devuelve un objeto jqXHR superconjunto que encapsula el objeto XHR.

Cuando el mecanismo de transporte es algo distinto de XMLHttpRequest (por ejemplo, una etiqueta de script para una solicitud JSONP) el objeto jqXHR simula la funcionalidad XHR nativa siempre que sea posible.

Devuelve un objeto pero algunas funcionalidades no están realmente disponibles, como .abort().


El plugin jQuery-JSONP parece ofrecer la posibilidad de abortar manualmente solicitudes JSONP. No lo he usado, pero vale la pena intentarlo.

+0

Ok consígalo. ¿Hay alguna otra manera de manejar la función que falta en el contexto global? – Schovi

+1

He agregado un enlace al complemento [jquery-jsonp] (http://code.google.com/p/jquery-jsonp/) que parece ofrecer la posibilidad de cancelar solicitudes jsonp. –

+0

Gracias. ¡Voy a intentarlo! – Schovi

4

jQuery usa una etiqueta <script> para implementar JSONP. No puede cancelar la carga de etiquetas de script.

0

En primer lugar, utilice un poco de lógica de secuencia. Esto asegurará que su última solicitud prevalezca sobre las anteriores. Aquí tienes un example.

También, usted puede tomar ventaja de estos ajustes $.ajax:

timeout: fijar un límite de tiempo por solicitud y prevenir las solicitudes fallan en silencio.

beforeSend: validar algunas condiciones antes de realizar la llamada. Complementa la secuencia de ayudante.

As of jQuery 1.5, the beforeSend option will be called regardless of the type of request. 

Ejemplo:

function updateResults() { 

    // Init counter & record current request 
    if (!window.reqSeq) window.reqSeq = 0; 
    window.reqSeq +=1; 
    var thisRequest = window.reqSeq; 

    $.ajax({ 
    url: [..], 
    crossDomain: true, 
    contentType: "application/json", 
    dataType: 'jsonp', 
    timeout: 5000, // give 5 seconds of margin 
    data: { [..] }, 
    beforeSend: function() { 
     if(thisRequest < window.reqSeq) { 
     return false; 
     } 
    }, 
    success: function(data, textStatus, jqXHR) { 
     if(thisRequest < window.reqSeq) { 
     return; 
     } 
     else print(data); 
    }, 
    error: function(jqXHR, textStatus, errorThrown) { 
     // it'll be called on timeout (error) and beforeSend (abort) 
     print(textStatus); 
    } 
    }); 

} 
Cuestiones relacionadas