它不像我不能这样做,但我只是好奇:为什么这段代码会崩溃浏览器标签?
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);
}
答案 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>