Es ist wirklich einfach, einen Event-Listener in jQuery hinzuzufügen. Es ist genauso einfach, einen Event-Listener zu entfernen. Sie möchten vielleicht einen Listener entfernen, weil Sie für dieses Ereignis keine Aktionen mehr ausführen möchten, um den Speicherverbrauch zu reduzieren, oder beides. Aber nehmen wir an, Sie haben mehrere Listener für dasselbe Ereignis angehängt. Wie entfernen Sie nur einen davon? Namespacing kann helfen.
Schauen wir uns den Code an.
$("#element")
.on("click", doSomething)
.on("click", doSomethingElse);
Sowohl doSomething als auch doSomethingElse werden ausgelöst, wenn das von uns ausgewählte Element angeklickt wird. Das ist gut. Es ist ein Vorteil der Verwendung von jQuery zum Binden von Ereignissen im Vergleich zum sehr altmodischen onclick, das zuvor deklarierte Event-Handler überschreiben würde.
Nehmen wir nun an, Sie möchten den ersten dieser Event-Listener entfernen, den, der doSomething auslöst. Wie machen Sie das?
$("#element").off("click");
Seien Sie vorsichtig, das würde beide Handler entfernen, was nicht das ist, was wir wollen.
Glücklicherweise nimmt jQuery denselben zweiten Parameter mit .off() entgegen, wie auch mit .on().
$("#element").off("click", doSomething);
Das ist großartig, wenn Sie eine Referenz auf eine tatsächliche Funktion haben, die Sie als diesen Parameter übergeben können. Aber was ist, wenn Sie diese Referenz nicht haben? Entweder weil Sie nicht wissen, was sie ist, oder weil Sie eine anonyme Funktion als Handler verwendet haben, wie hier:
$("#element")
.on("click", function() {
console.log("doSomething");
});
Wie können Sie diesen sicher entfernen, ohne versehentlich andere Klick-Handler zu entfernen? Namespaced Events!
Anstatt nur click als Namen des Ereignisses zu verwenden, können Sie click.namespace verwenden.
$("#element")
.on("click.myNamespace", function() {
console.log("doSomething");
});
Jetzt können Sie .off() mit genau diesem Event-Namen verwenden, um *nur* diesen zu entfernen.
$("#element").off("click.myNamespace");
Nur eine dieser coolen, nützlichen Dinge in jQuery. Selbst mit modernem Event-Binding mit addEventListener und removeEventListener wäre das etwas knifflig (glaube ich).
Ich habe es kürzlich in diesem Bookmarklet verwendet, das ich zur Überprüfung der Zeilenlänge erstellt habe. Ich wollte im Grunde ein mouseenter-Ereignis für jedes einzelne Element auf der Seite binden (mittels Delegation) und dann, wenn eines angeklickt wird, beide Ereignisse aufheben. Aber ich wollte vorsichtig sein, nichts zu entfernen, was ich nicht selbst gebunden hatte. Daher Namespacing!
Das funktioniert auch mit Zepto und ist unglaublich hilfreich, wenn man Unit-Tests schreibt und seine Objekte für nachfolgende Tests bereinigen muss.
Ich kannte Namespaces, aber ehrlich gesagt dachte ich nicht, dass sie nativ in jQuery implementiert sind. Ich dachte, man müsste manuell einen Event-Listener hinzufügen, um namespaced Events in einem Plugin zu verwenden.
Danke für den Tipp!
Eine weitere coole Sache an Namespaces ist, dass man mehrere Ebenen davon haben kann. Zum Beispiel könnte man tun:
$('.some-div').on('click.myPlugin.submitButtonClick', '.submit-button', handlerFunction)so dass man .off() für alle Events in einem Namespace oder nur für eines davon aufrufen kann.
Dieser Artikel sollte auch das Abbrechen aller Ereignisse aus einem Namespace erwähnen, was für jQuery-Plugins sehr nützlich ist.
+1
Es ist überraschend, dass diese kleine Information online so schwer zu finden ist. Ein kleines jsfiddle hat aber funktioniert, daher suchte ich nach einem Ort, um zu überprüfen, ob meine Vermutung richtig war, dass NUR der Namespace an unbind übergeben wird, um ein Event zu entfernen.
Danke
Ich habe über Namespaces nachgedacht und mich gefragt, ob es eine Möglichkeit gibt, Geolocation in einen Namespace zu injizieren, damit RSS-Feeds in GeoRSS konvertiert werden. Ist das mit jQuery möglich?
Kann man
$("#element").on("click",function(){})verwenden? Ich dachte, der einzige Weg sei$("element").onclick(function(){});. Hat die erste Methode Vorteile?Ich glaube nicht, dass
onclick()eine Funktion in jQuery ist,click()schon. Der Unterschied, glaube ich, ist, dasson()Elemente bindet, unabhängig davon, ob sie im DOM vorhanden sind oder später dynamisch hinzugefügt werden.Nicht "onclick", sondern "click", was eine Abkürzung für
on("click", function)ist. Mitonkönnen Sie mehrere Ereignisse anhängen –$(el).on("click focus", function (){});, außerdem können Sie ein einzelnes Ereignis erstellen, das ausgelöst wird, wenne.targetsich im Event-Bubble befindet, was die Leistung steigert.$("table").on("click", "td", function () {});– einzelnes Ereignis$("table td").click(function () {});– Anzahl der Ereignisse == $(‘table td’).lengthWie erwähnt gibt es auch Unterstützung dafür in Zepto, aber ich habe bemerkt, dass Sie .MyNamespace für native Events wie
click.MyNamespaceoderfocus.MyNamespaceverwenden, und für benutzerdefinierte Events verwenden Sie eine umgekehrte Syntax:MyNamespace:eventName.Es scheint, dass jQuery schlau genug ist, beides zu erkennen, aber wenn Sie möchten, dass es sowohl in Zepto als auch in jQuery funktioniert, müssen Sie für benutzerdefinierte Events die unterschiedliche Syntax verwenden.
Ich habe diesen Kampf mit Intimidatetime geführt. Bei Standard-Native-Events verwendet es
click.intimidatetime, aber für benutzerdefinierte Events muss ichintimidatetime:openoderintimidatetime:changeverwenden.Vielen Dank für diesen Beitrag. Das wird einige Probleme beheben, die ich in der Vergangenheit mit einigen meiner Funktionen hatte.
Hallo Chris, kannst du ein Schnipsel-Tutorial für die Navbar-Animation posten, wie sie bei Digitally Imported gezeigt wird?
http://www.di.fm
Klicken Sie auf Kanäle.
Ich glaube, es ist jQuery UI, bin mir aber nicht sicher.
Ah, das ist großartig, werde das sofort ausprobieren.
Danke!
:D
Die beiden Anwendungsfälle dafür sind, wenn wir den Namen der betreffenden Funktion nicht kennen oder wenn eine anonyme Funktion verwendet wurde. Der einzige Weg, das Namespace zu implementieren, scheint jedoch zum Zeitpunkt der Deklaration der Funktion zu sein, wo Sie eine Funktion mit einem bekannten Namen übergeben könnten. Es scheint nur eine alternative Methode zum Übergeben einer benannten Funktion zu sein? Gibt es noch andere Verwendungszwecke, die ich übersehe?
Wenn Sie Proxies verwenden (
$.proxy) und sie später trennen müssen, müssen Sie entweder jeden erstellten Proxy verfolgen oder einfach Namespacing verwenden.Das ist fantastisch.
Eine Sache, die sehr nett ist, aber mit der ich Schwierigkeiten hatte, ist **Dynamisches Namespacing**... unten ist, wie ich Events am liebsten binde (im
json-Format)In diesem Szenario kann ich die Namensräume nicht dynamisch machen, aber in diesem nächsten Szenario könnte ich einen dynamischen Namespace erstellen
Dynamisches Namespacing kann für Plugins und ähnliches sehr nützlich sein, wenn Sie mehr als eine Instanz eines Plugins auf einer Seite erstellen möchten, aber beim Zerstören des Plugins nicht alle anderen Bindungen aufheben möchten.
Sehr gut gemacht. Ich plane, Ihre jQuery-Tutorials später in diesem Monat zu besuchen.
Wissen Sie, ob jemand ein Beispiel hat, wie man FitText für den Text in Gitterzellen (Kendoui jQuery Grid) verwendet?