it-swarm.com.de

Wie übergeben Sie Argumente an die AddEventListener-Listener-Funktion?

Die Situation ist etwas

var someVar = some_other_function();
someObj.addEventListener("click", function(){
    some_function(someVar);
}, false);

Das Problem ist, dass der Wert von someVar nicht in der Listener-Funktion von addEventListener sichtbar ist, wo er wahrscheinlich als neue Variable behandelt wird.

226
Abhishek Yadav

Es ist absolut nichts falsch mit dem Code, den Sie geschrieben haben. Sowohl some_function als auch someVar sollten zugänglich sein, falls sie im anonymen Kontext verfügbar waren 

function() { some_function(someVar); } 

wurde erstellt. 

Prüfen Sie, ob die Warnung Ihnen den gewünschten Wert gibt. Stellen Sie sicher, dass auf die anonyme Funktion zugegriffen werden kann (es sei denn, Sie haben mehr Code, der für dieselbe Variable someVar neben dem Aufruf von addEventListener ausgeführt wird)

var someVar; 
someVar = some_other_function();
alert(someVar);
someObj.addEventListener("click", function(){
    some_function(someVar);
}, false);
166
Sergey Ilinsky

Warum holen Sie sich nicht einfach die Argumente aus dem Zielattribut des Ereignisses?

Beispiel:

var someInput = document.querySelector('input');
someInput.addEventListener('click', myFunc, false);
someInput.myParam = 'This is my parameter';
function myFunc(evt)
{
  window.alert( evt.target.myParam );
}

JavaScript ist eine prototypenorientierte Sprache, denken Sie daran!

264
Zaloz

Diese Frage ist alt, aber ich dachte, ich würde eine Alternative mit .bind () von ES5 anbieten - für die Nachwelt. :)

function some_func(otherFunc, ev) {
    // magic happens
}
someObj.addEventListener("click", some_func.bind(null, some_other_func), false);

Beachten Sie nur, dass Sie Ihre Listener-Funktion mit dem ersten Parameter als Argument definieren müssen, das Sie in bind übergeben (Ihre andere Funktion), und der zweite Parameter ist jetzt das Ereignis (anstelle des ersten, wie es gewesen wäre). .

46
Brian Moore

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 Parameter funcName ist die Funktionsnamenvariable

Sie können den Listener mit myaudio.removeEventListener('ended',func,false); entfernen.

18
Ganesh Krishnan

Eine ziemlich alte Frage, aber ich hatte heute das gleiche Problem. Die sauberste Lösung, die ich gefunden habe, ist das Konzept des Currying.

Der Code dafür:

someObj.addEventListener('click', some_function(someVar));

var some_function = function(someVar) {
    return function curried_func(e) {
        // do something here
    }
}

Durch Benennen der aktuellen Funktion können Sie Object.removeEventListener aufrufen, um die Registrierung des eventListener zu einem späteren Zeitpunkt aufzuheben.

16
tomcek112

Sie können einfach alle notwendigen Argumente mit 'bind' binden:

root.addEventListener('click', myPrettyHandler.bind(null, event, arg1, ... ));

Auf diese Weise erhalten Sie immer die Variablen event, arg1 und andere Elemente, die an myPrettyHandler übergeben werden.

http://passy.svbtle.com/partial-application-in-javascript-using-bind

11

Sie können somevar per value (nicht als Referenz) über eine JavaScript-Funktion übergeben, die als closet bezeichnet wird:

var someVar='Origin';
func = function(v){
    console.log(v);
}
document.addEventListener('click',function(someVar){
   return function(){func(someVar)}
}(someVar));
someVar='changed'

Oder Sie schreiben eine allgemeine Wrap-Funktion wie wrapEventCallback:

function wrapEventCallback(callback){
    var args = Array.prototype.slice.call(arguments, 1);
    return function(e){
        callback.apply(this, args)
    }
}
var someVar='Origin';
func = function(v){
    console.log(v);
}
document.addEventListener('click',wrapEventCallback(func,someVar))
someVar='changed'

Hier ist wrapEventCallback(func,var1,var2) wie: 

func.bind(null, var1,var2)
10
ahuigo

Der someVar-Wert sollte nur im some_function()-Kontext verfügbar sein, nicht aus dem Listener.

someObj.addEventListener("click",
                         function(){
                             var newVar = someVar;
                             some_function(someVar);
                         },
                         false);

und benutze stattdessen newVar.

Die andere Möglichkeit ist, den someVar-Wert von some_function() zur weiteren Verwendung im Listener (als neue lokale Variable) zurückzugeben:

var someVar = some_function(someVar);
9
Thevs

Hier ist noch ein anderer Weg (Dieser arbeitet innen für Loops):

var someVar = some_other_function();
someObj.addEventListener("click", 

function(theVar){
    return function(){some_function(theVar)};
}(someVar),

false);
9
Hello World

