我在网上进行了一些程序测试,从那里我得到了一些无限循环错误,将新div添加到现有div中.
<div id="one">
<div id="two"></div>
</div>
Run Code Online (Sandbox Code Playgroud)
这个JS代码是添加新的div:
appendChildren();
function appendChildren() {
var allDivs = document.getElementsByTagName("div");
for (var i = 0; i < allDivs.length; i++) {
var newDiv = document.createElement("div");
allDivs[i].appendChild(newDiv);
console.log(allDivs[i]);
}
}
Run Code Online (Sandbox Code Playgroud)
我希望HTML看起来像这样:
<div id="one">
<div id="two">
<div></div>
</div>
<div></div>
</div>
Run Code Online (Sandbox Code Playgroud)
但在运行时,程序不会停止循环.为什么?我猜不出来!那么我可以appendChildren()只运行一次还是有另一种解决方案?
document.getElementsByTagName("div")是一个实时收藏 - 它总是反映实际数据.
这意味着当您追加div项目时,它会自动附加到您的集合中.所以,它永远不会结束.
您可以使用[].slice.call它来复制您的集合,以便它不会更改.
这是工作演示片段:
function appendChildren() {
var allDivs = [].slice.call(document.getElementsByTagName("div"));
for (var i = 0; i < allDivs.length; i++) {
var newDiv = document.createElement("div");
allDivs[i].appendChild(newDiv);
console.log(allDivs[i]);
}
}
appendChildren();
// For demonstration purposes only:
document.getElementById('html').innerText = document.getElementById('one').outerHTML;Run Code Online (Sandbox Code Playgroud)
<div id="one">
<div id="two">
</div>
</div>
<pre id="html"></pre>Run Code Online (Sandbox Code Playgroud)
该html元素显示HTML结果 - 但是,它看起来很糟糕.您可以使用开发人员工具以熟悉的方式查看实际结构.