我确定我曾经知道这一点,但是我已经离开了一段时间,我再也无法弄清了。
假设我有一个按钮集合(“按钮A”,“按钮B”,“按钮C”,由.getElementsByClassName(“ button”)检索到的NodeList表示。)
我现在想向其中添加一个EventHandler,以利用在创建处理程序时按值传递的一些局部变量。举一个最小的例子,让我们使用:
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],并将其作为参数传递给处理程序。
答案 0 :(得分:1)
使用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>
答案 1 :(得分:0)
{{1}}