jQuery ajaxError () incendi gestore se l'utente lascia pagina prima pagina termine del caricamento
Domanda
Usiamo gestore globale di jQuery ajaxError () per avvisare l'utente di eventuali guasti 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"); } }
});
});
Purtroppo, questo gestore errori globale spara anche se l'utente lascia la pagina prima che venga completata carico. Ecco i passaggi per riprodurre l'errore:
- L'utente visita Pagina A, che include elementi che caricano tramite la tecnologia AJAX.
- elementi AJAX a pagina A iniziano carico.
- L'utente fa clic dei collegamenti a visitare la pagina B prima di carico AJAX elementi a pagina A hanno terminato.
- La finestra di dialogo di errore appare brevemente prima che il browser reindirizza alla pagina B.
Qualche idea su come possiamo ottenere ajaxError () non innescare quando l'errore è direttamente causato da l'utente che visita una nuova pagina?
UPDATE: Ecco il mio codice ora, dopo che incorpora i suggerimenti nei commenti:
// 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!";
}
};
Soluzione
Ebbene sì, se l'utente passa a un'altra pagina, il XHR sarà abortire, che è, in effetti, una comunicazione senza successo. Una soluzione potrebbe essere quella di registrare un listener per l'evento onbeforeunload
, e ajaxError
unbind lì, sostanzialmente dicendo:. L'utente è in procinto di lasciare la pagina, in modo da non voglio essere informato degli errori Ajax che possano derivare
Alcuni siti, anche se, come GMail, fanno il contrario: se si prova a navigare lontano dalla pagina mentre ci sono ancora alcune richieste Ajax in sospeso, ti dà un prompt che dice che hai alcuni processi ancora in esecuzione , e consente all'utente di decidere se rimanere sul sito fino a quando la richiesta è finito, o per andare avanti e navigare via.
Altri suggerimenti
In base alla risposta di David Hedlund sopra ecco il codice che funziona per me:
//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');
});
Ho avuto la spec 'ajaxError'
dalla sezione commenti di jquery ajaxError documentazione . Ho dovuto legarsi beforeunload
a $(window)
al fine di sostenere cromo (IE stava lavorando bene con il documento). .ajaxError
non è scattato quando sono stato il legame con $(window)
quindi questo è il motivo per cui ho questa soluzione finestra / documento.