Обрабатывать ajax-ошибку, когда пользователь нажимает кнопку обновления
Я извиняюсь, если это то, что я должен уметь искать. все термины, которые я хотел, были перегружены.
вот моя проблема: когда я открываю страницу, она запускает целую серию вызовов ajax. если я затем нажимаю Shift + Refresh, все эти вызовы ajax считаются ошибками и отображаются их диалоговые окна с сообщением об ошибках до перезагрузки всей страницы.
поэтому ошибка запускается клиентом - все равно я могу узнать, так ли это, поэтому я могу игнорировать его? например, в xmlhttprequest или в функции ajax (я использую jquery btw)
Ответы
Ответ 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
}
});