只是一个简单的问题,谁能告诉我为什么这不起作用以及如何解决它?本质上,它采用 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));
}
根据 rows
和 tr
的不同,您甚至可能不需要循环索引。也许您可以通过其他方式获取事件处理程序内部的元素索引。例如。如果 tr
是 HTMLTableRowElement
[MDN] , 然后你可以通过 this.rowIndex
得到它在其他行中的位置。
顺便说一句。为什么要绑定(bind)同一个事件处理程序两次?
关于javascript - 使用循环在事件监听器上传递参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6968147/