2008-09-11 8 views
3

Ich habe eine Seite, die ziemlich viel Arbeit macht und ich möchte nicht, dass der Benutzer in der Lage ist, von dieser Seite wegzugehen (Browser schließen, zurück drücken, etc.), ohne eine Warnung zu erhalten. Ich habe festgestellt, dass das onbeforeunload-Ereignis (das ich für IE-spezifisch halte, was für mich gut funktioniert, da das Projekt viel ActiveX verwendet) großartig funktioniert.Kann ich onbeforeunload für ein bestimmtes Element überschreiben?

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

Die JavaScript-Funktion, die ausgeführt wird, wenn das onbeforeunload -Ereignis ausgeführt wird, fügt Text nur in event.returnValue ein. Wenn ich irgendwie feststellen könnte, dass das Hilfesymbol das ist, auf das geklickt wurde, konnte ich in dieser Situation einfach keinen Text in event.returnValue einfügen. Aber wie könnte ich das herausfinden?

Antwort

8

Lass mich raten: Die Hilfe "Icon" ist eigentlich eine Verbindung mit einer javascript: URL? Ändern Sie es in eine echte Schaltfläche, eine echte Verknüpfung, oder stellen Sie die Funktionalität zumindest in einen onclick-Ereignishandler (der das Standardverhalten verhindert). Problem gelöst.

+0

Eigentlich war es eine echte Verbindung - ich hatte den falschen Eindruck, dass onclick nach einem Vorabstart ausgelöst wurde. Vielen Dank. –

2

EDIT: Meine "Workaround" unten ist komplette Overkill, basierend auf meinem Mangel an Verständnis. Gehen Sie mit Shog9's Antwort oben.

OK, während ich die Frage schrieb, kam ich mit einem Workaround, der für jetzt arbeiten wird.

Ich legte eine globale JavaScript-Variable in a boolean auf, ob oder ob nicht das Symbol über schwebt. Dann füge ich Ereignisse an die onmouseover und onmouseout Ereignisse des Bildes an und schreibe Funktionen, die diesen Wert setzen. Schließlich schreibe ich nur in die Funktion, die onbeforeunload handhabt, die diesen Wert prüft, bevor er event.returnValue setzt.

Wahrscheinlich keine makellose Abhilfe, aber es wird für jetzt funktionieren.

-1

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

Erstellen Sie eine "Holding" Popup-Seite mit einem FRAMESET mit einem 100% Single FRAME und platzieren Sie die normalen Ereignishandler onUnload und onbeforeUnload in den 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 Sie frei sind die eigentliche 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 aktualisiert oder tatsächlich geschlossen wird, werden die Ereignisse ausgelöst.

Wie ich schon sagte, nicht voll-Beweis, aber wird das Abfeuern des Ereignisses bei jedem Klick oder Postback bekommen.

+0

Frames sind hässlich – ThiefMaster

0

im Internet finden Sie viele Menschen finden Sie so etwas wie

window.onbeforeunload = null

in IE6 für mich verwenden was darauf hindeutet,

aber das funktioniert nicht. Als ich in den MSDN-Dokumenten nach dem Ereignisobjekt suchte, fand ich einen Verweis auf die event.cancelBubble-Eigenschaft, die ich für die Lösung hielt. aber dank Orso, der diese Einstellung "Event.cancelBubble = true "ist nutzlos, die Möglichkeit, die Bestätigungsaufforderung loszuwerden, besteht darin, die return - Anweisung vollständig auszuschließen. Ich habe eine boolesche Variable als Flag verwendet, um zu entscheiden, ob ich etwas zurückgeben soll 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; 

dies setzt die 'Postback' Variable auf true, die in der confirmExit abgeholt wird () Funktion mit der Wirkung, das Ereignis abzubrechen.

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

Verwandte Themen