Benutzen 

   el.addEventListener('click',
    function(){
        // this will give you the id value 
        alert(this.id);    
    },
false);

Und wenn Sie einen benutzerdefinierten Wert an diese anonyme Funktion übergeben möchten, ist dies der einfachste Weg 

 // this will dynamically create property a property
 // you can create anything like el.<your  variable>
 el.myvalue = "hello world";
 el.addEventListener('click',
    function(){
        //this will show you the myvalue 
        alert(el.myvalue);
        // this will give you the id value 
        alert(this.id);    
    },
false);

Funktioniert perfekt in meinem Projekt. Hoffe das wird helfen

6
kta

Function.prototype.bind () ist der Weg, um eine Zielfunktion an einen bestimmten Bereich zu binden und optional das this-Objekt in der Zielfunktion zu definieren.

someObj.addEventListener("click", some_function.bind(this), false);

Oder um einen Teil des lexikalischen Bereichs zu erfassen, zum Beispiel in einer Schleife:

someObj.addEventListener("click", some_function.bind(this, arg1, arg2), false);

Wenn der Parameter this in der Zielfunktion nicht benötigt wird:

someObj.addEventListener("click", some_function.bind(null, arg1, arg2), false);
3
eclos

Probieren Sie auch diese aus (IE8 + Chrome. Ich weiß es nicht für FF):

function addEvent(obj, type, fn) {
    eval('obj.on'+type+'=fn');
}

function removeEvent(obj, type) {
    eval('obj.on'+type+'=null');
}

// Use :

function someFunction (someArg) {alert(someArg);}

var object=document.getElementById('somObject_id') ;
var someArg="Hi there !";
var func=function(){someFunction (someArg)};

// mouseover is inactive
addEvent (object, 'mouseover', func);
// mouseover is now active
addEvent (object, 'mouseover');
// mouseover is inactive

Hoffe es gibt keine Tippfehler :-)

3
DMike92

Eine Möglichkeit ist dies mit einer outer-Funktion:

elem.addEventListener('click', (function(numCopy) {
  return function() {
    alert(numCopy)
  };
})(num));

Diese Methode zum Umschließen einer anonymen Funktion in Klammern und deren sofortiges Aufrufen wird als IIFE (Sofortiger Aufruf der Funktion) bezeichnet.

Sie können ein Beispiel mit zwei Parametern in http://codepen.io/froucher/pen/BoWwgz überprüfen.

catimg.addEventListener('click', (function(c, i){
  return function() {
    c.meows++;
    i.textContent = c.name + '\'s meows are: ' + c.meows;
  }
})(cat, catmeows));
3
Felipe

Ich steckte fest, als ich es in einer Schleife benutzte, um Elemente zu finden und Listener hinzuzufügen. Wenn Sie es in einer Schleife verwenden, wird dies perfekt funktionieren

for (var i = 0; i < states_array.length; i++) {
     var link = document.getElementById('apply_'+states_array[i].state_id);
     link.my_id = i;
     link.addEventListener('click', function(e) {   
        alert(e.target.my_id);        
        some_function(states_array[e.target.my_id].css_url);
     });
}
2
Suneel Kumar

Um Argumente an die Callback-Funktion eines eventListener zu senden, müssen Sie eine isolierte Funktion erstellen und Argumente an diese isolierte Funktion übergeben.

Hier ist eine nette kleine Helferfunktion, die Sie verwenden können. Basierend auf "Hallo Welt" Beispiel oben.)

Eine Sache, die auch benötigt wird, ist, einen Verweis auf die Funktion beizubehalten, damit wir den Listener sauber entfernen können.

// Lambda closure chaos.
//
// Send an anonymous function to the listener, but execute it immediately.
// This will cause the arguments are captured, which is useful when running 
// within loops.
//
// The anonymous function returns a closure, that will be executed when 
// the event triggers. And since the arguments were captured, any vars 
// that were sent in will be unique to the function.

function addListenerWithArgs(elem, evt, func, vars){
    var f = function(ff, vv){
            return (function (){
                ff(vv);
            });
    }(func, vars);

    elem.addEventListener(evt, f);

    return f;
}

// Usage:

function doSomething(withThis){
    console.log("withThis", withThis);
}

// Capture the function so we can remove it later.
var storeFunc = addListenerWithArgs(someElem, "click", doSomething, "foo");

// To remove the listener, use the normal routine:
someElem.removeEventListener("click", storeFunc);
2
bob

Der folgende Ansatz hat für mich gut funktioniert. Geändert von hier .

function callback(theVar) {
  return function() {
    theVar();
  }
}

function some_other_function() {
  document.body.innerHTML += "made it.";
}

var someVar = some_other_function;
document.getElementById('button').addEventListener('click', callback(someVar));
<!DOCTYPE html>
<html>
  <body>
    <button type="button" id="button">Click Me!</button>
  </body>
</html>

