Usiamo ajaxError globale di jQuery() gestore per avvisare l'utente di eventuali guasti AJAX:jQuery ajaxError() incendi gestore se l'utente lascia pagina prima pagina finisce di caricare
$(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 finisca il caricamento. Ecco i passaggi per riprodurre l'errore:
- Visite dell'utente Pagina A, che include elementi caricati tramite AJAX.
- Elementi AJAX nella pagina A caricamento in corso.
- L'utente fa clic sul collegamento per visitare la pagina B prima degli Gli elementi AJAX nella pagina A hanno terminato il caricamento.
- la finestra di dialogo di errore appare brevemente prima che il browser reindirizza alla pagina B.
Qualsiasi idea di 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!";
}
};
L'approccio GMail è di gran lunga migliore! – TheVillageIdiot
beh sì, se devi avere un approccio generale generale, suppongo che sia quello che preferirei anch'io. anche se mi piacerebbe molto di più se un flag fosse passato alla funzione che effettua la chiamata ajax, determinando se la richiesta corrente era critica o meno. Ad esempio, se la richiesta è solo una sessione keep-alive, o il controllo di nuovi messaggi, o qualcosa del genere, si potrebbe desiderare di lasciarlo in silenzio. –
David, grazie per il suggerimento. Non ho ancora testato quali browser supportino onbeforeunload, ma finora funziona bene su FF 3.5. Ho anche aggiunto un ritardo di 3 secondi alla finestra di dialogo di errore (un suggerimento da un commento precedente che sembra essere cancellato ora.) – richardkmiller