Подтвердить что ты не робот

Обработчик 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!";
    }
};
4b9b3361

Ответ 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), поэтому я нашел это решение для окна/документа.