Javascript 循环结果数组的最后一个索引
我有以下代码,可以使用Javascript 循环结果数组的最后一个索引,javascript,dom-events,addeventlistener,Javascript,Dom Events,Addeventlistener,我有以下代码,可以使用addeventlistener将每个元素添加到事件中: var x, y, z; elm = elm.normalize(); if(!isobj(elm) && iselm(elm)) { elm = new Array(elm); } for(x in elm) { (function() { elm[x].addEventListener('click', function() { aler
addeventlistener
将每个元素添加到事件中:
var x, y, z;
elm = elm.normalize();
if(!isobj(elm) && iselm(elm)) {
elm = new Array(elm);
}
for(x in elm) {
(function() {
elm[x].addEventListener('click', function() {
alert(x);
});
})();
}
但是,当我单击任何通过循环添加事件的元素时,它总是显示最后一个索引示例
,就像我单击元素
时,它在警报框中显示带有示例
文本的警报一样
下面是elm=elm.normalize()之后的console.log(elm)
的结果:
[sample:input.sample.fld,example:input.example.fld]
isobj(elm)
是一个函数
,用于检查变量
是否是对象
,与
相同
iselm(elm)
是一个函数
,用于检查变量
是否是元素
为了解决这个问题,我尝试使用,(function(){/*我把addEventListener放在上面的*/})()代码>在循环中,但仍然不起作用
我已经确定x
总是显示它的索引,但我不知道为什么它总是显示事件中的最后一个索引
请提供帮助。执行代码行时,for循环已经完成
解释如下:
如果浏览器支持,您可以使用let
。(有关解释和备选方案,请参见文章)
您已经应用了解决此问题的其中一种模式的一半,但只应用了其中的一半。有关详细信息,请参见链接问题的答案,但您需要将x
传递到循环中的匿名函数:}(x)代码>而不仅仅是}()
(为了清晰起见,我使用了一个不同的名称,但很多人不这么认为):for in
不是循环数组的方式;查看原因和使用方法(在本例中,forEach
将特别方便,因为它的回调将是匿名函数)。非常感谢,这对我来说是一个新知识。它不起作用,最后一个索引仍然显示在事件let myX=x
应该在(function(){/*code*/})中代码>谢谢您的建议。不要将myX
声明为传递给addEventListener
的函数的参数。这将覆盖函数上下文中的闭包。@RyanSearle更新了我的answer@RyanSearle我不能接受,因为答案是快接受,但我已经接受了。
var x, y, z;
elm = elm.normalize();
if(!isobj(elm) && iselm(elm)) {
elm = new Array(elm);
}
for(x in elm) {
(function() {
let myX = x;
elm[myX].addEventListener('click', function() {
alert(myX);
});
})();
}