document.getElementsByTagName 和 javascript 行为返回意外结果

问题描述 投票:0回答:1

HTML:

<html>
   <body>
       <div id="a">
       </div>
   </body>
</html>

上面是我给出的简单 html,我编写了一个函数来在每个 div 中添加一个子 div。

 function appendChildren() {
       var allDivs = document.getElementsByTagName("div");
       console.log(allDivs) // [div#a, a: div#a]
       console.log(allDivs.length) // 1
       for (let i = 0; i < allDivs.length; i++) {
           let newDiv = document.createElement("div");
           allDivs[i].appendChild(newDiv);
       }
   }
   appendChildren();

我期望上面的函数会在每个 div 中添加 div,但在调用appendChildren()后它没有按预期工作,它进入无限循环并保持加载。帮助我了解它是如何以及为什么发生的,这将帮助我和其他学习 javascript 的人。谢谢!!!

javascript html dom ecmascript-6
1个回答
0
投票

这将返回一个“实时集合”:

var allDivs = document.getElementsByTagName("div");

这意味着,随着 DOM 的更新,这个集合也会更新。 巧合的是,这是所有

<div>
元素的集合。 并且您要添加一个
<div>
元素:

let newDiv = document.createElement("div");
allDivs[i].appendChild(newDiv);

因此循环的每次迭代都会添加循环的下一个元素。 无限。

一种解决方案可能是从原始集合构建一个数组,使其不再“活动”:

var allDivs = Array.from(document.getElementsByTagName("div"));

它可能在非常大的元素集上表现不佳(我还没有测试过),但对于像所示代码这样的小型简单功能来说它很好。

© www.soinside.com 2019 - 2024. All rights reserved.