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

Обрабатывать ajax-ошибку, когда пользователь нажимает кнопку обновления

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

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

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

4b9b3361

Ответ 1

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

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

$.ajax({
    /* ajax options omitted */
    error: function (xmlHttpRequest, textStatus, errorThrown) {
         if(xmlHttpRequest.readyState == 0 || xmlHttpRequest.status == 0) 
              return;  // it not really an error
         else
              // Do normal error handling
});

Ответ 2

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

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

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

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

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

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

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

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

и эти сообщения за пределами:

Ответ 3

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
            }
        }
    }
});

Ответ 4

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

Пример:

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

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

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

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

Ответ 5

Совместимая версия ответов 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
    }
});