Die Situation ist etwas wie-
var someVar = some_other_function();
someObj.addEventListener("click", function(){
some_function(someVar);
}, false);
Das Problem ist, dass der Wert von someVar
in der Listener-Funktion von nicht sichtbar ist addEventListener
, wo er wahrscheinlich als neue Variable behandelt wird.
javascript
dom
addeventlistener
Abhishek Yadav
quelle
quelle
Antworten:
An dem von Ihnen geschriebenen Code ist absolut nichts auszusetzen. Beide
some_function
undsomeVar
sollten zugänglich sein, falls sie in dem anonymen Kontext verfügbar warenwurde erstellt.
Überprüfen Sie, ob die Warnung den gesuchten Wert enthält. Stellen Sie sicher, dass im Bereich der anonymen Funktion darauf zugegriffen werden kann (es sei denn, Sie haben mehr Code, der mit derselben
someVar
Variablen neben dem Aufruf von arbeitetaddEventListener
).quelle
bound function
mit der.bind()
Methode das Problem mit Schleifen entwickler.movilla.org/en/docs/Web/JavaScript/Reference/…Warum nicht einfach die Argumente aus dem Zielattribut des Ereignisses abrufen?
Beispiel:
JavaScript ist eine prototyporientierte Sprache.
quelle
evt.currentTarget.myParam
? Wenn sich in 'someInput' ein anderes Element befindet,evt.target
kann sich das auf das innere Element beziehen. ( jsfiddle.net/qp5zguay/1 )this
! Die Verwendung dieser Methode in Typoskript erfordert jedoch, dass das Element ein Untertyp istany
oder erstellt wird.addEventListener
ist fürdocument
,evt.target.myParam
hat bei mir nicht funktioniert. Ich mussteevt.currentTarget.myParam
stattdessen verwenden.Diese Frage ist alt, aber ich dachte, ich würde eine Alternative mit .bind () von ES5 anbieten - für die Nachwelt. :) :)
Beachten Sie jedoch, dass Sie Ihre Listener-Funktion mit dem ersten Parameter als Argument einrichten müssen, das Sie an bind übergeben (Ihre andere Funktion), und dass der zweite Parameter jetzt das Ereignis ist (anstelle des ersten, wie es gewesen wäre). .
quelle
Function.prototype.bind()
Sie verwenden, können Sie den Ereignis-Listener nicht entfernen. Verwenden Sie stattdessen besser eine Curry-Funktion (siehe @ tomcek112-Antwort)some_other_func
eine Variable, können Sie einen beliebigen Wert übergebensome_func
.Sie können einfach alle erforderlichen Argumente mit 'bind' binden:
Auf diese Weise bringen Sie immer das
event
,arg1
und andere Sachen übergebenmyPrettyHandler
.http://passy.svbtle.com/partial-application-in-javascript-using-bind
quelle
.bind()
aber ohne die Null als ersten Parameter. was nicht funktioniert hat.null
, es funktioniert gut mit.bind(event, arg1)
, zumindest mit VueJS.Ziemlich alte Frage, aber ich hatte heute das gleiche Problem. Die sauberste Lösung, die ich gefunden habe, ist das Curry- Konzept .
Der Code dafür:
Durch Benennen der Curry-Funktion können Sie Object.removeEventListener aufrufen, um die Registrierung des eventListener zu einem späteren Zeitpunkt aufzuheben.
quelle
Sie können Ereignislistener mit Argumenten hinzufügen und entfernen, indem Sie eine Funktion als Variable deklarieren.
myaudio.addEventListener('ended',funcName=function(){newSrc(myaudio)},false);
newSrc
ist die Methode mit myaudio als ParameterfuncName
ist die Variable des FunktionsnamensSie können den Listener mit entfernen
myaudio.removeEventListener('ended',func,false);
quelle
Sie können somevar als Wert (nicht als Referenz) über eine Javascript-Funktion übergeben, die als Closure bezeichnet wird :
Oder Sie schreiben eine allgemeine Wrap-Funktion wie
wrapEventCallback
:Hier
wrapEventCallback(func,var1,var2)
ist wie:quelle
someVar
Wert sollte nur imsome_function()
Kontext zugänglich sein , nicht vom Hörer. Wenn Sie es im Hörer haben möchten, müssen Sie Folgendes tun:und verwenden
newVar
stattdessen verwenden.Die andere Möglichkeit besteht darin, den
someVar
Wert von zurückzugeben,some_function()
um ihn im Listener weiter zu verwenden (als neue lokale Variable):quelle
Hier ist noch ein anderer Weg (Dieser funktioniert innen für Schleifen):
quelle
Mit Function.prototype.bind () können Sie eine Zielfunktion an einen bestimmten Bereich binden und optional das
this
Objekt innerhalb der Zielfunktion definieren .Oder um einen Teil des lexikalischen Bereichs zu erfassen, beispielsweise in einer Schleife:
Wenn der
this
Parameter innerhalb der Zielfunktion nicht benötigt wird:quelle
Verwenden
Wenn Sie einen benutzerdefinierten Wert an diese anonyme Funktion übergeben möchten, ist dies am einfachsten
Funktioniert perfekt in meinem Projekt. Hoffe das wird helfen
quelle
for
Schleife beibehielt .So habe ich das Ereignis richtig bestanden.
quelle
Das Senden von Argumenten an die Rückruffunktion eines eventListener erfordert das Erstellen einer isolierten Funktion und das Übergeben von Argumenten an diese isolierte Funktion.
Hier ist eine nette kleine Hilfsfunktion, die Sie verwenden können. Basierend auf dem obigen Beispiel "Hallo Welt".)
Eine Sache, die auch benötigt wird, ist, einen Verweis auf die Funktion beizubehalten, damit wir den Listener sauber entfernen können.
quelle
storeFunc
sollte Ihre Referenzvariable sein. Setzen Sie Ihre Listener-Entfernung in einen useEffect wie diesen und Sie können loslegen:useEffect(() => { return () => { window.removeEventListener('scroll', storeFunc, false); } }, [storeFunc])
Eine Möglichkeit besteht darin, dies mit einer äußeren Funktion zu tun :
Diese Methode, eine anonyme Funktion in Klammern zu setzen und sofort aufzurufen, wird als IIFE (Sofort aufgerufener Funktionsausdruck) bezeichnet.
Sie können ein Beispiel mit zwei Parametern unter http://codepen.io/froucher/pen/BoWwgz überprüfen .
quelle
Wenn ich mich nicht irre, wenn ich die Funktion mit
bind
aufrufe, wird tatsächlich eine neue Funktion erstellt, die von derbind
Methode zurückgegeben wird. Dies führt später zu Problemen oder wenn Sie den Ereignis-Listener entfernen möchten, da dies im Grunde wie eine anonyme Funktion ist:Denken Sie also daran.
Wenn Sie ES6 verwenden, können Sie das Gleiche wie vorgeschlagen tun, jedoch etwas sauberer:
quelle
schöne einzeilige Alternative
quelle
Versuchen Sie auch diese (IE8 + Chrome. Ich weiß nicht für FF):
Hoffe es gibt keine Tippfehler :-)
quelle
Ich steckte darin fest, als ich es in einer Schleife verwendete, um Elemente zu finden und Listener hinzuzufügen. Wenn Sie es in einer Schleife verwenden, funktioniert dies einwandfrei
quelle
Im Jahr 2019 viele API-Änderungen, die beste Antwort funktioniert nicht mehr, ohne Fehler zu beheben.
Teilen Sie einen Arbeitscode.
Inspiriert von allen obigen Antworten.
quelle
In allen Funktionen gibt es eine spezielle Variable: Argumente . Sie können Ihre Parameter als anonyme Parameter übergeben und über die Argumente (nach Reihenfolge) darauf zugreifen .
Beispiel:
quelle
quelle
Der folgende Ansatz hat bei mir gut funktioniert. Von hier geändert .
quelle
Die folgende Antwort ist richtig, aber der folgende Code funktioniert in IE8 nicht, wenn Sie die js-Datei mit yuicompressor komprimiert haben. (Tatsächlich verwenden immer noch die meisten US-Völker IE8)
Daher können wir das oben genannte Problem wie folgt beheben und es funktioniert in allen Browsern einwandfrei
Hoffe, es wäre nützlich für jemanden, der die js-Datei in der Produktionsumgebung komprimiert.
Viel Glück!!
quelle
Der folgende Code hat bei mir gut funktioniert (Firefox):
Ausgabe:
quelle
Du brauchst:
quelle
Wahrscheinlich nicht optimal, aber einfach genug für diejenigen, die nicht besonders versiert sind. Fügen Sie die Funktion, die addEventListener aufruft, in eine eigene Funktion ein. Auf diese Weise behalten alle übergebenen Funktionswerte ihren eigenen Bereich bei, und Sie können diese Funktion beliebig oft durchlaufen.
Beispiel Ich habe mit dem Lesen von Dateien gearbeitet, da ich eine Vorschau des Bildes und des Dateinamens erfassen und rendern musste. Ich habe eine Weile gebraucht, um asynchrone Probleme bei der Verwendung eines Upload-Typs mit mehreren Dateien zu vermeiden. Ich würde versehentlich auf allen Renderings den gleichen 'Namen' sehen, obwohl ich verschiedene Dateien hochgeladen habe.
Ursprünglich befand sich die gesamte Funktion readFile () in der Funktion readFiles (). Dies verursachte Probleme mit dem asynchronen Gültigkeitsbereich.
quelle
möchte nur hinzufügen. Wenn jemand eine Funktion hinzufügt, die Kontrollkästchen für einen Ereignis-Listener aktualisiert, müssen Sie diese verwenden,
event.target
anstattthis
die Kontrollkästchen zu aktualisieren.quelle
Ich habe einen sehr simplen Ansatz. Dies kann für andere funktionieren, da es mir geholfen hat. Es ist ... Wenn Sie mehreren Elementen / Variablen dieselbe Funktion zugewiesen haben und die Referenz übergeben möchten, ist die einfachste Lösung ...
Das ist es. Es hat bei mir funktioniert. So einfach.
quelle
Eine andere Alternative, die vielleicht nicht so elegant ist wie die Verwendung von bind, aber für Ereignisse in einer Schleife gültig ist
Es wurde auf Google Chrome-Erweiterungen getestet und möglicherweise muss e.srcElement in anderen Browsern durch e.source ersetzt werden
Ich habe diese Lösung anhand des von Imatoria geposteten Kommentars gefunden , kann sie jedoch nicht als nützlich markieren, da ich nicht genügend Ruf habe: D.
quelle
Diese Lösung kann gut aussehen
oder Wertsachen binden wird auch gut sein
quelle