1
Nate
    var EV = {
        ev: '',
        fn: '',
        elem: '',
        add: function () {
            this.elem.addEventListener(this.ev, this.fn, false);
        }
    };

    function cons() {
        console.log('some what');
    }

    EV.ev = 'click';
    EV.fn = cons;
    EV.elem = document.getElementById('body');
    EV.add();

//If you want to add one more listener for load event then simply add this two lines of code:

    EV.ev = 'load';
    EV.add();
1

Wenn ich mich nicht irre, wenn Sie die Funktion mit bind aufrufen, wird eine neue Funktion erstellt, die von der bind-Methode zurückgegeben wird. Dies führt später zu Problemen oder wenn Sie den Ereignis-Listener entfernen möchten, da er im Grunde wie eine anonyme Funktion aussieht:

// Possible:
function myCallback() { /* code here */ }
someObject.addEventListener('event', myCallback);
someObject.removeEventListener('event', myCallback);

// Not Possible:
function myCallback() { /* code here */ }
someObject.addEventListener('event', function() { myCallback });
someObject.removeEventListener('event', /* can't remove anonymous function */);

Denken Sie also daran.

Wenn Sie ES6 verwenden, können Sie dasselbe wie vorgeschlagen, jedoch ein bisschen sauberer machen:

someObject.addEventListener('event', () => myCallback(params));
1
developer82

Du brauchst:

newElem.addEventListener('click', {
    handleEvent: function (event) {
        clickImg(parameter);
    }
});
0
Victor Behar

Schöne einzeilige Alternative

element.addEventListener('dragstart',(evt) => onDragStart(param1, param2, param3, evt));
function onDragStart(param1, param2, param3, evt) {

 //some action...

}
0
Gon82

Der folgende Code hat für mich gut funktioniert (Firefox):

for (var i=0; i<3; i++) {
   element = new ...   // create your element
   element.counter = i;
   element.addEventListener('click', function(e){
        console.log(this.counter);
        ...            // another code with this element
   }, false);
}

Ausgabe:

0
1
2
0
Šerg
    $form.addEventListener('submit', save.bind(null, data, keyword, $name.value, myStemComment));
    function save(data, keyword, name, comment, event) {

So habe ich die Veranstaltung richtig bestanden.

0
chovy

Die folgende Antwort ist korrekt, der folgende Code funktioniert jedoch nicht im IE8, wenn Sie die js-Datei mit yuicompressor komprimiert haben. (In der Tat verwenden immer noch die meisten US-Völker IE8)

var someVar; 
someVar = some_other_function();
alert(someVar);
someObj.addEventListener("click",
                         function(){
                          some_function(someVar);
                         },
                         false);

Wir können das obige Problem also wie folgt beheben und funktionieren in allen Browsern einwandfrei

var someVar, eventListnerFunc;
someVar = some_other_function();
eventListnerFunc = some_function(someVar);
someObj.addEventListener("click", eventListnerFunc, false);

Ich hoffe, es wäre nützlich für jemanden, der die js-Datei in der Produktionsumgebung komprimiert.

Viel Glück!!

0
Asik

Wahrscheinlich nicht optimal, aber einfach genug für diejenigen, die nicht besonders versiert sind. Setzen Sie die Funktion, die addEventListener aufruft, in eine eigene Funktion. Auf diese Weise behalten alle darin übergebenen Funktionswerte ihren eigenen Gültigkeitsbereich bei, und Sie können diese Funktion so oft durchlaufen, wie Sie möchten.

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 für mehrere Dateien zu vermeiden. Ich würde versehentlich den gleichen "Namen" auf allen Rendern sehen, obwohl ich unterschiedliche Dateien hochgeladen habe.

Ursprünglich befand sich die gesamte Funktion readFile () in der Funktion readFiles (). Dies führte zu Problemen mit dem asynchronen Gültigkeitsbereich.

    function readFiles(input) {
      if (input.files) {
        for(i=0;i<input.files.length;i++) {

          var filename = input.files[i].name;

          if ( /\.(jpe?g|jpg|png|gif|svg|bmp)$/i.test(filename) ) {
            readFile(input.files[i],filename);
          }
       }
      }
    } //end readFiles



    function readFile(file,filename) {
            var reader = new FileReader();

            reader.addEventListener("load", function() { alert(filename);}, false);

            reader.readAsDataURL(file);

    } //end readFile
0
Spoo

Diese Lösung kann gut aussehen

var some_other_function = someVar => function() {
}

someObj.addEventListener('click', some_other_function(someVar));

oder Wertgegenstände binden ist auch gut

0
fnclovers

In allen Funktionen gibt es eine spezielle Variable: Argumente . Sie können Ihre Parameter als anonyme Parameter übergeben und (über die Reihenfolge) über die Variable arguments auf sie zugreifen.

Beispiel:

var someVar = some_other_function();
someObj.addEventListener("click", function(someVar){
    some_function(arguments[0]);
}, false);
0
StanE