Frage

ich eine Seite haben, die ziemlich viel Arbeit macht, und ich möchte nicht, dass der Benutzer in der Lage sein, von dieser Seite zu navigieren weg (Browser schließen, schlug zurück-Taste, etc.), ohne eine Warnung zu bekommen. Ich fand, dass das onbeforeunload Ereignis (was meiner Meinung nach IE-spezifische, was für mich als das Projekt verwendet viele ActiveX funktioniert gut) funktioniert super.

Das Problem ist, möchte ich den Benutzer auf einem kleinen „help“ Symbol klicken in der oberen rechten Ecke zu können und ein Hilfefenster jederzeit auftauchen. Dies bewirkt, dass onbeforeunload Feuer, obwohl das Hauptfenster nie irgendwo, und die Seite geht nie leert.

Die JavaScript-Funktion, die ausgeführt wird, wenn das onbeforeunload Ereignis läuft legt einfach einen Text event.returnValue. Wenn ich feststellen kann, irgendwie, dass das Hilfesymbol ist derjenige, der angeklickt wurde dann konnte ich einfach nicht Text in event.returnValue in dieser Situation setzen. Aber wie konnte ich die Seite das herauszufinden?

War es hilfreich?

Lösung

Lassen Sie mich raten: die Hilfe „Symbol“ ist eigentlich ein Link mit einer javascript: url? Ändern Sie es zu einem echten Knopf, eine echte Verbindung, oder zumindest legen die Funktionalität in einem Onclick-Ereignishandler (das verhindert, dass das Standardverhalten). 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>

Andere Tipps

EDIT: Meine "Abhilfe" weiter unten vollständig übertrieben, basierend auf meinem Mangel an Verständnis. Gehen Sie mit Shog9 Antwort oben.

OK so, während ich die Frage schrieb, kam ich mit einer Vermeidung des Problems auf, die jetzt arbeiten.

habe ich ein globales JavaScript-Variable in wirkt als boolean auf, ob das Symbol schwebt über wird. Dann lege ich Ereignisse an das Onmouseover Bild und onmouseout Ereignisse und Schreibfunktionen, die diesen Wert gesetzt werden. Schließlich habe ich nur Code in der Funktion, die onbeforeunload Griffe, die diesen Wert überprüfen, bevor event.returnValue Einstellung.

Wahrscheinlich nicht eine einwandfreie Abhilfe, aber es wird jetzt arbeiten.

im Internet finden Sie viele Leute finden, was darauf hindeutet, verwenden Sie so etwas wie

window.onbeforeunload = null

, aber das ist für mich nicht in IE6 arbeiten. in der MSDN-Dokumentation für das Ereignisobjekt Lesung bis fand ich einen Verweis auf die event.cancelBubble Eigenschaft, die ich dachte, war die Lösung. aber dank Orso der darauf hinwies, dass „event.cancelBubble = true“ ist nutzlos Einstellung, die Art und Weise der Bestätigungsaufforderung loszuwerden, ist die return-Anweisung ganz auszuschließen, wählte ich eine boolesche Variable als Flag zu verwenden, um zu entscheiden, ob Rückkehr etwas oder nicht. im Beispiel unten i fügen Sie den Javascript-Code programattically 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 die Hilfe-Taste enthält folgende aspx Markup:

OnClientClick="postback=true;return true;

Es werden die ‚Postback‘ Variable auf true, die in der confirmExit () Funktion aufgenommen wird, die Wirkung der Veranstaltung zu annullieren.

hoffen, dass Sie dies nützlich finden. es wird getestet und arbeitet in IE6 und FF 1.5.0.2.

Ich habe eine Methode, die ein bisschen klobig ist, aber es wird in den meisten Fällen funktioniert.

Erstellen Sie eine "Holding" Popup-Seite ein Frameset mit einer 100% Single Frame und setzen Sie den normalen onUnload und Onbeforeunload Event-Handler im HEAD enthält.

<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 sind Sie frei die tatsächliche Seite, die Sie sehen wollen, verwenden, Post zurück und klicken Sie auf Hyperlinks ohne den äußeren Rahmen onUnload oder Onbeforeunload Ereignis ausgelöst wird.

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

Wie ich schon sagte, nicht voll-Beweis aber auf jedem Klick oder Postbacks um das Abfeuern der Veranstaltung erhalten.

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