使用循环在事件侦听器上传递参数

Ian*_*gan 8 html javascript events prototypejs

只是一个简单的问题,任何人都可以告诉我为什么这不起作用以及如何解决它?本质上,它采用HTML中的一组表行并动态地将点击事件附加到它们.

for (var a=index; a<rows.length; a++) {
    tr = rows[a];
    tr.onclick = function() { DropDownManager.onItemClick(tr, a); };
    tr.observe("click", function() { DropDownManager.onItemClick(tr, a); });
}
Run Code Online (Sandbox Code Playgroud)

这段代码的问题是传递给DropDownManager.onItemClick的值总是循环中的最后一项,这不是我想要的那样,因为我希望它们是循环那个阶段的当前值.我意识到我错过了一些非常简单但却无法解决我生活的问题!

Fel*_*ing 14

JavaScript没有块范围,因此例如循环不会创建新范围.您可以使用以下函数创建一个:

for (var a=index; a<rows.length; a++) {
   (function(a) {
      tr = rows[a];
      tr.onclick = function() { DropDownManager.onItemClick(this, a); };
      tr.observe("click", function() { DropDownManager.onItemClick(this, a); });
   }(a));
}
Run Code Online (Sandbox Code Playgroud)

根据什么rowstr是,你甚至不需要循环索引.也许你可以通过另一种方式获取事件处理程序中的元素索引.例如,如果trHTMLTableRowElement [MDN],那么您可以通过其他行获取其位置this.rowIndex.

顺便说一句.为什么要绑定相同的事件处理程序两次?