Wir verwenden jQuery globalen ajaxError() -Prozedur die Nutzer über AJAX Ausfälle aufmerksam zu machen:jQuery ajaxError() -Prozedur feuert, wenn der Benutzer verläßt Seite vor Seite fertig geladen
$(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"); } }
});
});
Leider ist diese globale Fehlerbehandlung auch ausgelöst, wenn Der Benutzer verlässt die Seite, bevor das Laden beendet ist. Hier sind die Schritte, um den Fehler zu reproduzieren:
- Benutzer besucht Seite A, die Elemente enthält, die über AJAX laden.
- AJAX-Elemente auf Seite A beginnen zu laden.
- Benutzer klickt auf den Link, um die Seite zu besuchen B vor AJAX-Elemente auf Seite A sind fertig geladen.
- Das Dialogfeld Fehler erscheint kurz bevor der Browser
Jede Idee zu Seite B. umleitet, wie wir ajaxError bekommen können() nicht auslösen, wenn der Fehler direkt durch den Benutzer verursacht wird, eine neue Seite zu besuchen?
UPDATE: Hier ist mein Code jetzt, nachdem die Vorschläge in den Kommentaren mit eingebauten
// 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!";
}
};
GMail Ansatz ist viel besser! – TheVillageIdiot
Nun, ja, wenn Sie einen allgemeinen Ansatz haben müssen, nehme ich an, dass ich das auch bevorzuge. obwohl ich es viel lieber hätte, wenn ein Flag an die Funktion übergeben wurde, die den Ajax-Aufruf durchführt, um zu bestimmen, ob die aktuelle Anfrage kritisch war oder nicht. d. h., wenn die Anfrage nur eine Session-Keep-Alive-Sitzung oder eine Überprüfung auf neue Nachrichten oder etwas anderes ist, möchten Sie dies möglicherweise stillschweigend abbrechen lassen. –
David, danke für den Vorschlag. Ich habe noch nicht getestet, welche Browser onbeforeunload unterstützen, aber es funktioniert bisher gut auf FF 3.5. Ich fügte dem Fehlerdialog auch eine Verzögerung von 3 Sekunden hinzu (ein Vorschlag aus einem früheren Kommentar, der jetzt anscheinend gelöscht wird.) – richardkmiller