Tuve que lidiar con el mismo caso de uso hoy. La aplicación en la que estoy trabajando tiene estas llamadas ajax de larga duración que pueden ser interrumpidas por 1) el usuario navega o 2) algún tipo de conexión temporal / falla del servidor. Quiero que el controlador de errores se ejecute solo para la conexión / falla del servidor y no para el usuario que se aleja.
Primero probé la respuesta de Alastair Pitts, pero no funcionó porque tanto las solicitudes abortadas como la falla de conexión establecieron el código de estado y readyState en 0. Luego, probé la respuesta de sieppl; tampoco funcionó porque en ambos casos, no se da respuesta, por lo tanto no hay encabezado.
La única solución que me funcionó es configurar un oyente para window.onbeforeunload, que establece una variable global para indicar que la página se ha descargado. El controlador de errores puede verificar y solo llamar al controlador de errores solo si la página no se ha descargado.
var globalVars = {unloaded:false};
$(window).bind('beforeunload', function(){
globalVars.unloaded = true;
});
...
$.ajax({
error: function(jqXHR,status,error){
if (globalVars.unloaded)
return;
}
});