So finden Sie heraus, was genau das Ereignis ausgelöst?
Ich bin mit einigen Funktion mit jQuery, zum Beispiel:
$(window).one('beforeunload', function() {
//my code
});
Aber ich möchte wirklich, um herauszufinden, alles über Sie, was hat dieses Ereignis ausgelöst hat, und wie.
Habe ich versucht den folgenden code:
$(window).one('beforeunload', function(e) {
alert(JSON.stringify(e));
});
Aber es wirft Ausnahme etwa kreisförmige Struktur. Definitiv aber es muss einen anderen Weg der Differenzierung und debugging durch.
Wie werde ich es anwenden?
Ich möchte sehen, was dieses Ereignis ausgelöst hat, war es eine Verbindung, eine form eingereicht, eine javascript -, eine Seite aktualisiert wird, oder ein hin und her, Tasten oder was auch immer, und es ist alles in Ordnung in diesem Fall. ABER, wenn es ausgelöst wurde durch ein Aufruf zum öffnen einer externen Anwendung, will ich verwerfen der Veranstaltung und die Rückgabe null.
Beispiel für externe Anwendung starten:
<a href="skype:your_skype_name?call" >
Irgendwelche Ideen?
GELÖST
Dies ist, wie ich es gelöst.
Ich nur einige Skript-Hyperlink erste, um mehr Kontrolle über die Veranstaltung:
<a href="javascript:void(0)" id="skype_click_ok"
Dann Erzeuge ich eine Globale variable zum speichern des Status von beforeunload:
var dontunload=0;
Dann habe ich manuell Bearbeiten, den link, aber die Einstellung Position.href, und das ändern der variable state:
$('#skype_click_ok').click(function(){
dontunload=1;
location.href='skype:marilynbrusas?call';
});
Nun meine eigentliche beforeunload Veranstaltung, beachten Sie die one()
wurde auch geändert, um bind()
:
$(window).bind('beforeunload', function() {
if (dontunload==1) dontunload=0; //if triggered from our skype - do nothing, yet cancel state for the next call
else { //Do the actual code
//Fade out, before leaving the page.
$('html#my_html').stop(true,false).css('overflow','hidden').animate({opacity:0},2000);
//Lock content with invalid image hack
$('body#my_body').prepend(
$('<div>').attr({style:'position:fixed;height:100%;width:100%;left:0;top:0;z-index:900100;background-image:url(in-your-face)'})
);
//unbind the event
$(this).unbind('beforeunload');
}
});
EDIT3
Eigentlich ist es nicht gelöst. Dieser trick funktioniert nicht im IE und auch noch Auslöser von javascript:void(0) links...
- Ein Aufruf zum öffnen einer externen Anwendung ? Können Sie bitte besser erklären ?
<a href="skype:your_skype_name?call" >
- dies löst eine BEKOMMEN, und damit löst vor-unload-Ereignis. Die externe Anwendung bedeutet, es hat ein internes Protokoll, andere alshttp:
zum Beispielskype:
. So versucht es zu starten Sie eine skype-Anwendung anstelle der öffnung einige Seite im web. Und ich will Abbrechen, meine Veranstaltung, wenn es der Fall ist.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mit
alert
um Objekte anzuzeigen, wie Ereignisse ist ziemlich nutzlos.Warum versuchen Sie nicht, senden Sie die Veranstaltung, um die Konsole?
Diese Weise können Sie Sie event-Objekt und zeigen Sie Sie in einem Baum wie Struktur.
BEARBEITEN Als pro Sie Ihre Kommentare über die Lage der event-trigger: ich habe nicht dieses zu testen, aber dies könnte ein Weg des Aufhörens Ihrer unload-Ereignis.
a
Elementebeforeunload
dass das Ereignis abbricht sofortSonst lösen die bisherigen handler
Beachten Sie, dass dieses Beispiel mit so etwas nennen Veranstaltung Namensräume. Durch die Angabe, dass wir Zuhören wollen, die
beforeunload
Veranstaltung, aber wir haben unsere eigenen namespace mit dem Namenoverride
wir hinzufügen können, und entfernen Sie den Ereignis-handler-sicher ohne dass alle anderen Zuhörer für diebeforeunload
Veranstaltung.$("a").click()
vielleicht?.javascript:void(0)
und dann... und dann weiß ich nicht... ich würde immer noch keine Ahnung, was das Ereignis ausgelöst hat. Ich könnte eine Globale variable natürlich, und stellen Sie es einmal, die auf eine skype-Verbindung zu beobachten ist. Aber ich kann nicht denken, ein Weg, der das Rückgängigmachen der Zustand dieser variable, so dass, wenn der Benutzer noch einmal löst die beforeunload event, aber in einer anderen Art und Weise, es würde doch wieder funktionieren wie erwartet... hmmm, vielleicht sollte ich zurückkehren, es Stand jedes mal, bevor Sie entladen wird aufgerufen, bevor das klicken, das ist tolle Idee,bind()
? (ein Jquery-1.64 user hier...)Können Sie die
event.target.id
Selektor zu übergeben, welches element das Ereignis ausgelöst hat, etwa so:Sehen jsfiddle.
Als die commentor erwähnt, wird die alert-ID die ID des Elements verwendet, um auszuwählen, habe ich nur verwendet, dass als ein Beispiel, wie man nicht ganz sagen, was Sie wollte, abgerufen?
Wenn Sie alles wissen wollen über die Veranstaltung, können Sie die raten von @Ästhet
Dann können Sie überprüfen Sie die Konsole und überprüfen Sie die Ausgabe-Ereignis.
Mit
target="_blank"
löst dieses problem:Es ist ziemlich hässlich, aber in meinem Fall war es die einzige Lösung, die einwandfrei funktionierte in allen Browsern.