为什么这会崩溃浏览器标签?

时间:2015-08-31 08:39:48

标签: javascript

它不像我不能这样做,但我只是好奇:为什么这段代码会崩溃浏览器标签?

var links = document.getElementsByTagName("a");
for (var i = 0; i < links.length; i++) {
    var a = document.createElement("A");
    a.innerHTML = "[?]";
    a.href = links[i].href; //this is the evil line
    a.onclick = function () {
        return false;
    };
    links[i].parentNode.appendChild(a);
}

2 个答案:

答案 0 :(得分:8)

因为NodeList(我认为他们现在称之为HTMLCollection),您从getElementsByTagName返回直播。因此,当您向文档添加新的a时,浏览器会将其添加到您要循环播放的列表中。由于每次循环时都添加另一个,因此您永远不会到达循环的末尾。

如果您想要断开连接的数组或集合,可以执行以下操作:

var collection = document.querySelectorAll("a");

var array = Array.prototype.slice.call(document.getElementsByTagName("a"));

querySelectorAll支持所有CSS选择器。它得到了所有现代浏览器以及IE8的支持。但它可能比克隆getElementsByTagName NodeList(通常不重要)更慢。

答案 1 :(得分:3)

Element.getElementsByTagName()会返回实时 HTMLCollection,这意味着每次向页面添加新的链接元素时,链接的长度都会增加,从而导致无限循环。 / p>