2008-11-25 14 views
6

Ich habe diese here gepostet, aber dachte, es könnte eine Frage für sich allein verdienen.ASP.NET Linkbutton Anhebung onBeforeUnload Ereignis zweimal

Was ich versuche, ist ein Dialogfeld anzuzeigen, das den Benutzer fragt, ob er die Seite verlassen möchte, wenn es nicht gespeicherte Änderungen gibt. Das alles funktioniert gut. Aber das Problem wird im Folgenden beschrieben:

Ist jemand auf das Problem gestoßen, wo Internet Explorer das onbeforeunload-Ereignis zweimal auslöst? Beim googlen fand ich, dass es etwas mit der Tatsache zu tun hat, dass für (unter anderem) eine ASP.NET Linkbutton der HTML Code <a href="javascript: __doPostBack... ist.

Offensichtlich, wenn IE einen Link konfrontiert, der keine href="#" hat, wird das Onbeforeunload-Ereignis ausgelöst. Wenn Sie dann das Javascript-Dialogfeld bestätigen, wird die Seite das "echte" Entladen durchführen, um zur anderen Seite zu navigieren und das onbeforeunload-Ereignis ein zweites Mal auszulösen.

Eine im Internet angebotene Lösung besteht darin, eine boolesche Variable zu setzen und zu prüfen, bevor der Dialog angezeigt wird. Also das zweite Mal würde es nicht gezeigt werden. Das ist alles gut, aber wenn der Benutzer abbricht, wird die Variable immer noch gesetzt. Wenn der Benutzer das nächste Mal die Seite verlassen möchte, wird der Dialog nicht mehr angezeigt.

Hoffe, das ist ein wenig klar, und ich hoffe, jemand hat einen Weg um diese gefunden?

Antwort

10

Als Antwort auf annakata: Ja, aber Sie möchten, dass das Ergebnis des Dialogfelds vom Browser verwendet wird. Sie könnten also denken, dass die Verwendung von "return bFlag" den Trick (oder event.returnValue = bFlag) machen würde, aber das gibt Ihnen ein zweites Dialogfeld. Ich habe einen Weg gefunden, dank this page. Es ist eigentlich ganz einfach:

var onBeforeUnloadFired = false; 

Verwenden Sie diese globale Variable hier:

if (!onBeforeUnloadFired) { 
    onBeforeUnloadFired = true; 
    event.returnValue = "You'll lose changes!"; 
} 
window.setTimeout("ResetOnBeforeUnloadFired()", 1000); 

Und dann diese Funktion implementieren:

function ResetOnBeforeUnloadFired() { 
    onBeforeUnloadFired = false; 
} 

So in der Tat, verwenden Sie die Flagge, aber es zurücksetzen wenn der Benutzer auf Abbrechen klickt. Nicht ganz, was ich möchte, aber nichts besseres gefunden habe.

+0

Ich denke, Sie nehmen meine Antwort auf wörtlich. Ich meinte, dass Sie den Bestätigungswert in einem Flag speichern möchten, das Sie überprüfen, bevor Sie den Dialog anzeigen. Ich nehme an, du bist entweder so hingekommen :) – annakata

1

Ich bin nicht darauf gestoßen, aber Sie könnten sicherlich die Flag-Variable gleich dem Ergebnis des Dialogs setzen? Wenn der Benutzer die Markierung aufhebt, bleibt die Flagge daher falsch.

0

IE unterstützt ein Ereignis auf dem Dokumentobjekt namens onstop. Dieses Ereignis wird nach dem onbeforeunload-Ereignis, jedoch vor dem onunload-Ereignis ausgelöst. Dies ist nicht genau relevant für Ihre zwei Dialogfragen, aber es ist immer noch relevant für andere Leute, die über diesen Thread stolpern könnten (wie ich es getan habe).

Das Problem, das ich hatte, war, dass ich eine Lade-Nachricht beim onbeforeunload Ereignisfeuern anzeigen musste. Das ist alles in Ordnung, bis die Seite eine Art Bestätigungsdialog hat. Das onbeforeunload-Ereignis wird ausgelöst, selbst wenn der Benutzer abbricht und auf der Seite verbleibt. Am einfachsten war es für mich, meine Ladelogik in einen Handler für document.onstop zu verschieben. Darüber hinaus müssen Sie die readyState-Eigenschaft des Dokumentobjekts überprüfen, das ein anderes Nur-IE-Feld ist. Wenn es "geladen" wird, bedeutet dies, dass der Benutzer die Seite tatsächlich verlässt. Wenn es "vollständig" ist, bedeutet dies, dass der Benutzer sich aufhält.

Wenn es Ihnen gut geht, nur IE zu verwenden, dann könnten Sie sich für Folgendes interessieren.

document.onstop = function() 
{ 
    try 
    { 
     if(document.readyState != "complete") 
     { 
      showLoadingDiv(); 
     } 
    } 
    catch(error) 
    { 
     handleError(error); 
    } 
} 
Verwandte Themen