JQuery ajaxError () feuert mit Feuert, wenn die Benutzerseite die Seite vor der Seite geladen werden

StackOverflow https://stackoverflow.com/questions/1906023

  •  19-09-2019
  •  | 
  •  

Frage

Wir verwenden Jquerys globaler AjaxError () -Handler, um den Benutzer über alle Ajax -Fehler aufmerksam zu machen:

$(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 feuert dieser globale Fehlerhandler auch, wenn der Benutzer die Seite verlässt, bevor er das Laden beendet. Hier sind die Schritte, um den Fehler zu reproduzieren:

  1. Benutzer besucht Seite A, die Elemente enthält, die über AJAX geladen werden.
  2. Ajax -Elemente auf Seite A Beginnen Sie mit dem Laden.
  3. Der Benutzer klickt auf Link, um Seite B zu besuchen Vor Ajax -Elemente auf Seite A haben das Laden beendet.
  4. Das Fehlerdialogfeld Fehler wird kurz angezeigt, bevor der Browser auf Seite B weiterleitet

Gibt es eine Idee, wie wir AjaxError () nicht auslösen können, wenn der Fehler direkt durch den Benutzer verursacht wird, der eine neue Seite besucht?

UPDATE: Hier ist jetzt mein Code, nachdem die Vorschläge in die Kommentare aufgenommen wurden:

// 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!";
    }
};
War es hilfreich?

Lösung

Nun ja, wenn der Benutzer zu einer anderen Seite navigiert, wird der XHR abbrechen, was tatsächlich eine erfolglose Kommunikation ist. Eine Lösung wäre, einen Hörer für die zu registrieren onbeforeunload Ereignis und ungebindend ajaxError Dort sagt im Grunde genommen gesagt: Der Benutzer ist kurz davor, die Seite zu verlassen, daher möchte ich nicht über die AJAX -Fehler informiert werden, die möglicherweise folgen.

Einige Websites machen jedoch wie Google Mail umgekehrt: Wenn Sie versuchen, von der Seite weg zu navigieren, während immer noch einige Ajax -Anfragen angemeldet sind, gibt es Ihnen eine Eingabeaufforderung, die besagt, dass Sie noch einige Prozesse ausgeführt haben, und los uns Der Benutzer entscheidet, ob er auf der Website bleibt, bis die Anfrage beendet ist, oder navigieren weiter.

Andere Tipps

Basierend auf David Hedlunds Antwort oben ist hier der Code, der für mich funktioniert:

//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');
});

ich habe das 'ajaxError' Spezifikation aus dem Kommentarbereich von JQuery AjaxError -Dokumentation. Ich musste binden beforeunload zu $(window) Um Chrome zu unterstützen (IE arbeitete gut mit Dokument). .ajaxError feuerte nicht, als ich bindend an war $(window) Deshalb habe ich diese Fenster-/Dokumentlösung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top