为什么这个崩溃浏览器选项卡
Why does this crash browser tab?
这不是像我不能这样做,但我只是好奇:为什么这段代码崩溃的浏览器选项卡?
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
,这意味着每次向页面添加新的链接元素时,链接的长度都会增加,从而导致无限循环。
相关文章:
- location.reload(true)崩溃浏览器选项卡
- 我们如何在互联网断开连接或用户关闭选项卡/浏览器时调用注销servlet
- 单击按钮即可在浏览器的新选项卡中打开 Sapui5 详细信息页面
- 如何在现有的浏览器选项卡中打开url
- 在用户关闭/更改移动浏览器选项卡之前进行检测
- 在新的浏览器选项卡上加载新的aspx页面后调用JavaScript函数
- 更改当前选项卡或浏览器窗口的标题
- 询问用户何时尝试关闭浏览器选项卡
- 如何在windowsphone 7浏览器中通过javascript打开新窗口或选项卡
- 自动关闭或覆盖通过命令行打开的浏览器选项卡
- 在两个浏览器选项卡之间共享变量范围
- 仅在使用javascript和html的浏览器中在相同的两个选项卡之间切换
- 检查具有特定标题的浏览器选项卡是否已存在
- 编写脚本以关闭其他选项卡或浏览器
- 关闭浏览器时发出警报,关闭选项卡并前后单击按钮时发出警报
- 如何防止用户使用浏览器选项禁用脚本
- 检测通过移动 Safari 中的 JavaScript 关闭浏览器选项卡
- 咕噜咕噜浏览器化忽略选项
- 当用户关闭浏览器选项卡时,如何使用 PHP 或 javascript 从我的站点注销用户
- 如何在重新加载选项(浏览器)时限制页面加载