Мы используем глобальный ajaxError jQuery () укладчик, чтобы предупредить пользователя о любых неудачах 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"); } }
});
});
К сожалению, этот глобальный ошибочный укладчик также стреляет, если пользователь оставляет страницу, прежде чем она закончит загружать. Вот шаги, чтобы воспроизвести ошибку:
Какая-либо идея, как мы можем заставить 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!";
}
};
Ну да, если пользователь переходит на другую страницу, xhr прерывается, что, по сути, является неудачным обменом данными. Решением было бы зарегистрировать слушателя для события onbeforeunload
и отвязать там ajaxError
, в основном говоря: пользователь собирается покинуть страницу, поэтому я не хочу получать информацию ошибок ajax, которые могут последовать за этим.
Однако некоторые сайты, например GMail, делают наоборот: если вы попытаетесь уйти со страницы, пока еще есть некоторые ожидающие запросы ajax, он выдает подсказку, в которой говорится у вас еще работают некоторые процессы, и пользователь может решить, оставаться ли на сайте до тех пор, пока запрос не будет завершен, или продолжить и уйти.