Подтвердить что ты не робот

Как обращаться с ошибкой 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, похоже, больше не поддерживает его. Есть ли, например, конкретная ошибка, которая возвращается в этом случае?

Спасибо.

4b9b3361

Ответ 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/