4 Stimmen

Kann ich onbeforeunload für ein bestimmtes Element außer Kraft setzen?

Ich habe eine Seite, die ziemlich viel Arbeit macht, und ich möchte nicht, dass der Benutzer in der Lage ist, von dieser Seite weg zu navigieren (Browser schließen, Zurück-Button drücken usw.), ohne eine Warnung zu erhalten. Ich fand, dass das onbeforeunload-Ereignis (die ich denke, ist IE-spezifisch, die gut für mich funktioniert, wie das Projekt viele ActiveX verwendet) funktioniert gut.

Das Problem ist, dass ich möchte, dass der Benutzer jederzeit auf ein kleines "Hilfe"-Symbol in der oberen rechten Ecke klicken kann, um ein Hilfefenster zu öffnen. Dies führt dazu, dass onbeforeunload ausgelöst wird, obwohl das Hauptfenster nirgendwo hingeht und die Seite nie entladen wird.

Die JavaScript-Funktion, die ausgeführt wird, wenn das onbeforeunload-Ereignis ausgeführt wird, setzt einfach Text in event.returnValue. Wenn ich irgendwie feststellen könnte, dass das Hilfesymbol dasjenige ist, das angeklickt wurde, könnte ich in dieser Situation einfach keinen Text in event.returnValue eingeben. Aber wie könnte ich haben die Seite herausfinden, dass?

8voto

Shog9 Punkte 151504

Lassen Sie mich raten: Das Hilfe-"Symbol" ist eigentlich ein Link mit einem javascript: url? Ändern Sie es in eine echte Schaltfläche, einen echten Link, oder setzen Sie zumindest die Funktionalität in einen onclick-Eventhandler (der das Standardverhalten verhindert). Problem gelöst.

<!-- clicking this link will do nothing. No onbeforeunload handler triggered. 
Nothing. 
And you could put something in before the return false bit...
...and the onunload handler would still not get called... -->
<a href="http://www.google.com/" onclick="return false;">blah1</a>
<!-- this should also do nothing, but IE will trigger the onbeforeunload 
handler -->
<a href="javascript:void(0)">blah2</a>

2voto

Tom Kidd Punkte 12679

EDIT。 Meine "Abhilfe" unten ist völlig übertrieben, basierend auf meinem Mangel an Verständnis. Gehen Sie mit Shog9s Antwort oben.

OK, während ich die Frage schrieb, habe ich eine Lösung gefunden, die vorerst funktioniert.

Ich setze eine globale JavaScript-Variable ein, die als Boolescher Wert angibt, ob das Symbol mit dem Mauszeiger überfahren wird oder nicht. Dann hänge ich Ereignisse an die onmouseover- und onmouseout-Ereignisse des Bildes an und schreibe Funktionen, die diesen Wert setzen werden. Zum Schluss schreibe ich einfach einen Code in die Funktion, die onbeforeunload behandelt, der diesen Wert überprüft, bevor event.returnValue gesetzt wird.

Wahrscheinlich ist das keine einwandfreie Lösung, aber für den Moment wird es funktionieren.

0voto

Im Internet werden Sie viele Vorschläge finden, wie z. B.

window.onbeforeunload = null

aber dies funktioniert nicht für mich in IE6. Lesen in den MSDN-Docs für das Ereignis-Objekt fand ich einen Verweis auf die event.cancelBubble-Eigenschaft, die ich dachte, war die Lösung. aber dank Orso, die darauf hingewiesen, dass die Einstellung "event.cancelBubble=true" nutzlos ist, ist der Weg, um loszuwerden, die Bestätigungsaufforderung, die Return-Anweisung insgesamt auszuschließen, entschied ich mich für eine boolesche Variable als Flagge, um zu entscheiden, ob etwas zurückgeben oder nicht. im Beispiel unten füge ich den Javascript-Code programmatisch im Code hinter:

Page.ClientScript.RegisterStartupScript(typeof(String), "ConfirmClose", @"  <script>        window.onbeforeunload = confirmExit;        function confirmExit()      {           if(postback == false)               return ""Please don't leave this page without clicking the 'Save Changes' or 'Discard Changes' buttons."";                                                      }       </script>");

dann enthält die Hilfe-Schaltfläche das folgende aspx-Markup:

OnClientClick="postback=true;return true;

Dies setzt die Variable 'postback' auf 'true', was von der Funktion confirmExit() aufgegriffen wird und den Effekt hat, dass das Ereignis abgebrochen wird.

Ich hoffe, Sie finden das nützlich. Es ist getestet und funktioniert in IE6 und FF 1.5.0.2.

-1voto

Kevin Dark Punkte 449

Ich habe eine Methode, die zwar etwas klobig ist, aber in den meisten Fällen funktioniert.

Erstellen Sie eine "Holding"-Popup-Seite, die ein FRAMESET mit einem einzigen, 100%igen FRAME enthält, und platzieren Sie die normalen onUnload- und onbeforeUnload-Event-Handler im HEAD.

<html>
<head>
<script language="Javascript" type="text/javascript">
  window.onbeforeunload = exitCheck;
  window.onunload = onCloseDoSomething;

  function onCloseDoSomething()
  {
  alert("This is executed at unload");
  }

  function exitCheck(evt)
  {
  return "Any string here."}
  </script>
  </head>

    <frameset rows="100%">
    <FRAME name="main" src="http://www.yourDomain.com/yourActualPage.aspx">
    </frameset>
<body>
</body>
</html>

Mit dieser Methode können Sie die tatsächliche Seite, die Sie sehen möchten, verwenden, zurückschreiben und auf Hyperlinks klicken, ohne dass das onUnload- oder onbeforeUnload-Ereignis des äußeren Rahmens ausgelöst wird.

Wenn der äußere Rahmen aktualisiert oder tatsächlich geschlossen wird, werden die Ereignisse ausgelöst.

Wie ich schon sagte, nicht völlig sicher, aber wird um das Feuern des Ereignisses auf jedem Klick oder Postback zu bekommen.

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