Ich binde ein Klickereignis mit einer Schaltfläche:
$('#myButton').bind('click', onButtonClicked);
In einem Szenario wird dies mehrmals aufgerufen. Wenn ich also einen mache, trigger
sehe ich mehrere Ajax-Aufrufe, die ich verhindern möchte.
Wie mache ich das bind
nur, wenn es vorher nicht gebunden ist.
Antworten:
Update 24. August '12 : In jQuery 1.8 ist es nicht mehr möglich, mit auf die Ereignisse des Elements zuzugreifen
.data('events')
. ( Einzelheiten finden Sie in diesem Fehler .) Es ist möglich, mitjQuery._data(elem, 'events')
einer internen Datenstruktur auf dieselben Daten zuzugreifen , die nicht dokumentiert ist und daher nicht zu 100% garantiert stabil bleibt. Dies sollte jedoch kein Problem sein, und die entsprechende Zeile des obigen Plugin-Codes kann wie folgt geändert werden:jQuery-Ereignisse werden in einem Datenobjekt namens aufgerufen
events
, sodass Sie folgendermaßen suchen können:Es wäre natürlich am besten, wenn Sie Ihre Anwendung so strukturieren könnten, dass dieser Code nur einmal aufgerufen wird.
Dies könnte in ein Plugin eingekapselt werden:
Sie könnten dann anrufen:
quelle
<a>
? Denn wenn ich es versuche, steht aufjQuery._data()
folgendem FehlerTypeError: a is undefined
var data = jQuery._data(this[0], 'events')[type];
in einen Try-Catch einschließen und im Catch false zurückgeben. Wenn keine Ereignisse an diese [0] gebunden sind, führt ein Aufruf von [Typ] zu einer Variation von "Eigenschaftsklick auf undefinierte oder Nullreferenz kann nicht abgerufen werden", und dies sagt Ihnen natürlich auch, was Sie wissen müssen.for (var i = 0; i < data.length; i++) { if (data[i].handler.toString() === fn.toString()) { return true; } }
Noch eine Möglichkeit: Markieren Sie solche Schaltflächen mit einer CSS-Klasse und einem Filter:
In neueren jQuery-Versionen ersetzen Sie
bind
durchon
:quelle
Bei Verwendung von jQuery 1.7+:
Sie können
off
vorher anrufenon
:Wenn nicht:
Sie können das erste Ereignis einfach aufheben:
quelle
.unbind('click', onButtonClicked)
. Siehe das Handbuch$(sel).unbind("click.myNamespace");
$('#myButton').unbind('click', onButtonClicked).bind('click', onButtonClicked);
Ich sehe am besten live () oder delegate (), um das Ereignis in einem übergeordneten Element und nicht in jedem untergeordneten Element zu erfassen.
Befindet sich Ihre Schaltfläche in einem # Elternelement, können Sie Folgendes ersetzen:
$('#myButton').bind('click', onButtonClicked);
durch
$('#parent').delegate('#myButton', 'click', onButtonClicked);
auch wenn #myButton noch nicht existiert, wenn dieser Code ausgeführt wird.
quelle
Ich habe ein sehr kleines Plugin namens "einmal" geschrieben, das das macht. Aus und Ein im Element ausführen.
Und einfach:
quelle
off
entferne aber nicht alle Handler für den angegebenen Typ? Das heißt, wenn es einen separaten Klick-Handler gäbe, der nicht mit demselben Element zusammenhängt, würde dieser dann nicht auch entfernt werden?Warum nicht nutzen?
unbind()
Vorbind()
quelle
$('#myButton').off().on('click', onButtonClicked);
funktioniert auch bei mir.Hier ist meine Version:
Verwendung:
quelle
Basierend auf @ konrad-garus Antwort, aber mit
data
, da ich glaube,class
sollte hauptsächlich für das Styling verwendet werden.quelle
Um das Überprüfen / Binden / Aufheben der Bindung zu vermeiden, können Sie Ihren Ansatz ändern! Warum benutzt du nicht Jquery .on ()?
Da Jquery 1.7, .live (), .delegate () veraltet ist, können Sie jetzt .on () to verwenden
Dies bedeutet, dass Sie ein Ereignis an ein übergeordnetes Element anhängen können, das noch vorhanden ist, und untergeordnete Elemente anhängen können, unabhängig davon, ob sie vorhanden sind oder nicht!
Wenn Sie .on () wie folgt verwenden:
Wenn Sie ein Ereignis abfangen, klicken Sie auf das übergeordnete Element und suchen Sie das untergeordnete Element '#myButton', falls vorhanden ...
Wenn Sie also ein untergeordnetes Element entfernen oder hinzufügen, müssen Sie sich keine Gedanken darüber machen, ob Sie die Ereignisbindung hinzufügen oder entfernen möchten.
quelle
.off
der ich glaube, dass sie nicht verwandte Handler in diesem Prozess entfernen würde.Versuchen:
quelle
quelle
Seit Juni 2019 habe ich die Funktion aktualisiert (und sie funktioniert für das, was ich brauche).
quelle
JQuery hat folgende Lösung :
Äquivalent:
quelle