[英]addEventListener to an array of buttons using a for loop
我试图让一系列按钮(在 html 中包含的 div 中)在点击时发出警报。 为此,我正在使用 addEventListener。 如果我只是列出一个列表(如下面的评论所示),结果很好。 我尝试使用 for 循环使代码变干,但无论我按什么,它都只返回“点击 8”。 据我所知,流程应该从测试 i=0 开始,然后以与整个列表相同的方式继续其他流程。 所以如果我按下按钮[0],我应该得到“点击1”,这都是因为其他条件是假的。 提前致谢。
// document.querySelectorAll("button")[0].addEventListener("click", function(){alert("clicked 1")}); // document.querySelectorAll("button")[1].addEventListener("click", function(){alert("clicked 2")}); // document.querySelectorAll("button")[2].addEventListener("click", function(){alert("clicked 3")}); // document.querySelectorAll("button")[3].addEventListener("click", function(){alert("clicked 4")}); // document.querySelectorAll("button")[4].addEventListener("click", function(){alert("clicked 5")}); // document.querySelectorAll("button")[5].addEventListener("click", function(){alert("clicked 6")}); // document.querySelectorAll("button")[6].addEventListener("click", function(){alert("clicked 7")}); for(i=0; i<=6; i++) { document.querySelectorAll("button")[i].addEventListener("click", function(){alert("clicked " + (i+1))}); }
<div class="set"> <button class="w drum">w</button> <button class="a drum">a</button> <button class="s drum">s</button> <button class="d drum">d</button> <button class="j drum">j</button> <button class="k drum">k</button> <button class="l drum">l</button> </div>
您的问题来自使用var
关键字定义变量的行为。
在 ES6 中引入了let
和const
关键字。 如果您使用它们,您将不再面临var
提升和范围的问题。
因此,您可以像这样在i
声明中添加一个let
关键字:
for (let i=0; i<=6; i++) {
//the rest of the code
}
您可以在这个问题中阅读更多内容。
当您写入i = 0
您是在定义window
对象中的i
属性。 然后在循环中增加这个值。 在传递的函数中使用i
时,javascript 正在从window
对象获取值。
另一方面, let
关键字将变量的范围定义为循环的范围,因此传递的函数始终包含值的副本,当传递函数时。
即使在循环之后,该函数似乎也会跟踪 I 的值。 添加另一个变量并将其绑定到警报
// document.querySelectorAll("button")[0].addEventListener("click", function(){alert("clicked 1")}); // document.querySelectorAll("button")[1].addEventListener("click", function(){alert("clicked 2")}); // document.querySelectorAll("button")[2].addEventListener("click", function(){alert("clicked 3")}); // document.querySelectorAll("button")[3].addEventListener("click", function(){alert("clicked 4")}); // document.querySelectorAll("button")[4].addEventListener("click", function(){alert("clicked 5")}); // document.querySelectorAll("button")[5].addEventListener("click", function(){alert("clicked 6")}); // document.querySelectorAll("button")[6].addEventListener("click", function(){alert("clicked 7")}); for(var i=0;i<7; i++) { let out = i+1 document.getElementsByTagName("button")[i].addEventListener("click", function(){alert("clicked " + (out))}); }
<div class="set"> <button class="w drum">w</button> <button class="a drum">a</button> <button class="s drum">s</button> <button class="d drum">d</button> <button class="j drum">j</button> <button class="k drum">k</button> <button class="l drum">l</button> </div>
你可以用这种方式干燥你的代码:
document.querySelectorAll('button').forEach((el, i) => {
el.addEventListener('click', () => alert(`clicked ${i+1}`))
} )
您可以利用事件委托,而不是将侦听器附加到所有按钮,它允许您将一个侦听器添加到父元素(在本例中为.set
),并在按钮“冒泡”DOM 时从按钮中捕获事件。
在这个例子中,我记录了按钮被点击时的文本内容。
// Cache the parent element and add a listener const set = document.querySelector('.set'); set.addEventListener('click', handleClick, false); function handleClick(e) { // Extract the nodeName and textContent from // the clicked element const { nodeName, textContent } = e.target; // If it's a button, log the text if (nodeName === 'BUTTON') { console.log(textContent); } }
<div class="set"> <button class="w drum">w</button> <button class="a drum">a</button> <button class="s drum">s</button> <button class="d drum">d</button> <button class="j drum">j</button> <button class="k drum">k</button> <button class="l drum">l</button> </div>
附加文件
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.