为什么这个崩溃浏览器选项卡

Why does this crash browser tab?

本文关键字:选项 浏览器 崩溃 为什么      更新时间:2023-09-26

这不是像我不能这样做,但我只是好奇:为什么这段代码崩溃的浏览器选项卡?

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

因为你从getElementsByTagName得到的NodeList(我想他们现在叫它HTMLCollection)是live。因此,当您向文档中添加新的a时,浏览器会将其添加到正在循环的列表中。由于每次循环都添加一个,因此永远不会到达循环的终点。

如果你想要一个不连接的数组或集合,你可以这样做:

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

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

querySelectorAll支持所有CSS选择器。所有现代浏览器都支持它,包括IE8。但是它可能比克隆getElementsByTagName NodeList慢(这通常不重要)。

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