添加单击侦听器以循环列出项目
Adding click listeners to list items in loop
我有以下代码:
// Iterate through each of the children
for(j = 0; j < len; j++) {
var entry = sortedArray[j];
// Each entryLI is a child of nameOL <ol> element
var entryLI = document.createElement("li");
// Each entryLI should have a unique click listener
entryLI.addEventListener("click", function(event) {entry.onListItemClick()});
// Set the text of the <li> to the name of the entry
var nameNode = document.createTextNode(entry.entryName);
entryLI.appendChild(nameNode);
// Append the entry list item to the ordered list
nameOL.appendChild(entryLI);
}
我正在尝试在此循环中为每个列表项提供一个处理单击事件的事件侦听器。但是,由于某种原因,单击任何列表项将调用列表中最后一项的事件侦听器。
谁能向我解释为什么会这样?
我从完全不同的语言来到JavaScript,我正在努力解决基于原型的类。
entry
变量在每个循环中被覆盖。规避此问题的一种方法是:
for(j = 0; j < len; j++) {
(function(entry){
....
})(sortedArray[j])
}
此IIF
(立即调用的函数(为每次迭代单独限定条目变量的范围。
这是因为以下行
entryLI.addEventListener("click", function(event) {entry.onListItemClick()});
绑定到变量 entry
而不是其值。因此,在整个循环中分配或更改的值,最后一次迭代的值都保存在入口变量中,并且每个事件处理程序函数都将访问该变量以获取最后一个值。
解决方案:按照 Kenney 在此 Q 线程中的建议使用即时函数,或者检查此答案,它不那么模棱两可。
相关文章:
- Handlebars访问第一个项目,然后访问后面的每个项目(在每个循环中)
- jQuery无限循环,动画化许多项目
- jQuery 插件不会循环遍历匹配的项目
- 在 for 循环中选择项目
- JavaScript:如何在 for 循环期间跳过数组中的当前项目?(继续?
- 如何在数组中循环,等待每个项目之间的时间
- 如何无限循环项目列表
- NetSuite行项目删除内部循环问题
- javascript循环选择特定项目
- Javascript检查循环中项目的所有按钮
- FastClick在Phonegap项目中抛出off.on('click')循环计数
- jquery:如何循环选择多个项目
- 循环 HTML 表并将相同的项目及其计算的金额添加到另一个表中
- 使用胡须.js一次循环访问一个测验项目
- 使用 ng-if 选择 ng-repeat 循环中的第二个项目
- 是否可以在视口中的项目属性中使用循环
- 使用 javascript 列出 for 循环中的所有项目
- 具有项目特定函数的循环的 Django 模板的最佳实践
- 循环遍历 JSON 并显示具有特定名称的项目
- 带有循环的角猫头鹰旋转木马将项目克隆到范围之外