Мы используем глобальный обработчик jjuery 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 на странице A начинают загрузку.
- Пользователь нажимает ссылку, чтобы посетить страницу B до того, как Элементы AJAX на странице A завершат загрузку.
- Диалоговое окно ошибки появляется на короткое время, прежде чем браузер перенаправляет на страницу B.
Есть идеи, как заставить ajaxError () не срабатывать, когда ошибка вызвана непосредственно пользователем, посещающим новую страницу?
ОБНОВЛЕНИЕ: Вот мой код сейчас, после включения предложений в комментариях:
// 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!";
}
};