Dzisiaj miałem do czynienia z tym samym przypadkiem użycia. Aplikacja, nad którą pracuję, ma te długotrwałe wywołania ajax, które mogą zostać przerwane przez 1) nawigację użytkownika lub 2) tymczasową awarię połączenia / serwera. Chcę, aby program obsługi błędów działał tylko w przypadku awarii połączenia / serwera, a nie dla użytkownika odchodzącego.
Najpierw wypróbowałem odpowiedź Alastaira Pittsa, ale nie zadziałała, ponieważ zarówno przerwane żądania, jak i błąd połączenia ustawiają kod stanu i readyState na 0. Następnie wypróbowałem odpowiedź sieppl; również nie zadziałało, ponieważ w obu przypadkach nie ma odpowiedzi, a więc nie ma nagłówka.
Jedynym rozwiązaniem, które zadziałało, jest ustawienie nasłuchiwania dla window.onbeforeunload, które ustawia zmienną globalną wskazującą, że strona została wyładowana. Procedura obsługi błędów może następnie sprawdzić i wywołać procedurę obsługi błędów tylko wtedy, gdy strona nie została wyładowana.
var globalVars = {unloaded:false};
$(window).bind('beforeunload', function(){
globalVars.unloaded = true;
});
...
$.ajax({
error: function(jqXHR,status,error){
if (globalVars.unloaded)
return;
}
});