обрабатывать ошибку AJAX, когда пользователь нажимает обновить - PullRequest
40 голосов
/ 31 марта 2009

Я прошу прощения, если это то, что я должен быть в состоянии найти. все термины, которые я хотел, были перегружены ..

вот моя проблема: когда я открываю страницу, она запускает целую серию вызовов ajax. если я затем нажимаю Shift + Refresh, все эти вызовы ajax считаются ошибками и показывают их диалоги с сообщениями об ошибках до перезагрузки всей страницы.

так что ошибка вызывается клиентом - могу ли я узнать, так ли это, и проигнорировать ее? например, в xmlhttprequest или в функции ajax (я использую jquery btw)

Ответы [ 5 ]

37 голосов
/ 11 августа 2013

Есть несколько предложенных подходов для обнаружения этого:

  • Некоторые предложили использовать обработчик beforeunload для установки логического флага, чтобы обработчик ошибок мог знать, что страница выгружается (см. Список связанных / дублированных сообщений ниже). Это здорово, за исключением того, что мобильный Safari на iOS не поддерживает событие beforeunload .

  • Сачиндра предложил подход, при котором вместо немедленного срабатывания функции ошибки она задерживается на секунду в setTimeout(..., 1000). Таким образом, есть большая вероятность, что страница действительно исчезнет к тому времени, когда будет вызван обработчик ошибок. «Хороший шанс», то есть. Бьюсь об заклад, если у меня есть огромная страница, например, много <input> с, разгрузка может занять более 1 секунды, и, возможно, обработчик ошибок все равно сработает.

Поэтому я предлагаю комбинацию , надежно обнаруживающую beforeunload поддержку и если beforeunload не поддерживается ( кашель iPad / iPhone кашель ) вернуться к Задержка Сачиндры.

См. Полное решение с обнаружением beforeunload и все это jsfiddle .

Похоже, что ситуация для немного лучше для jQuery 2.x, чем для 1.x , но 2.x также выглядит немного странно, и поэтому я все еще нахожу это предположение разумным.

P.S .: Были также предложения по проверке некоторых полей в объекте XHR / jqXHR. ( Здесь и здесь ). Я не сталкивался с комбинацией, которая могла бы различить навигацию пользователя и перезапуск веб-сервера во время продолжительного вызова AJAX, и поэтому я не нашел этот подход полезным для меня.

Это действительно также ответ на следующие / дублированные вопросы переполнения стека:

и эти посты вне переполнения стека:

19 голосов
/ 13 августа 2009

[это изменение из предыдущего ответа, в котором были нерешенные вопросы, которые я с тех пор решил]

jQuery генерирует событие ошибки, когда пользователь уходит со страницы, обновляя его, щелкая ссылку или изменяя URL-адрес в браузере. Вы можете обнаружить эти типы ошибок, реализовав обработчик ошибок для вызова ajax и проверив объект xmlHttpRequest:

$.ajax({
    /* ajax options omitted */
    error: function (xmlHttpRequest, textStatus, errorThrown) {
         if(xmlHttpRequest.readyState == 0 || xmlHttpRequest.status == 0) 
              return;  // it's not really an error
         else
              // Do normal error handling
});
6 голосов
/ 20 августа 2012
var isPageBeingRefreshed = false;

window.onbeforeunload = function() {
    isPageBeingRefreshed = true;
};

$.ajax({
    error: function (xhr, type, errorThrown) {
        if (!xhr.getAllResponseHeaders()) {
            xhr.abort();
            if (isPageBeingRefreshed) {
                return; // not an error
            }
        }
    }
});
2 голосов
/ 31 июля 2014

Комбинированная версия nisanth074 и Peter V. Mørch ответов, которые помогли мне.

Пример:

var isPageBeingRefreshed = false;

$(window).on('beforeunload', function(){

    isPageBeingRefreshed = true;
});

$.ajax({

    // Standart AJAX settings

}).error(function(){

    if (!isPageBeingRefreshed) {

        // Displaying error message
    }
});
2 голосов
/ 26 марта 2013

Вышеуказанные методы не работают для периодически обновляемых страниц (например, каждые полсекунды). Я выяснил, что ошибки, вызванной обновлением страницы, можно избежать, если на некоторое время задержать процесс обработки ошибок.

Пример:

$.ajax(...)
.success(...)
.error(function(jqXHR) {
setTimeout(function() {
  // error showing process
}, 1000);
});

В дополнение к этому

window.onbeforeunload = function () {// остановить вызовы ajax}

событие может использоваться для менее частого обновления вызовов ajax.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...