0

Ich versuche, die OnBeforePageUnload nur auszulösen, wenn der Benutzer das Tab oder Browserfenster schließt. Wenn der Benutzer auf meiner Website navigiert, habe ich einen benutzerdefinierten Mechanismus, der einen Warndialog auslöst, um zu verhindern, dass der Benutzer die eingegebenen Daten verliert. Also jedes Mal, wenn ein Link auf meiner Seite geklickt wurde, habe ich die eine Fahne:Warum erfolgt die Weiterleitung, bevor mein jQuery-Klickereignis für ein HTML-Ankerelement ausgelöst wird?

$('a[href]').click(function (event) { 
    buttonOutsidePageClicked = false; 
}); 

Dann wird das onbeforepageunload Ereignis ausgelöst wird. Ich überprüfe den Wert der Flagge, um zu sehen, ob ich das in onbeforeunload Dialog aufgebaut zeigen soll oder nicht:

function OnBeforeUnload(oEvent) { 
if (buttonOutsidePageClicked) 
    return navAwayMessage; 
} 

Dies funktioniert gut für all meine Links auf der Seite mit folgenden Ausnahmen ein:

<a id="cpm_UploadLink" class="button" rel="no" href="/pages/otherPage"> 
    <span class="btnLeft"></span> 
    <span class="btnMiddle">Click Me</span> 
    <span class="btnRight"></span> 
</a> 

Diese HTML wird von einem benutzerdefinierten Web-Steuerelement erstellt. Wenn ich auf den Link klicke, werde ich auf die andere Seite weitergeleitet, ohne dass das Klick-Ereignis ausgelöst wurde. Also kann ich das Flag nicht setzen und die eingebaute onbeforeunload Nachricht wird angezeigt.

Wenn ich hinzufügen, ein Inline das Onclick-Attribut direkt in der Steuerung wie folgt hinzu:

<a id="cpm_UploadLink" class="button" rel="no" href="/pages/otherPage" 
    onclick="javascript:buttonOutsidePageClicked = false;"> 
     <span class="btnLeft"></span> 
     <span class="btnMiddle">Click Me</span> 
     <span class="btnRight"></span> 
</a> 

Alles funktioniert gut. Aber das ist nicht die Art, wie ich das lösen möchte.

Kann mir jemand erklären, welchen Fehler ich hier mache?

Ich habe viel Code gesucht und probiert, aber ohne Erfolg.

Ich fand diesen Beitrag Preventing Links before jQuery is Loaded aber ich weiß nicht, ob das etwas mit meinem Problem zu tun hat, weil ich es nur mit einem Link habe.

Vielen Dank im Voraus für jede Hilfe.

Antwort

3

Da Ihr HTML-Code vom benutzerdefinierten Web-Steuerelement erstellt wird, müssen Sie möglicherweise live() oder on() für JQuery 1.7 und höher verwenden, um Ihr Klickereignis zu binden.

Zum Beispiel:

$("body").delegate("a","click", function() { 
     buttonOutsidePageClicked = false; 
    }); 

von jquery Version 1.Diese 7 Verwendung:

$("body").on("click", "a", function() { 
    buttonOutsidePageClicked = false; 
}); 

JQuery live()

View online Beispiel here

+0

Dies funktioniert nicht für mich, da das Klickereignis nie ausgelöst wird. Oder vermisse ich etwas in dir Antwort? Was macht die Live-Methode? Ist es anders als $ ("a"). Click (function() {...}); ? – ThdK

+0

"Fügen Sie einen Event-Handler für alle Elemente an, die dem aktuellen Selektor jetzt und in der Zukunft entsprechen." Sie sollten live verwenden, wenn Ihr HTML-Element erstellt wird, nachdem jquery geladen wurde, durch andere js. In Ihrem Fall, ich bin nicht sicher, dass Sie benutzerdefinierte Web-Steuerelement erstellt das Element über js? Sie erwähnen, dass Ihr Ereignis nie ausgelöst wird, was bedeutet, dass Ihr Ereignis nicht mit dem DOM-Element verknüpft ist. –

+1

@ThdK - wenn Sie den Code nicht verstehen, sagen Sie nicht, dass es nicht funktioniert. Jetzt funktioniert die 'Live'-Bindung auch dann, wenn das Element entfernt/hinzugefügt wird, um das Problem zu beheben. – Dementic

0

Zu allererst: Sie können Ihren Code dieses Refactoring:

$('a[href]').click(function (event) { 
    buttonOutsidePageClicked = false; 
}); 

Ihre Antwort liegt wahrscheinlich in:

Diese html durch eine benutzerdefinierte Web-Steuerelement erstellt wird

Sie übernehmen entweder das Klickereignis, sodass jQuery-Klickhandler nicht aufgerufen werden, oder verwenden das Klickereignis auf den inneren <span> -Elementen.

Sie können Firebug- oder Chrome-Entwicklertools verwenden, um alle Ereignis-Listener anzuzeigen. Stellen Sie sicher, dass einer von ihnen jQuery ist.

+0

Oh ja, du hast Recht. Dies war ein Rest davon, anderen Code auszuprobieren, um zu sehen, ob das anders oder anders reagiert. Ich habe es in meiner Frage aktualisiert. Wie kann ich alle Ereignis-Listener in Firebug sehen? – ThdK

+0

DOM-Panel: http://getfirebug.com/wiki/index.php/DOM_Panel – jgauffin

+0

Wenn ich meinen Link und öffnen Sie die DOM-Panel ist: Klicken Sie auf \t click() Ich weiß nicht, ob das was bedeutet. – ThdK

Verwandte Themen