对于function(),带有addEventListener的循环不是动态的
Loop with addEventListener is not dynamic for function()
我想让循环非常容易地为每个按钮调用具有不同参数的函数。但是,当我运行调用并单击按钮时,eventListener函数saveList(listIdx)只返回函数saveList"5"。请看一下我的问题和疑难解答。
for (var listIdx = 0; listIdx < count; listIdx++ ) {
console.log("setting the variable" + "myButton" + listIdx );
document.getElementById("myButton" + listIdx).addEventListener("click", function() { saveList(listIdx);
});
}
尝试1:向函数添加参数()调用
for (var listIdx = 0; listIdx < count; listIdx++ ) {
console.log("setting the variable" + "myButton" + listIdx );
document.getElementById("myButton" + listIdx).addEventListener("click", function(listIdx) { saveList(listIdx);
});
}
尝试2:元素上的包装
for (var listIdx = 0; listIdx < count; listIdx++ ) {
console.log("setting the variable" + "myButton" + listIdx );
document.getElementById("myButton" + listIdx).addEventListener("click", function(_listIdx) { saveList(_listIdx);
});
}
问题是函数在稍后的时间点被调用——在for循环完成之后。正文中包含的变量已在for循环的最后一次迭代中更新。这就是你所看到的。
解决方法是以某种方式将变量推送到函数内部。
function makeListSaver(index) {
/* return a brand new function that has captured the index when this function
was invoked
*/
return function() {
saveList(index);
}
}
然后做,
document.getElementById("myButton" + listIdx).addEventListener("click", makeListSaver(listIdx))
或者简单地说,
document.getElementById("myButton" + listIdx).addEventListener("click", (function(index){
return function() { saveList(index); }
})(listIdx));
你必须稍微了解一下闭包以及它们是如何工作的。
你可以这样做。。。
for (var listIdx = 0; listIdx < count; listIdx++ ) {
applyEvent(listIdx);
}
function applyEvent(listIdx)
{
document.getElementById("1" + listIdx).addEventListener("click", function({
saveList(listIdx);
});
}
工作Fiddle
问题在于循环。
这里是如何在for
循环中设置addEventListener
的快速示例。
http://jsbin.com/kavowucimi/1/
它是如何工作的:
- 页面加载时
- 查找类为obj的所有元素
- 为每个元素添加一个事件侦听器单击
- 当用户单击时,所选元素的警报id
<script>
window.app = {
start: function(){
var elms = document.querySelectorAll('.obj');
for (var i = 0; i < elms.length; i++ ) {
var t = elms[i];
var elm = document.getElementById(t.id);
elm.addEventListener('click', function(item){
alert(item.currentTarget.id);
});
}
}
};
</script>
<body onload="window.app.start();">
<div id=1 class="obj">1</div>
<div id=2 class="obj">2</div>
<div id=3 class="obj">3</div>
相关文章:
- 如何在Angular.js中循环动态添加Fields并获取数据并将其发送到服务器
- 关于动态元素中循环中的事件
- 在PHP循环中动态创建jQuery列表视图
- 用于动态创建对象的嵌套循环
- 在普通javascript中动态增加循环
- JavaScript/循环混淆中的动态作用域与词法作用域
- 如何验证循环动态单选按钮
- 如何使用for循环动态地将行添加到Google图表
- 使用 for 循环动态创建在画布内绘制的图像
- SimpleModal foreach 循环动态内容
- 将 id 从 foreach 循环动态传递到仅申请一行的锚点标签到 jquery,我无法获得其他行的弹出窗口
- 如何使用for循环动态呈现多个表单元素
- 播放 2 框架 + 循环 + 动态 Javascript
- 数据表:通过循环动态创建列属性
- JavaScript:为循环动态创建变量
- 循环动态javascript转换一个接一个,而不是一次全部
- 如何通过javascript中的for循环动态创建ul和li元素
- 使用 for 循环动态创建数组
- 如何使用for in循环动态填充数组
- 从Javascript对象循环动态创建的表单.如何将数据保存回对象