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

30voto

cygro Punkte 301

Wenn Sie Ihr Postback durch einen Hyperlink auslösen wollen, gibt es eine einfache Lösung: Anstelle von

<a href="javascript:submitFunction();">Submit</a>

ou

<a href="javascript:;" onclick="submitFunction();">Submit</a>

verwenden Sie einfach diesen Code:

<a href="#" onclick="submitFunction();">Submit</a>

Es scheint, dass der IE das Ereignis onbeforeunload auslöst, wenn der Inhalt des href-Attributs eines Hyperlinks nicht die aktuelle Seite ist (was das scharfe Zeichen anzeigt).

5voto

Arpit Punkte 51

Ich habe etwas Ähnliches gemacht:

innerhalb des Body-Tags:

  var allowConfirm = true;

  window.onbeforeunload = confirmExit;
  function confirmExit()
  {
    if(allowConfirm)
        return "Are you sure you want to navigate away from this page?";
    else
        allowConfirm = true;
  }

Wenn ich mich abmelde, rufe ich dieses Skript auf:

allowConfirm = false; return window.location.href;

2voto

Luca Matteis Punkte 28819

Das ist wirklich seltsam, sind Sie sicher, dass Ihr Ajax-Aufruf nicht einen neuen Link lädt?

Lesen Sie unbedingt diese einschlägige Spezifikation: onbeforeunload-Spezifikation

Prüfen Sie, ob der Ajax-Aufruf möglicherweise eine der Aktionen auslöst, die in der Zum Aufrufen Tisch.

2voto

Manuel Parma Punkte 21

Im Falle von IE6 oder href können Sie die Postback-Funktion einhaken. d.h.: wenn die Postback-Funktion WebForm_DoPostBackWithOptions und mit Jquery , fügen Sie den folgenden Code zum obigen Code hinzu

var DoPostBackWithOptionsHook = null;

$(document).ready(function(){
  DoPostBackWithOptionsHook = WebForm_DoPostBackWithOptions;
  WebForm_DoPostBackWithOptions = WebForm_DoPostBackWithOptionsHook;
}

function WebForm_DoPostBackWithOptionsHook(options) {
    var navigateAwayFlag = $("input[id*='navigateAwayValue']");
       if (navigateAwayFlag.length > 0) {
           navigateAwayFlag[0].value = "false"; }

    return DoPostBackWithOptionsHook(options)
}

0voto

Grank Punkte 5173

Wenn Sie über ASP.NET AJAX partielle Postbacks sprechen, dann bin ich heute auch auf dieses Verhalten gestoßen und habe genau das Gleiche getan. (Wenn Sie nicht sind, ignorieren Sie meinen Beitrag vollständig).

Nach meiner bisherigen Erfahrung scheint es so, als ob Ihr partieller Postback durch eine Eingabe wird onbeforeunload während eines partiellen Postbacks nicht ausgelöst, aber wenn der partielle Postback durch eine Hyperlink wird es. Es scheint, als ob der Browser davon ausgeht, dass Sie weg navigieren, wenn Sie auf etwas in einem Anker-Tag klicken (nur in IE und FireFox getestet, aber ja).

Ob die Seite ein bestimmtes verstecktes Feld hat oder nicht, ist bereits das, was ich benutzte, um clientseitig zu bestimmen, wann es angemessen ist, die Weg-Navigations-Warnung zu zeigen, also konnte ich dies sehr einfach beheben, indem ich eine Überprüfung des Wertes des versteckten Feldes zu meiner if-Bedingung onbeforeunload hinzufügte und mich in die Handler BeginRequest und EndRequest des PageRequestManagers einklinkte, um den Wert zu setzen. Das effektiv deaktiviert die Warnung während partielle Postbacks. Sie könnten kompliziertere Logik hier hinzufügen, wenn es mehr spezifische Dinge, die Sie überprüfen wollten.

Hier ist ein stark vereinfachtes Codebeispiel. (sorry, wenn ich pared und zensiert bis zu dem Punkt, wo es nicht funktioniert, aber es sollte Ihnen eine Idee geben).

window.onbeforeunload = checkNavigateAway;

Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(onBeginRequest);
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(onEndRequest);

function onBeginRequest(sender, args) {
    var navigateAwayFlag = $("input[id*='navigateAwayValue']");
    if (navigateAwayFlag.length > 0) {
        navigateAwayFlag[0].value = "false";
    }
}

function onEndRequest(sender, args) {
    var navigateAwayFlag = $("input[id*='navigateAwayValue']");
    if (navigateAwayFlag.length > 0) {
        navigateAwayFlag[0].value = "true";
    }
}

function checkNavigateAway() {
    var navigateAwayFlag = $("input[id*='navigateAwayValue']");
    if (navigateAwayFlag.length > 0 && navigateAwayFlag[0].value == "true")
    {
        return "Warning Text";
    }
}

Editar : Schlechte Nachrichten. Das oben genannte scheint im IE6 nicht zu funktionieren. Es scheint wie es feuert Ereignisse in einer anderen Reihenfolge als Firefox, so dass die onbeforeunload Feuer vor der AJAX beginRequest... Möglicherweise müssen Sie einen Weg finden, um den Wert der Flagge über den Hyperlink-Klick zu ändern, bevor das onbeforeunload ausgelöst wird.

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