javascript - 使用循环在事件监听器上传递参数

标签 javascript html 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); });
}

此代码的问题是传递给 DropDownManager.onItemClick 的值始终是循环中的最后一项,这不是我想要的,因为我希望它们成为循环那个阶段的当前值。我意识到我遗漏了一些非常简单的东西,但我终其一生都无法解决!

最佳答案

JavaScript 没有 block 作用域,所以例如循环不会创建新的范围。您可以使用函数创建一个:

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));
}

根据 rowstr 的不同,您甚至可能不需要循环索引。也许您可以通过其他方式获取事件处理程序内部的元素索引。例如。如果 trHTMLTableRowElement [MDN] , 然后你可以通过 this.rowIndex 得到它在其他行中的位置。

顺便说一句。为什么要绑定(bind)同一个事件处理程序两次?

关于javascript - 使用循环在事件监听器上传递参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6968147/

相关文章:

iphone - Textarea 占位符不适用于 iphone phonegap

events - 处理树面板 Extjs 4 上的 itemclick 事件

javascript - 将纬度和经度传递给谷歌地图。需要有人帮我纠正我的代码

javascript - 需要使用 fadeinDown 和 fadeOutDown 效果对单词进行动画处理

javascript - 嵌套延迟调用

html - 视口(viewport)外的相关元素

Javascript表单提交问题

javascript - 选中复选框问题

javascript - 在 JavaScript 中同步模糊和点击事件

events - 确定用户是否单击滚动条或内容(onclick 对于 native 滚动条)