简体   繁体   English

将带有参数的函数传递给`addEventListener`

[英]Passing a function with arguments to `addEventListener`

I'm trying to create a single function that works for multiple selections. 我正在尝试创建一个适用于多种选择的功能。 I'm creating a selection screen of a video game that should work like this: https://oege.ie.hva.nl/~meestej005/eind/ 我正在创建一个视频游戏的选择屏幕,该屏幕应如下所示: https : //oege.ie.hva.nl/~meestej005/eind/

The way I achieved this was with this code: 我实现此目标的方法是使用以下代码:

function character1(){
for (var i = 0; i < sprite.length; i++){
    sprite[i].classList.remove('charSprite');
}
sprite[0].classList.add('charSprite');
hadouken.play();
}

I made this function 4 times, one for each character. 我做了4次此功能,每个字符一次。 They are called with this: 他们被这样称呼:

char1.addEventListener('click', character1);

Right now, I want to create a function that does this for each character. 现在,我想创建一个为每个字符执行此操作的函数。 This is what I came up with: 这是我想出的:

function character(name, music){
for (var i = 0; i < sprite.length; i++){
    sprite[i].classList.remove('charSprite');
}
name.classList.add('charSprite');
music.play();
}

char1.addEventListener('click', character(charSprite1, hadouken));

Sadly, this doens't work. 可悲的是,这是行不通的。 Clicking one of the characters now results into absolutely nothing, not even an error. 现在单击一个字符绝对不会产生任何结果,甚至不会出错。 So I'm doing something wrong, but have no idea what. 所以我做错了事,但不知道该怎么办。 I want to fix this using only Javascript. 我想仅使用Javascript来解决此问题。 I hope you guys can help me out. 我希望你们能帮助我。 Thanks. 谢谢。

addEventListener takes a function as its second argument. addEventListener将函数作为第二个参数。 When you invoke the function like character(charSprite1, hadouken) , you are no longer passing that function reference around (instead, you are passing the result of that function, which is being called immediately rather than when an event fires). 当您调用诸如character(charSprite1, hadouken)类的函数时,您将不再传递该函数引用(而是传递该函数的结果,该结果将立即被调用而不是在事件触发时被调用)。 I would suggest capturing the name and music arguments using closure, and returning a function each time from character : 我建议使用闭包捕获namemusic参数,并每次从character返回一个函数:

function character(name, music) {
  return function() {
    for (var i = 0; i < sprite.length; i++) {
      sprite[i].classList.remove('charSprite');
    }
    name.classList.add('charSprite');
    music.play();
  }
}

char1.addEventListener('click', character(charSprite1, hadouken));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM