2009-03-01 18 views
12

Gracias por leer.jQuery: ¿Anula automáticamente AjaxRequests en la página Descargar?

He notado que si tengo una página que tiene una o más solicitudes ajax abiertas, y hago clic en un enlace para salir de una página, o la actualizo, esperará a que las solicitudes ajax se completen antes de la descarga.

Esto no suele ser un problema, pero si la solicitud tarda un tiempo, puede ser.

Busco algo como:

$(window).bind("beforeunload", function() {AjaxRequest.abort();}); 

para cancelar automáticamente las solicitudes antes de descarga, pero no del todo seguro de cómo encontrar las peticiones Ajax. ¿Estarían bajo la ventana en alguna parte?

Respuesta

8

El método jQuery $.ajax() devuelve el objeto XMLHttpRequest. Esto significa que puede aplicar métodos estándar en el objeto, como abort().

Para descargar, utilice el método de evento jQuery unload incorporado.

var myajax = $.ajax(...); 
$(window).unload(function() { myajax.abort(); }); 
+0

estoy recibiendo un error de js "myajax.abort" no es una función (jquery 1.3.2) ¿Alguien ha domado al "aborto bestia"? – taber

+0

editar: creo que es porque estaba usando ".responseText" al final de mi llamada $ .ajax (...). saqué .responseText y no hay ningún error ahora. Hurra. – taber

+0

el método 'download' ha sido eliminado en Jquery:/ – Badiparmagi

1

cree que necesita window.onunload caso más AjaxRequestX = $ .get (...) para cada solicitud, tal vez mantener los objetos en la matriz y pasar por ellos en la descarga.

4

acabo de tener este problema, que estaba haciendo un largo bucle en PHP que estaba siendo llamado desde $ .ajax. Mi solución fue agregar session_write_close(); antes del ciclo largo.

Mi teoría es que Chrome solicita la siguiente página antes de cancelar cualquier solicitud de fondo de ajax. Si su solicitud de Ajax es la misma _SESSION que la página de la que está navegando desde Y hacia, entonces tiene un punto muerto antes incluso de que se golpee su primera línea de código PHP.

+1

Tu respuesta ha resuelto mi problema, ¡muchas gracias! –

1

Debe persistir todo lo que solicite ajax y cuando se vuelva a cargar la página anule todas las solicitudes. Muestra

var _requests = []; 

var _abortAllRequests = function() { 
    $(_requests).each(function (i, xhr) { xhr.abort(); }); 

    _requests = []; 
} 

$(window).on("beforeunload", function() { 
    _abortAllRequests(); 
}); 

en algún lugar de su código

_requests.push($.ajax(...)) 

Además usted puede hacer estallar las solicitudes realiza utilizando $ .ajaxSetup con eventos ajaxStart ajaxStop, pero su hasta usted

5

El siguiente código se prueba y se aborta todas las solicitudes sobresalientes de jQuery ajax en la página se descargan en Chrome, pero Edge y IE las usan también sin errores.

poner lo siguiente como la primera jQuery ready manejador:

$(onPageLoaded) 

y poner esto en algún lugar accesible:

function onPageLoaded() { 
    var jqxhrs = []; 

    $(window).bind("beforeunload", function (event) { 
     $.each(jqxhrs, function (idx, jqxhr) { 
      if (jqxhr) 
       jqxhr.abort(); 
     }); 
    }); 

    function registerJqxhr(event, jqxhr, settings) { 
     jqxhrs.push(jqxhr); 
    } 

    function unregisterJqxhr(event, jqxhr, settings) { 
     var idx = $.inArray(jqxhr, jqxhrs); 
     jqxhrs.splice(idx, 1); 
    } 

    $(document).ajaxSend(registerJqxhr); 
    $(document).ajaxComplete(unregisterJqxhr); 
}; 
+0

Esto funciona genial. Su función 'error' de ajax todavía se invocará para el aborto, así que asegúrese de probar' textStatus! = 'Abort'' si está registrando errores de consola, etc ... – dhc

+0

He agregado la última versión de este . El código original tenía un ciclo while() y solo salía cuando no quedaban objetos xhr. Sin embargo, esto encontraría nulas entradas xhr en la lista, y sería un error en algunos casos. – yourpublicdisplayname

Cuestiones relacionadas