Wenn Sie es anwenden können, möchten Sie wahrscheinlich einen Blick auf event.preventDefault und event.stopPropagation werfen
ODER die Bindung jedes Mal innerhalb Ihrer Methode aufheben und binden
function someMethod(){
$(obj).off('click').on('click',function(e){// put your logic in here });}
Seien Sie vorsichtig, da dies ALLE Klickereignisse aufhebt und nicht immer erwünschtes Verhalten ist. Wenn Sie beispielsweise etwas an ein Dokument binden, möchten Sie nur dieses eine Ereignis aufheben, nicht alle.
Mārtiņš Briedis
26
Falls Sie nicht versehentlich andere Klickereignisse lösen möchten, sollten Sie function someMethod() { $(obj).off('click.namespace').on('click.namespace', function {}); }
Zusätzlich zur Antwort von pna möchten Sie möglicherweise über den Namespace Ihres Ereignisses nachdenken, damit Sie nicht versehentlich alle Klickereignisse lösen.
Dies sollte die akzeptierte Antwort sein. Das Aufheben der Bindung aller Klickereignisse kann leicht zu Problemen führen - insbesondere, wenn es sich um ein komplexes Projekt mit viel jQuery handelt. Dank dafür! Wusste nichts von dieser einfachen Namespace-Lösung !!
Simon Steinberger
Mit der aktuellen jQuery sollte dies sein $(obj).off()und $(obj).on()jeweils. Ansonsten hat der Namespace geholfen und das hat funktioniert. Danke dir!
Aexl
19
Es gibt keine integrierte Methode, um festzustellen, ob Sie diese bestimmte Funktion bereits gebunden haben. Sie können mehrere Klickfunktionen an ein Objekt binden. Beispielsweise:
Wenn Sie beim Klicken auf das Objekt die oben genannten Schritte ausführen, wird Hallo und dann auf Wiedersehen angezeigt. Um sicherzustellen, dass nur eine Funktion an das Klickereignis gebunden ist, lösen Sie die Bindung des Klickereignishandlers und binden Sie die gewünschte Funktion wie folgt:
Die naheliegende Lösung besteht darin, nicht someMethod()zweimal anzurufen . Wenn Sie das nicht beheben können, können Sie eine Statusvariable beibehalten, sodass sie immer nur einmal so gebunden wird:
function someMethod(){if(!someMethod.bound){
$(obj).click(function(){});
someMethod.bound =true;}}
Hinweis: Hierbei wird eine Eigenschaft der Funktion selbst verwendet, anstatt eine globale Variable einzuführen, um zu verfolgen, ob sie gebunden wurde. Sie können auch eine Eigenschaft für das Objekt selbst verwenden.
Dies funktioniert nur, wenn someMethod eine Methode eines Objekts oder einer globalen Funktion ist.
Jcubic
jQuery.noopist nur ein Zeichen kürzer als function(){}, also ist es ein bisschen albern zu sagen, dass es hier "hilft" und nur eine leere Funktion bietet. Hier ist ein Nicht-jQuery-Nicht-Methoden-Beispiel für diese allgemeine Lösung:var fn = function(){ fn = function(){}; do stuff; };
1j01
1
@ 1j01 Bearbeitet, um $stattdessen zu verwenden
Esailija
2
Dies ist ein Vorschlag, da ich Ihre Logik nicht kenne. Kann oder kann nicht für Sie arbeiten.
Wenn Sie die Funktionen jquery live () und one () kombinieren, erhalten Sie ein besseres Ergebnis als bei Event-Rebinds.
Die Sonderfälle funktionieren, wenn Sie 2 DOM-Elemente (Eltern & Kind) haben. Live () am übergeordneten Knoten stellt sicher, dass das Ereignis aufgerufen wird, und ruft dann one () auf, um ein Ereignis dynamisch zu registrieren, das nur einmal ausgeführt wird. (Dies bietet ähnliche Funktionen wie Rebinds).
Wenn Sie diesen Weg gehen, ziehen Sie die Lösung von jfriend00 in Betracht, boundan die someMethod()der globale Namensraum angehängt ist, anstatt ihn zu verschmutzen.
Nuala
1
Wenn Sie nur einmal an das Objekt binden möchten, sollten Sie ein Flag implementieren und sich an dieses Objekt halten.
Beachten Sie, dass die Erweiterung funktioniert, indem Sie sowohl die UID als auch den Typ überprüfen. Dies bedeutet, dass Sie verschiedene Arten von Handlern mit derselben UID binden können. Möglicherweise möchten Sie dies. Um es zu ändern, bearbeiten.
Ich habe auch versucht, die Methode off and on jquery zum Binden von Ereignissen nur einmal mit dem dom-Element zu verwenden, das noch nicht vorhanden ist oder das dom-Element noch nicht erstellt wurde.
Dies führt dazu, dass das Ereignis nach einmaligem Klicken auf das Element nicht mehr gebunden wird. Dies löst nicht das Problem, dass Ereignisse mehrfach gebunden werden.
Antworten:
Wenn Sie es anwenden können, möchten Sie wahrscheinlich einen Blick auf event.preventDefault und event.stopPropagation werfen ODER die Bindung jedes Mal innerhalb Ihrer Methode aufheben und binden
quelle
function someMethod() { $(obj).off('click.namespace').on('click.namespace', function {}); }
Zusätzlich zur Antwort von pna möchten Sie möglicherweise über den Namespace Ihres Ereignisses nachdenken, damit Sie nicht versehentlich alle Klickereignisse lösen.
https://api.jquery.com/event.namespace/
quelle
$(obj).off()
und$(obj).on()
jeweils. Ansonsten hat der Namespace geholfen und das hat funktioniert. Danke dir!Es gibt keine integrierte Methode, um festzustellen, ob Sie diese bestimmte Funktion bereits gebunden haben. Sie können mehrere Klickfunktionen an ein Objekt binden. Beispielsweise:
Wenn Sie beim Klicken auf das Objekt die oben genannten Schritte ausführen, wird Hallo und dann auf Wiedersehen angezeigt. Um sicherzustellen, dass nur eine Funktion an das Klickereignis gebunden ist, lösen Sie die Bindung des Klickereignishandlers und binden Sie die gewünschte Funktion wie folgt:
quelle
Die naheliegende Lösung besteht darin, nicht
someMethod()
zweimal anzurufen . Wenn Sie das nicht beheben können, können Sie eine Statusvariable beibehalten, sodass sie immer nur einmal so gebunden wird:Hinweis: Hierbei wird eine Eigenschaft der Funktion selbst verwendet, anstatt eine globale Variable einzuführen, um zu verfolgen, ob sie gebunden wurde. Sie können auch eine Eigenschaft für das Objekt selbst verwenden.
Sie können sehen, dass es hier funktioniert: http://jsfiddle.net/jfriend00/VHkxu/ .
quelle
Oder verwenden Sie die one () -Funktion von jQuery, die on () ähnelt, das Ereignis jedoch nur einmal auslöst, selbst wenn Sie es mehrmals binden.
http://api.jquery.com/one/
quelle
jQuery macht das Aufrufen einer Funktion nur einmal ziemlich einfach:
quelle
jQuery.noop
ist nur ein Zeichen kürzer alsfunction(){}
, also ist es ein bisschen albern zu sagen, dass es hier "hilft" und nur eine leere Funktion bietet. Hier ist ein Nicht-jQuery-Nicht-Methoden-Beispiel für diese allgemeine Lösung:var fn = function(){ fn = function(){}; do stuff; };
$
stattdessen zu verwendenDies ist ein Vorschlag, da ich Ihre Logik nicht kenne. Kann oder kann nicht für Sie arbeiten.
Wenn Sie die Funktionen jquery live () und one () kombinieren, erhalten Sie ein besseres Ergebnis als bei Event-Rebinds.
Die Sonderfälle funktionieren, wenn Sie 2 DOM-Elemente (Eltern & Kind) haben. Live () am übergeordneten Knoten stellt sicher, dass das Ereignis aufgerufen wird, und ruft dann one () auf, um ein Ereignis dynamisch zu registrieren, das nur einmal ausgeführt wird. (Dies bietet ähnliche Funktionen wie Rebinds).
quelle
One()
Funktion funktionierte inchrome
, aber nichtsafari
inMac
.Sie können den gebundenen Elementen eine CSS-Klasse hinzufügen und sie dann herausfiltern:
Diese Methode kann auch für Plugins verwendet werden:
quelle
aber ich würde wahrscheinlich untersuchen, warum es zweimal aufgerufen wird, bevor ich eine Art Problemumgehung mache.
quelle
bound
an diesomeMethod()
der globale Namensraum angehängt ist, anstatt ihn zu verschmutzen.Wenn Sie nur einmal an das Objekt binden möchten, sollten Sie ein Flag implementieren und sich an dieses Objekt halten.
Beispielsweise:
quelle
Sie können diese jQuery-Erweiterungsfunktion verwenden.
Anstatt dies zu tun
Du machst das
Jetzt, wenn ich eine Funktion habe
Und ich nenne es mehrmals
Es macht es nur einmal.
Beachten Sie, dass die Erweiterung funktioniert, indem Sie sowohl die UID als auch den Typ überprüfen. Dies bedeutet, dass Sie verschiedene Arten von Handlern mit derselben UID binden können. Möglicherweise möchten Sie dies. Um es zu ändern, bearbeiten.
var dataStr = type+"-handler-"+uid;
Mit so etwas wie
var dataStr = "handler-"+uid;
quelle
Ich habe auch versucht, die Methode off and on jquery zum Binden von Ereignissen nur einmal mit dem dom-Element zu verwenden, das noch nicht vorhanden ist oder das dom-Element noch nicht erstellt wurde.
Dieser Code funktionierte nicht richtig
Ich bin auf eine sehr lukrative Methode gestoßen, die eine Methode ist. Dies ist sehr nützlich, wenn Sie ein Ereignis nur einmal binden möchten.
Das Dokument finden Sie hier http://api.jquery.com/one/
Dies ist dasselbe wie die Methode 'on', unterscheidet sich jedoch in ihrem Verhalten, sich nicht an das Ereignis für mehrere Selektoren zu halten.
quelle
Sie können dies mit reinem JS erreichen, indem Sie die addEventListener- Methode und seine einmalige Option verwenden
quelle