首页 > 解决方案 > 循环结果数组的最后一个索引

问题描述

我有以下代码,使用以下代码为每个元素添加一个事件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);
        });
    })();
}

但是当我单击element通过循环添加事件的任何内容时,它总是显示最后一个索引example,就像当我单击element它时,它会在警报框中显示带有example文本的警报。

这是console.log(elm)after的结果elm = elm.normalize()

[示例:input.sample.fld,示例:input.example.fld]

isobj(elm)is afunction检查是否variable是 an object,同样 like
iselm(elm)is afunction检查是否variable是 an element

由于解决了这个问题,我试图(function() { /* I put the addEventListener as above */ })();在循环内使用,但仍然无法正常工作。

我已经确保它x总是显示它的索引,但我不知道为什么它总是显示事件中的最后一个索引。

请帮忙。

标签: javascriptdom-eventsaddeventlistener

解决方案


到该行代码执行时,for循环已经完成。

解释:https ://dzone.com/articles/why-does-javascript-loop-only-use-last-value

如果您的浏览器支持,您可以使用let它。(有关解释和替代方法,请参阅文章)

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

}

推荐阅读