Sytuacja jest trochę jak-
var someVar = some_other_function();
someObj.addEventListener("click", function(){
some_function(someVar);
}, false);
Problem polega na tym, że wartość parametru someVar
nie jest widoczna w funkcji nasłuchiwania addEventListener
, gdzie prawdopodobnie jest ona traktowana jako nowa zmienna.
javascript
dom
addeventlistener
Abhishek Yadav
źródło
źródło
Odpowiedzi:
Napisany kod nie ma absolutnie nic złego. Zarówno
some_function
isomeVar
powinny być dostępne, na wypadek, gdyby były dostępne w kontekście, w którym anonimowypowstał.
Sprawdź, czy alert daje poszukiwaną wartość, upewnij się, że będzie on dostępny w zakresie funkcji anonimowej (chyba że masz więcej kodu, który działa na tej samej
someVar
zmiennej obok wywołania doaddEventListener
)źródło
bound function
przy użyciu.bind()
metody rozwiąże problem z pętlami developer.mozilla.org/en/docs/Web/JavaScript/Reference/…Dlaczego nie pobrać argumentów z atrybutu target zdarzenia?
Przykład:
JavaScript jest językiem zorientowanym na prototypy, pamiętaj!
źródło
evt.currentTarget.myParam
? Jeśli wewnątrz „someInput” znajduje się inny element,evt.target
może odnosić się do elementu wewnętrznego. ( jsfiddle.net/qp5zguay/1 )this
! Użycie tej metody w maszynopisie wymaga jednak, aby element byłany
lub tworzył podtyp.addEventListener
takdocument
,evt.target.myParam
to nie działało dla mnie. Musiałemevt.currentTarget.myParam
zamiast tego użyć .To pytanie jest stare, ale pomyślałem, że zaoferuję alternatywę przy użyciu .bind () ES5 - dla potomności. :)
Pamiętaj tylko, że musisz ustawić swoją funkcję nasłuchiwania z pierwszym parametrem jako argumentem, który przekazujesz do bind (twoja inna funkcja), a drugim parametrem jest teraz zdarzenie (zamiast pierwszego, jak by to było) .
źródło
Function.prototype.bind()
, nie można usunąć detektora zdarzeń , lepiej zamiast tego użyć funkcji curry (patrz odpowiedź @ tomcek112)some_other_func
jest zmienną, możesz przekazać dowolną wartość, którą chceszsome_func
.Możesz po prostu powiązać wszystkie niezbędne argumenty za pomocą polecenia „bind”:
W ten sposób zawsze będziesz dostać
event
,arg1
i inne rzeczy przekazanejmyPrettyHandler
.http://passy.svbtle.com/partial-application-in-javascript-using-bind
źródło
.bind()
ale bez wartości zerowej jako pierwszego parametru. co nie działało.null
, działa dobrze z.bind(event, arg1)
, przynajmniej z VueJS.Pytanie dość stare, ale dzisiaj miałem ten sam problem. Najczystszym rozwiązaniem, jakie znalazłem, jest użycie koncepcji curry.
Kod do tego:
Nadając nazwę funkcji curry, pozwala ona wywołać Object.removeEventListener w celu wyrejestrowania eventListener w późniejszym czasie wykonywania.
źródło
Możesz dodawać i usuwać zdarzenia z argumentami, deklarując funkcję jako zmienną.
myaudio.addEventListener('ended',funcName=function(){newSrc(myaudio)},false);
newSrc
jest metodą z myaudio, ponieważ parametrfuncName
jest zmienną nazwy funkcjiMożesz usunąć słuchacza za pomocą
myaudio.removeEventListener('ended',func,false);
źródło
Możesz przekazać wartość według wartości (nie przez odniesienie) za pomocą funkcji javascript znanej jako zamknięcie :
Lub możesz napisać wspólną funkcję zawijania, taką jak
wrapEventCallback
:Oto
wrapEventCallback(func,var1,var2)
jak:źródło
someVar
wartość powinna być dostępna tylko wsome_function()
kontekście, a nie od odbiornika. Jeśli chcesz mieć to w słuchaczu, musisz zrobić coś takiego:I użyć
newVar
zamiast tego.Innym sposobem jest zwrócenie
someVar
wartościsome_function()
za używanie jej dalej w detektorze (jako nowej zmiennej lokalnej):źródło
Oto jeszcze inny sposób (ten działa wewnątrz pętli):
źródło
Function.prototype.bind () to sposób na powiązanie funkcji celu z określonym zakresem i opcjonalne zdefiniowanie
this
obiektu w funkcji celu.Lub uchwycić część zakresu leksykalnego, na przykład w pętli:
Wreszcie, jeśli
this
parametr nie jest potrzebny w ramach funkcji docelowej:źródło
Posługiwać się
A jeśli chcesz przekazać dowolną niestandardową wartość do tej anonimowej funkcji, najłatwiej to zrobić
Działa idealnie w moim projekcie. Mam nadzieję, że to pomoże
źródło
for
pętli.W ten sposób poprawnie zdałem wydarzenie.
źródło
Wysyłanie argumentów do funkcji zwrotnej eventListener wymaga utworzenia funkcji izolowanej i przekazania argumentów do tej funkcji izolowanej.
Oto fajna funkcja pomocnika, której możesz użyć. Na podstawie powyższego przykładu „hello world”).
Jedną rzeczą, która jest również potrzebna, jest utrzymanie odniesienia do funkcji, abyśmy mogli czysto usunąć słuchacza.
źródło
storeFunc
powinien być Twoją zmienną ref. Wykorzystaj usuwanie swojego słuchacza w taki sposób, aby zacząć:useEffect(() => { return () => { window.removeEventListener('scroll', storeFunc, false); } }, [storeFunc])
Jednym ze sposobów jest robienie tego za pomocą funkcji zewnętrznej :
Ta metoda zawijania anonimowej funkcji w nawiasy i natychmiastowe jej wywoływanie nazywa się IIFE (wyrażenie funkcji natychmiast wywołane )
Możesz sprawdzić przykład z dwoma parametrami w http://codepen.io/froucher/pen/BoWwgz .
źródło
Jeśli się nie mylę przy użyciu wywołania funkcji z
bind
faktycznie tworzy nową funkcję, która jest zwracana przezbind
metodę. Spowoduje to problemy później lub jeśli chcesz usunąć detektor zdarzeń, ponieważ jest to w zasadzie funkcja anonimowa:Więc weź to pod uwagę.
Jeśli używasz ES6, możesz zrobić to samo, co sugerowane, ale nieco czystsze:
źródło
fajna alternatywa dla jednej linii
źródło
Spróbuj także tych (IE8 + Chrome. Nie wiem dla FF):
Mam nadzieję, że nie ma literówek :-)
źródło
Utknąłem w tym, ponieważ używałem go w pętli do wyszukiwania elementów i dodawania do niego listy. Jeśli używasz go w pętli, to będzie działać idealnie
źródło
W 2019 r. Wiele zmian interfejsu API, najlepsza odpowiedź już nie działa, bez naprawienia błędu.
udostępnij trochę działającego kodu.
Inspirowany wszystkimi powyższymi odpowiedziami.
źródło
We wszystkich funkcjach znajduje się specjalna zmienna: argumenty . Możesz przekazać parametry jako parametry anonimowe i uzyskać do nich dostęp (według kolejności) za pomocą argumentów zmienną .
Przykład:
źródło
źródło
Poniższe podejście działało dla mnie dobrze. Zmodyfikowano stąd .
źródło
Poniższa odpowiedź jest poprawna, ale poniższy kod nie działa w IE8, jeśli załóżmy, że skompresowałeś plik js za pomocą yuicompressor. (W rzeczywistości nadal większość ludzi w USA używa IE8)
Tak więc możemy rozwiązać powyższy problem w następujący sposób i działa dobrze we wszystkich przeglądarkach
Mam nadzieję, że byłby użyteczny dla kogoś, kto kompresuje plik js w środowisku produkcyjnym.
Powodzenia!!
źródło
Poniższy kod działał dla mnie dobrze (Firefox):
Wynik:
źródło
Potrzebujesz:
źródło
Prawdopodobnie nie jest optymalny, ale wystarczająco prosty dla tych, którzy nie znają się na superjs. Umieść funkcję wywołującą addEventListener we własnej funkcji. W ten sposób wszelkie przekazane do niego wartości funkcji zachowują swój własny zakres i możesz iterować tę funkcję tyle, ile chcesz.
Przykład Pracowałem z odczytem pliku, ponieważ potrzebowałem przechwycić i wyświetlić podgląd obrazu i nazwy pliku. Zajęło mi trochę czasu, aby uniknąć problemów asynchronicznych podczas korzystania z typu przesyłania wielu plików. Przypadkowo zobaczyłem tę samą „nazwę” na wszystkich rendererach pomimo przesyłania różnych plików.
Pierwotnie cała funkcja readFile () znajdowała się w funkcji readFiles (). Spowodowało to problemy z asynchronicznym zasięgiem.
źródło
chciałbym tylko dodać. jeśli ktoś dodaje funkcję, która aktualizuje pola wyboru do detektora zdarzeń, należy użyć
event.target
zamiastthis
zaktualizować pola wyboru.źródło
Mam bardzo uproszczone podejście. To może działać dla innych, ponieważ pomogło mi. To jest ... Jeśli masz wiele elementów / zmiennych przypisanych do tej samej funkcji i chcesz przekazać odwołanie, najprostszym rozwiązaniem jest ...
Otóż to. To zadziałało dla mnie. Tak prosty.
źródło
Inna alternatywa, być może nie tak elegancka jak użycie bind, ale jest ważna dla zdarzeń w pętli
Został przetestowany pod kątem rozszerzeń Google Chrome i być może e.srcElement musi zostać zastąpiony przez e.source w innych przeglądarkach
Znalazłem to rozwiązanie, używając komentarza opublikowanego przez Imatorię, ale nie mogę oznaczyć go jako przydatny, ponieważ nie mam wystarczającej reputacji: D
źródło
To rozwiązanie może się przydać
lub wiążące wartości będą również dobre
źródło