Mam obiekt, który zawiera metody. Te metody są umieszczane w obiekcie wewnątrz anonimowej funkcji. To wygląda tak:
var t = {};
window.document.addEventListener("keydown", function(e) {
t.scroll = function(x, y) {
window.scrollBy(x, y);
};
t.scrollTo = function(x, y) {
window.scrollTo(x, y);
};
});
(kodu jest dużo więcej, ale to wystarczy, aby pokazać problem)
Teraz chcę w niektórych przypadkach zatrzymać detektor zdarzeń. Dlatego próbuję zrobić removeEventListener, ale nie mogę dowiedzieć się, jak to zrobić. W innych pytaniach przeczytałem, że nie jest możliwe wywołanie funkcji removeEventListener na funkcjach anonimowych, ale czy tak też jest w tej sytuacji?
Mam metodę in t utworzoną wewnątrz funkcji anonimowej i dlatego pomyślałem, że to możliwe. Wygląda tak:
t.disable = function() {
window.document.removeEventListener("keydown", this, false);
}
Dlaczego nie mogę tego zrobić?
Czy jest jakiś inny (dobry) sposób, aby to zrobić?
Informacje o bonusach; musi to działać tylko w Safari, stąd brak obsługi IE.
(Elem.setUserData('eventListener', function(e){console.log('Event fired.');}, null);
a następnie wykonaj Elem.addEventListener ('event', Elem.getUserData ('eventListener'), false); ... i to samo dla removeEventListener. Mam nadzieję, że widzisz to dobrze.Odpowiedzi:
Uważam, że to jest sens funkcji anonimowej, brakuje jej nazwy ani sposobu, aby się do niej odwołać.
Gdybym był tobą, utworzyłbym po prostu nazwaną funkcję lub umieścił ją w zmiennej, abyś miał do niej odniesienie.
Możesz go następnie usunąć przez
źródło
this
kluczowe może być mylące. Dobrym miejscem do przeczytania jest quirksmode.org/js/this.htmlthis
odwołuje się do elementu, do którego jest dodawany detektor, a nie do samego zdarzenia (które byłoby parametreme
). Dlategothis === e.currentTarget
. przeczytaj developer.mozilla.org/en-US/docs/Web/API/EventTarget/…jeśli jesteś wewnątrz właściwej funkcji, możesz użyć arguments.callee jako odniesienia do funkcji. jak w:
EDYCJA: to nie zadziała, jeśli pracujesz w trybie ścisłym (
"use strict";
)źródło
button.addEventListener('click', function handler() { this.removeEventListener('click', handler); });
Wersja rozwiązania Otto Nascarelli , która działa w trybie ścisłym, to:
źródło
Może być kilka funkcji anonimowych, keydown 1
Ostrzeżenie: działa tylko w
Chrome Dev Tools
i nie może być użyte w kodzie : linkźródło
getEventListeners
wydaje się być częścią narzędzi deweloperskich Chrome, więc nie nadaje się do niczego innego niż debugowanie.w nowoczesnych przeglądarkach możesz wykonać następujące czynności ...
https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Parameters
źródło
Niezbyt anonimowa opcja
Odkąd otrzymałem informację zwrotną od Andy'ego ( całkiem słusznie, ale tak jak w przypadku wielu przykładów, chciałem pokazać kontekstowe rozwinięcie pomysłu ), oto mniej skomplikowany wykład:
Pozwala to na efektywnie anonimową strukturę funkcji, pozwala uniknąć użycia praktycznie przestarzałego odbiorcy i umożliwia łatwe usunięcie.
Nawiasem mówiąc : usunięcie elementu skryptu natychmiast po ustawieniu słuchacza jest uroczą sztuczką do ukrycia kodu, który wolałby nie był oczywisty dla wścibskich oczu ( zepsułoby niespodziankę ;-)
Więc metoda ( prościej ) to:
źródło
Nie jest to idealne rozwiązanie, ponieważ usuwa wszystko, ale może działać dla twoich potrzeb:
Node.cloneNode ()
źródło
Metoda JavaScript : addEventListener rejestruje określony detektor w EventTarget (Element | dokument | Okno), na którym jest wywoływany.
EventTarget. addEventListener ( EVENT_TYPE , handler_function, Bubbling | Przechwytywanie );
Zdarzenia myszy, klawiatury Przykładowy test w konsoli internetowej:
removeEventListener usuwa detektor zdarzeń zarejestrowany wcześniej przez EventTarget.addEventListener ().
mogę uzyć
źródło
Aby przedstawić bardziej aktualne podejście do tego zagadnienia:
źródło
Natknąłem się na ten sam problem i było to najlepsze rozwiązanie, jakie mogłem uzyskać:
Pamiętaj, że przetestowałem to tylko dla
window
elementu i'mousemove'
wydarzenia, więc mogą wystąpić problemy z tym podejściem.źródło
Prawdopodobnie nie jest to najlepsze rozwiązanie pod względem tego, o co prosisz. Nadal nie ustaliłem skutecznej metody usuwania funkcji anonimowej zadeklarowanej w trakcie wywołania detektora zdarzeń.
Osobiście używam zmiennej do przechowywania
<target>
i deklarowania funkcji poza wywołaniem detektora zdarzeń, np .:const target = document.querySelector('<identifier>');
function myFunc(event) {
function code;
}
target.addEventListener('click', myFunc);
Następnie, aby usunąć słuchacza:
target.removeEventListener('click', myFunc);
Nie jest to najlepsza rekomendacja, którą otrzymasz, ale aby usunąć anonimowe funkcje, jedynym rozwiązaniem, które uznałem za przydatne, jest usunięcie, a następnie zastąpienie elementu HTML. Jestem pewien, że musi być lepsza metoda waniliowego JS, ale jeszcze jej nie widziałem.
źródło
Wiem, że to dość stary wątek, ale pomyślałem, że mógłbym włożyć swoje dwa centy dla tych, którzy uznają to za przydatne.
Skrypt (przepraszam za nietwórcze nazwy metod):
I możesz go używać w ten sposób:
źródło
źródło
addEventListener
.