Как обращаться с ошибкой jQuery ajax post при переходе от страницы
Есть ли способ обработать ошибку из запроса ajax в JQuery, так что, когда пользователь переходит от страницы, результирующая ошибка игнорируется?
$(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');
}
});
Мне любопытно, знает ли кто-нибудь о чистом способе справиться с этим? Я знаю, что вы могли бы создать некоторую логику в методе $(window).bind("beforeunload", function(){})
, но я предпочел бы, если бы был способ справиться с ситуацией, не делая этого, поскольку Chrome, похоже, больше не поддерживает его. Есть ли, например, конкретная ошибка, которая возвращается в этом случае?
Спасибо.
Ответы
Ответ 1
Похоже, что ответ на это - проверить jqXHR.status. спецификация XMLHttpRequest описывает эти шаги, чтобы установить статус:
Атрибут статус должен возвращать результат выполнения следующих шагов:
-
Если состояние UNSENT или OPENED, верните 0 и завершите эти шаги.
-
Если флаг ошибки установлен, верните 0 и завершите эти шаги.
-
Возвращает код состояния HTTP. 1
ПРИМЕЧАНИЕ:
Флаг ошибки указывает на некоторый тип сетевой ошибки или запрос абортов. Он изначально отключен и используется во время состояния DONE.
Из того, что я понимаю, эта проверка кода должна исправить проблему:
if (xhr.status == 0)
alert('error');
1https://web.archive.org/web/20120204040047/http://www.w3.org/TR/XMLHttpRequest/#the-status-attribute
Ответ 2
Проверка статуса не работала для меня, но
// Ignore incomplete requests, likely due to navigating away from the page
if (jqXHR.readyState < 4) {
return true;
}
в обработчике ошибок (4 - DONE).
Ответ 3
Мне пришлось обрабатывать эту проблему пару раз.
Я бы рекомендовал привязать к событию $(window).unload
, установив где-то какую-то переменную, например, в вашем пространстве имен (App.unloading = true
), а затем тестировал ее в обратных вызовах ajax.
См. http://api.jquery.com/unload/