jQuery ajaxError () укладчик стреляет, если пользователь оставляет страницу, прежде чем страница закончит загружать

Мы используем глобальный 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"); } }  
    });  
});  

К сожалению, этот глобальный ошибочный укладчик также стреляет, если пользователь оставляет страницу, прежде чем она закончит загружать. Вот шаги, чтобы воспроизвести ошибку:

  1. Пользователь навещает Пэйджа, который включает элементы тот груз через AJAX.
  2. Элементы AJAX на Пэйдже начинают загружать.
  3. Пользователь нажимает на ссылку, чтобы посетить Страницу B, прежде чем элементы AJAX на Пэйдже закончили загружать.
  4. Ошибочное диалоговое окно появляется кратко перед перенаправлениями браузера к Странице 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!";
    }
};
25
задан richardkmiller 16 December 2009 в 07:28
поделиться

1 ответ

Ну да, если пользователь переходит на другую страницу, xhr прерывается, что, по сути, является неудачным обменом данными. Решением было бы зарегистрировать слушателя для события onbeforeunload и отвязать там ajaxError , в основном говоря: пользователь собирается покинуть страницу, поэтому я не хочу получать информацию ошибок ajax, которые могут последовать за этим.

Однако некоторые сайты, например GMail, делают наоборот: если вы попытаетесь уйти со страницы, пока еще есть некоторые ожидающие запросы ajax, он выдает подсказку, в которой говорится у вас еще работают некоторые процессы, и пользователь может решить, оставаться ли на сайте до тех пор, пока запрос не будет завершен, или продолжить и уйти.

16
ответ дан 28 November 2019 в 21:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: