Frage

Ich erstelle ein Popup-Fenster, das einen beforeunload Handler installiert ist. Wenn der „Close“ Datei Menüpunkt verwendet wird, um das Popup zu schließen, der beforeunload Handler zweimal aufgerufen wird, was in zwei „Sind Sie sicher, dass Sie dieses Fenster schließen mögen?“ Meldungen erscheinen.

Das ist ein Fehler mit Firefox, und ich habe berichtet hier , aber ich möchte noch eine Möglichkeit, dies zu verhindern. Können Sie sich eine vernünftige Art und Weise denken Sie an Doppel beforeunload des Erfassens der doppelte Botschaft Problem zu verhindern? Das Problem ist, dass Firefox mir nicht sagen, welche Taste im Dialog wählte der Benutzer klicken -. OK oder Abbrechen

War es hilfreich?

Lösung 3

Dies ist definitiv ein FF Fehler. Ich habe es berichtet unter https://bugzilla.mozilla.org/show_bug.cgi? id = 531199

Andere Tipps

<script type="text/javascript">
var onBeforeUnloadFired = false;

window.onbeforeunload = function ()
{
    if (!onBeforeUnloadFired) {
        onBeforeUnloadFired = true;
        event.returnValue = "You have attempted to leave this page.  If you have made any changes to the fields without clicking the Save button, your changes will be lost.  Are you sure you want to exit this page?";
   }

   window.setTimeout("ResetOnBeforeUnloadFired()", 10);
}

function ResetOnBeforeUnloadFired() {
   onBeforeUnloadFired = false;
}    
</script>

Stellen Sie eine Variable in der Prozedur um den Dialog zu verhindern, dass das zweite Mal kommen. Verwenden Sie setTimeout es zurücksetzen danach.

Die beste Lösung, die ich gefunden habe, ist einen Flag globalen Variable zu verwenden, die nach so vielen Millisekunden zurückgesetzt wird, sagen 500 (dies stellt sicher, dass die Funktion erneut aufgerufen werden kann, aber nicht sofort nach seinem Erscheinen).

siehe letzten Code in:

http: // Sozial .msdn.microsoft.com / Foren / en / sharepointinfopath / thread / 13000cd8-5c50-4260-a0d2-bc404764966d

Ich habe dieses Problem in Chrome 21, Firefox 14, IE 7-9, Safari 5 (am PC) gefunden.

Die folgenden Arbeiten auf alle diese Browser. Wenn man die window.onbeforeunload Funktion während der Veranstaltung entfernt wird dies den zweiten Anruf verhindern. Der Trick besteht darin, die window.onbeforeunload Funktion zurückzusetzen, wenn der Benutzer auf der Seite zu bleiben entscheidet.

var window_on_before_unload = function(e) {
    var msg;
    // Do here what you ever you need to do
    msg = "Message for user";

    // Prevent next "window.onbeforeunload" from re-running this code.
    // Ensure that if the user decides to stay on the page that
    // this code is run the next time the user tries to leave the page.
    window.onbeforeunload = set_on_before_unload;

    // Prepare message for user
    if (msg) {
        if (/irefox\/([4-9]|1\d+)/.test(navigator.userAgent))
            alert(msg
                    + '\n\nThe next dialog will allow you to stay here or continue\nSee Firefox bug #588292');

        (e = e || window.event).returnValue = msg;
        return msg;
    }
};

// Set window.onbeforeunload to the above handler.
// @uses window_on_before_unload
// @param {Event} e
var set_on_before_unload = function(e) {
    // Initialize the handler for window.onbeforeunload.
    window.onbeforeunload = window_on_before_unload;
}

// Initialize the handler for window.onbeforeunload.
set_on_before_unload();

eine globale Variable erstellen, die auf true innerhalb des Handlers festgelegt ist. zeigt nur die Warnung / Pop-up, wenn dieser Variable falsch ist.

Ich verwende den folgenden Ausschnitt der exitcount zu verfolgen

Beim Laden der Seite der folgenden Variable exitCount initialisiert

if (typeof(MTG) == 'undefined') MTG = {};
MTG.exitCount=0; 

und im Fenster Entlade-Ereignisse

$(window).bind("beforeunload", function(){


            if (MTG.exitCount<=0) 
            {

                             //do your thing, save etc
            }   
            MTG.exitCount++;




});

Ich habe festgestellt, dass stattdessen Ihren eigenen Ruf zu tun, (), um zu bestätigen, nur tun even.preventDefault (); im beforeunload Ereignisse. Firefox wirft seinen eigenen Bestätigungsdialog auf. Ich bin mir nicht sicher, ob dies das richtige / Standard, was zu tun, aber das ist, wie sie es tun.

Ich habe ein Dokument ein weiteres Popup-Fenster mit window.open öffnen. Im ursprünglichen Fenster habe ich registriert (mit jQuery) einen Listener für „Entladen“ Ereignis wie folgt aus:

var popup_window = window.open(...) 
$(popup_window).on('unload', function(event) ...

Ich habe über diese Seite gekommen, weil das Ereignis wirksam wurde zweimal ausgelöst wird. Was ich gefunden habe ist, dass es kein Fehler ist, löst es zweimal, weil es feuert einmal für „about: blank“. Seite von Ihrer Seite ersetzt wird und eine andere für Ihre Seite entladen

Alles, was ich tun muß, ist das Ereignis zu filtern, die ich interessiert bin durch das ursprüngliche Ereignis Abfrage:

function (event) {
   var original_url = e.originalEvent.originalTarget.URL;
   if (original_url != 'about:blank')
   {
       ... do cool things ...
   }
}

Ich weiß nicht, ob dies auf die ursprüngliche Frage gilt, weil es ein Sonderfall einer Fensteröffnung eines anderen ist, aber ich hoffe, es hilft.

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