Jaki jest najlepszy sposób na usunięcie funkcji dodanej jako detektor zdarzeń za pomocą bind () w JavaScript?
Przykład
(function(){
// constructor
MyClass = function() {
this.myButton = document.getElementById("myButtonID");
this.myButton.addEventListener("click", this.clickListener.bind(this));
};
MyClass.prototype.clickListener = function(event) {
console.log(this); // must be MyClass
};
// public method
MyClass.prototype.disableButton = function() {
this.myButton.removeEventListener("click", ___________);
};
})();
Jedynym sposobem, jaki przychodzi mi do głowy, jest śledzenie każdego słuchacza dodanego za pomocą bind.
Powyższy przykład z tą metodą:
(function(){
// constructor
MyClass = function() {
this.myButton = document.getElementById("myButtonID");
this.clickListenerBind = this.clickListener.bind(this);
this.myButton.addEventListener("click", this.clickListenerBind);
};
MyClass.prototype.clickListener = function(event) {
console.log(this); // must be MyClass
};
// public method
MyClass.prototype.disableButton = function() {
this.myButton.removeEventListener("click", this.clickListenerBind);
};
})();
Czy są na to lepsze sposoby?
javascript
events
listener
bind
takfuruya
źródło
źródło
this.clickListener = this.clickListener.bind(this);
ithis.myButton.addEventListener("click", this.clickListener);
bindAll
funkcję, która upraszcza metody wiązania. Wewnątrz inicjalizatora obiektu po prostu_.bindAll(this)
ustawiasz każdą metodę w obiekcie na powiązaną wersję. Ewentualnie, jeśli tylko chcą wiązać pewne metody (co polecam, aby zapobiec przypadkowemu przecieki pamięci), można podać je jako argumenty_.bindAll(this, "foo", "bar") // this.baz won't be bound
.Odpowiedzi:
Chociaż to, co powiedział @machineghost, było prawdą, zdarzenia są dodawane i usuwane w ten sam sposób, brakująca część równania wyglądała tak:
Zobacz Czy bind () zmienia odwołanie do funkcji? | Jak ustawić na stałe?
Aby więc ją dodać lub usunąć, przypisz odwołanie do zmiennej:
To działa zgodnie z oczekiwaniami dla mnie.
źródło
.addEventListener(type, listener)
i.removeEventListener(type, listener)
do dodawania i usuwania zdarzeń w elemencie. W obu przypadkach odwołanie do funkcji opisane w rozwiązaniu można przekazać jakolistener
parametr, z"click"
typem. developer.mozilla.org/en-US/docs/Web/API/EventTarget/…Dla tych, którzy mają ten problem podczas rejestracji / usuwania nasłuchiwania komponentu React do / ze sklepu Flux, dodaj poniższe linie do konstruktora komponentu:
źródło
this.onChange = this.onChange.bind(this)
właściwie to jest to, czego szukałem. Funkcja związana nathis
zawsze :)Nie ma znaczenia, czy używasz funkcji związanej, czy nie; usuwasz go w taki sam sposób, jak każdy inny program obsługi zdarzeń. Jeśli Twoim problemem jest to, że powiązana wersja jest własną unikalną funkcją, możesz albo śledzić powiązane wersje, albo użyć
removeEventListener
podpisu, który nie przyjmuje określonej procedury obsługi (chociaż oczywiście spowoduje to usunięcie innych programów obsługi zdarzeń tego samego typu ).(Na marginesie,
addEventListener
nie działa we wszystkich przeglądarkach; naprawdę powinieneś używać biblioteki, takiej jak jQuery, do podłączania zdarzeń w sposób między przeglądarkami. Ponadto jQuery ma koncepcję zdarzeń w przestrzeni nazw, która umożliwia możesz powiązać się z „click.foo”; kiedy chcesz usunąć zdarzenie, możesz powiedzieć jQuery „usuń wszystkie zdarzenia foo” bez konieczności znajomości konkretnego modułu obsługi lub usuwania innych funkcji obsługi).źródło
off
lubunbind
metodzie. Aby usunąć wszystkich słuchaczy z elementu, musisz śledzić ich dodawanie (co może zrobić za Ciebie jQuery lub inne biblioteki).Rozwiązanie jQuery:
źródło
Mieliśmy ten problem z biblioteką, której nie mogliśmy zmienić. Office Fabric UI, co oznaczało, że nie mogliśmy zmienić sposobu, w jaki zostały dodane programy obsługi zdarzeń. Sposób, w jaki to rozwiązaliśmy, polegał na nadpisaniu
addEventListener
naEventTarget
prototypie.Spowoduje to dodanie nowej funkcji do obiektów
element.removeAllEventListers("click")
(oryginalny post: Usuń uchwyt kliknięcia z nakładki okna dialogowego tkaniny )
źródło
Oto rozwiązanie:
źródło
można użyć o ES7:
źródło
Jeśli chcesz użyć opcji „onclick”, jak zasugerowano powyżej, możesz spróbować tego:
Mam nadzieję, że to pomoże.
źródło
Minęło trochę czasu, ale MDN ma na to super wyjaśnienie. To pomogło mi bardziej niż rzeczy tutaj.
MDN :: EventTarget.addEventListener - wartość „this” w procedurze obsługi
Stanowi doskonałą alternatywę dla funkcji handleEvent.
Oto przykład z bindem i bez:
Problem w powyższym przykładzie polega na tym, że nie można usunąć nasłuchiwania za pomocą bind. Innym rozwiązaniem jest użycie specjalnej funkcji o nazwie handleEvent do przechwytywania zdarzeń:
źródło