Обработчик jQuery ajaxError() срабатывает, если пользователь покидает страницу до завершения загрузки страницы
Мы используем обработчик jQuery global ajaxError() для предупреждения пользователей о любых сбоях AJAX:
$(document).ajaxError(function() {
$("There was a network or server error. Please try again later.").dialog({
title: "Error",
modal: true,
resizable: false,
buttons: { 'Ok': function() { (this).dialog("close"); } }
});
});
К сожалению, этот глобальный обработчик ошибок также срабатывает, если пользователь покидает страницу до завершения загрузки. Ниже приведены шаги по воспроизведению ошибки:
- Пользователь посещает страницу A, которая включает элементы, которые загружаются через AJAX.
- Элементы AJAX на странице Начало загрузки.
- Пользователь нажимает ссылку на страницу B до того, как элементы AJAX на странице A закончили загрузку.
- Откроется диалоговое окно с ошибкой перед переадресацией браузера на страницу B.
Любая идея, как мы можем заставить ajaxError() не запускаться, когда ошибка напрямую вызвана пользователем, посетившим новую страницу?
UPDATE: здесь мой код теперь, после включения предложений в комментарии:
// I added a 3 second delay to our error dialog, enough time
// for the user to leave for a new page:
$(document).ajaxError(function() {
setTimeout(my_error_handler, 3000);
});
// Warn user before leaving page if AJAX is still loading.
// Not sure I'll keep this:
$(document).ajaxStart(function() {
ajaxing = true;
});
$(document).ajaxStop(function() {
ajaxing = false;
});
window.onbeforeunload = function() {
if (typeof(ajaxing) != 'undefined' && ajaxing) {
return "Page elements are still loading!";
}
};
Ответы
Ответ 1
Хорошо, да, если пользователь перейдет на другую страницу, ххр прервется, что является, по сути, неудачным сообщением. Решением было бы зарегистрировать прослушиватель для события onbeforeunload
и отключить ajaxError
там, в основном говоря: пользователь собирается покинуть страницу, поэтому я не хочу получать информацию об ошибках ajax, которые могут последовать.
Некоторые сайты, как и GMail, делают наоборот: если вы попытаетесь перейти от страницы, пока еще есть ожидающие ожидающие запросы ajax, вы получите подсказку, в которой говорится, что у вас есть еще какие-то процессы, и позволяет пользователю решить, оставаться ли на сайте до тех пор, пока запрос не будет завершен, или чтобы продолжить и перемещаться.
Ответ 2
Основываясь на ответе Дэвида Хедлунда выше, здесь код, который работает для меня:
//enable global ajax error handling
$(document).ajaxError(function (event, request, settings) {
//your error handling code here
});
//user leaving page so ignore any unfinished ajax loads
$(window).bind('beforeunload', function () {
$(document).unbind('ajaxError');
});
Я получил спецификацию 'ajaxError'
в разделе комментариев документации jquery ajaxError. Мне пришлось привязать beforeunload
к $(window)
, чтобы поддерживать хром (IE работал отлично с документом). .ajaxError
не срабатывал, когда я привязывался к $(window)
, поэтому я нашел это решение для окна/документа.