迭代地图,为什么这不起作用?

时间:2014-04-26 16:04:49

标签: javascript loops

javascript代码在这里:

function hidepre() {
    var pre = this.getElementsByTagName("pre")[0]
    if (pre.style.display === "none") {
        pre.style.display = "block";
    } else {
        pre.style.display = "none";
    }
}
function hidepreall() {
    var prewraps = document.getElementsByClassName("prewrap");
    if(prewraps.length > 0) {
        for (var i = 0; i < prewraps.length; i++) {
            var prewrap = prewraps[i];
            prewrap.onclick = hidepre;
        }
    }
}
window.onload = hidepreall;

这在我的firefox中运行正常,但如果我使用for(var i in obj)形式,就像这样

    for (var prewrap in prewraps) {
        prewrap.onclick = hidepre;
    }

它停止工作。

http://jsfiddle.net/5DmuE/1/ http://jsfiddle.net/5DmuE/2/

这两个小提琴在两种情况下都不起作用。

1 个答案:

答案 0 :(得分:2)

for-in循环不是用于循环数组中的条目或类似数组的东西(从getElementsByClassName返回的是一个类似于数组的对象,称为NodeList)。它用于循环访问对象属性的可枚举名称。在主机提供的对象(如for-in)上使用NodeList并不能保证正常工作。

使用一个简单的简单for循环,或将NodeList转换为数组并在其上使用forEach(您可以在剩下的几个浏览器上填充forEach没有它。这是一个例子:

Array.prototype.slice.call(prewraps, 0).forEach(function(element) {
    // ...use the element here
});

slice是一种从任何类似数组的对象创建数组的便捷方法。)

有关循环数组in this answer的更多信息。

我的博客上有关for-in的更多信息:Myths and realities of for-in