如何在循环中添加具有局部变量的事件处理程序



我确定我曾经知道这一点,但我已经离开了一段时间,我再也想不通了。

假设我有一个按钮集合("按钮A","按钮B","按钮C",由.getElementsByClassName("button"(检索的NodeList表示。

我现在想向这些中添加一个事件处理程序,该处理程序使用在创建处理程序时按值传递的一些局部变量。对于一个最小的例子,让我们使用:

for (var i = elems.length - 1; i >= 0; i--) {
var inner = elems[i].innerHTML;
elems[i].onclick = function(){window.alert("Clicked on "+inner+" which is element number "+i)};
}

这里期望的结果是,当单击按钮 B 时,我得到

Clicked on Button B which is element number 1

但是,所有按钮都屈服

Clicked on Button A which is element number -1

我理解为什么会发生这种情况,但是我需要如何更改代码来实现前者?如果这是相关的,在最终的事件处理程序中,i 不会单独使用,而是再次引用 elem[i],它作为参数传递到处理程序中。

使用let声明变量。这将为变量创建一个块范围,并将在循环中保留正确的值:

for (let i = elems.length - 1; i >= 0; i--) {

演示:

let elems = document.querySelectorAll('button');
for (let i = elems.length - 1; i >= 0; i--) {
var inner = elems[i].innerHTML;
elems[i].onclick = function(){window.alert("Clicked on "+inner+" which is element number "+i)};
}
<button type="button">Button A</button>
<button type="button">Button B</button>
<button type="button">Button C</button>

var elems = document.getElementsByClassName('btn');
for (var i = elems.length - 1; i >= 0; i--) {
(function(i) {
var inner = elems[i].innerHTML;
elems[i].onclick = function(){window.alert("Clicked on "+inner+" which is element number "+i)};
})(i);
}
<button type="button" class="btn">Button A</button>
<button type="button" class="btn">Button B</button>
<button type="button" class="btn">Button C</button>

最新更新