简体   繁体   English

将参数传递给事件侦听器不起作用?

[英]Passing arguments to Event Listener does not work?

I just had a question, because my code below works and plays the correct sound, however, also gives me an error in the console saying:我只是有一个问题,因为我下面的代码可以正常工作并播放正确的声音,但是,在控制台中也给了我一个错误说:

index.js:26 Uncaught TypeError: Cannot read property 'play' of undefined at HTMLButtonElement.handleClick (index.js:26) index.js:26 未捕获的类型错误:无法在 HTMLButtonElement.handleClick (index.js:26) 处读取未定义的属性“播放”
handleClick @ index.js:26 handleClick @ index.js:26

What I'm trying to do is to assign a number of buttons to their corresponding sounds.我想要做的是为它们对应的声音分配一些按钮。 I was just wondering if there was a better way to do this and where the error might be coming from?我只是想知道是否有更好的方法来做到这一点以及错误可能来自哪里?

let drumAreaArray = document.querySelectorAll(".drum");
let drumNameArray = ["crash", "kick-bass", "snare", "tom-1", "tom-2", "tom-3", "tom-4"];
let drumSoundArray = [];

for(let i = 0; i < drumNameArray.length; i++)
{
    drumAreaArray[i].addEventListener("click", handleClick);
}

//add audio for all files
for(let i = 0; i < drumNameArray.length; i++)
{
  let soundPath = "sounds/" + drumNameArray[i] +".mp3";
  let tempSound = new Audio(soundPath);
  drumSoundArray.push(tempSound);
}

//add event listeners to all drums
for(let i = 0; i < drumNameArray.length; i++)
{
    drumAreaArray[i].addEventListener("click",function(){handleClick(i);});
}

function handleClick(numberDrum)
{
  drumSoundArray[numberDrum].play();
}

Okay, I was an idiot and as Nipun Jain pointed out, I repeated the code too many times.好吧,我是个白痴,正如 Nipun Jain 指出的那样,我重复了太多次代码。 The working code should have been this:工作代码应该是这样的:

let drumAreaArray = document.querySelectorAll(".drum");
let drumNameArray = ["crash", "kick-bass", "snare", "tom-1", "tom-2", "tom-3", "tom-4"];
let drumSoundArray = [];

for(let i = 0; i < drumNameArray.length; i++)
{
  //add audio for all files
  let soundPath = "sounds/" + drumNameArray[i] +".mp3";
  let tempSound = new Audio(soundPath);
  drumSoundArray.push(tempSound);
  //add event listeners to all drums
  drumAreaArray[i].addEventListener("click",function(){handleClick(i);});
}

function handleClick(numberDrum)
{
  drumSoundArray[numberDrum].play();
}

Firstly you are creating three for loop for same drumNameArray .首先,您要为相同的drumNameArray创建三个for 循环。 You can use a single.您可以使用单个。 And also you are adding eventListner to drumAreaArray in two loops.而且您drumAreaArray两个循环中将drumAreaArray添加到drumAreaArray Just change it.只是改变它。

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

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