22 Stimmen

Kann ich verhindern, dass window.onbeforeunload aufgerufen wird, wenn ich einen AJAX-Aufruf tätige

Ich habe ein AJAX-basiertes Grid Control.

Wir haken uns in das window.onbeforeunload-Ereignis ein, um zu prüfen, ob sie ungespeicherte Daten haben, und wenn ja, zeigen wir ihnen eine Meldung an: "Sind Sie sicher, dass Sie weg navigieren wollen...Sie haben ungespeicherte Daten...".

All das ist gut.

Aber AJAX-Aufrufe auch auslösen window.onbeforeunload und so, wenn das Raster hat ungespeicherte Daten und wir machen einen AJAX-Aufruf (z. B. eine Zeile in einem anderen Raster zu löschen) der Benutzer erhält die "Sind Sie sicher, dass Sie weg navigieren möchten ... Sie haben ungespeicherte Daten ..." Nachricht, die nicht gut ist.

Ist es möglich, das Ereignis onbeforeunload für AJAX-Aufrufe zu unterdrücken? Oder ist es möglich, zu erkennen, dass ein Aufruf est einen AJAX-Aufruf? Sonst müssen wir hacken gehen!

Danke

0voto

Shawn Punkte 18777

Das funktioniert tatsächlich:

 OnClientClick="eval(this.href);return false"

0voto

Ein Workaround für dieses Problem ist, submitFunction() auf Click-Ereignis von Hyperlink-Tag mit Jquery aufrufen und entfernen Sie das href-Attribut aus dem Hyperlink.

0voto

Ngalam City Punkte 112

Das ist nicht möglich, denn es gibt keine Möglichkeit, herauszufinden, ob die Aktualisierungsschaltfläche des Browsers gedrückt wurde.

0voto

Jon Reedholm Punkte 51

Ich verwende kein AJAX, wollte aber dennoch verhindern, dass die Seite mit ungespeicherten Änderungen verlassen wird. Ich habe die meisten der vorherigen Vorschläge ausprobiert, einschließlich navigateAway. Keiner von ihnen funktionierte mit IE 8. NavigateAway gab immer eine Länge von 0 zurück.

Ich fand einen Blog auf, die Lösung über die Verwendung von Klasse als ID in Tag und dann Einstellung Boolesche auf der Grundlage dieser hatte. Ich habe das ausprobiert, aber es funktioniert nicht, weil .NET bei der Ausgabe des HTML-Tags das Eingabe-Tag in ein span-Tag mit der darin deklarierten Klasse einwickelt. Meine endgültige Lösung bestand darin, das Wort Ignore in den ID-Namen des Tags einzufügen. Um zu verhindern, dass onbeforeunload aufgerufen wird, bevor der Klick durch den Code, der den Booleschen Wert setzt, eingefangen wird, muss man außerdem asp:Button oder asp:Input verwenden. Schließlich erzwingt asp (von VS IDE), dass der Startname der Typ des Steuerelements ist; ID="Button_Save". Die Verwendung von asp: Tags verhindert auch, dass onbeforeunload zweimal aufgerufen wird.

<script type="text/javascript" language="javascript">
 var stuffchanged = false
 var ignorenavigate = false

  $(document).ready(function () {

    //Detect whether the event source has "nonavigate" class specified
    $("a,input,img,checkbox,button").click(function () {
        var str = $(this).attr("ID");
        ignorenavigate = str.search("Ignore") > 0;
    });

});

window.onbeforeunload = confirmExit;
function confirmExit() {
    if (stuffchanged && !ignorenavigate) {
        return "You have attempted to leave this page with unsaved changes.  If you have made any changes to the fields without " +
    "clicking the Save button, your changes will be lost.  Are you sure you want to exit this page?";
    }  

}

  function textchanged() {
     stuffchanged = true;
  }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X