Pregunta Cómo manejar jQuery ajax post error al navegar fuera de una página


¿Hay alguna forma de manejar el error desde una solicitud de Ajax dentro de JQuery de manera que cuando el usuario navega fuera de la página, se ignora el error resultante?

$(document).ready(function() {
 $.ajax( {
    url:'/server/url/',
    type: 'POST',
    data: {some..data},
    success:function(response) { do stuff with response },
    error: function(xhr, textStatus, errorThrown) {
           // Don't raise this alert if user has navigated away from the page
           alert('error');
    }
});

Tengo curiosidad si alguien sabe de una manera limpia de manejar esto? Sé que podrías crear algo de lógica en un $(window).bind("beforeunload", function(){}) método pero preferiría si hubiera una manera de manejar la situación sin hacer esto, ya que Chrome parece que ya no lo admite. ¿Hay, por ejemplo, un error específico que se devuelve en este caso?

Gracias.


32
2018-02-10 14:06


origen


Respuestas:


Parece que la respuesta a esto es examinar el jqXHR.status. los XMLHttpRequest spec describe estos pasos para establecer el estado:

los estado El atributo debe devolver el resultado de ejecutar estos pasos:

  1. Si el estado es INESTABLE o ABIERTO, devuelva 0 y finalice estos pasos.

  2. Si se establece el indicador de error, devuelva 0 y finalice estos pasos.

  3. Devuelve el código de estado HTTP.1

NOTA también: El indicador de error indica algún tipo de error de red o solicitud de aborto. Inicialmente no está configurado y se usa durante el estado HECHO.

Por lo que entiendo, esta verificación de código debería solucionar el problema:

    if (xhr.status == 0)
        alert('error');

1https://web.archive.org/web/20120204040047/http://www.w3.org/TR/XMLHttpRequest/#the-status-attribute


17
2018-02-10 15:29



Verificar el estado no funcionó para mí, pero

// Ignore incomplete requests, likely due to navigating away from the page
if (jqXHR.readyState < 4) {
    return true;
} 

en el controlador de errores lo hizo (4 está HECHO).


12
2018-02-28 22:29



He tenido que manejar este problema también un par de veces.

Yo recomendaría atar a la $(window).unload evento, estableciendo alguna variable en algún lugar, como en su espacio de nombres (App.unloading = true) y luego probarlo en devoluciones de llamada de error ajax.

Ver http://api.jquery.com/unload/


2
2018-02-10 15:02