开发者问题收集

使用 for 循环将子 div 附加到每个 div

2015-04-13
7748

我想将子 div 附加到每个给定的父 div。子 div 应该通过调用 decorateDiv() 进行装饰。

例如,执行 appendChildren 后,以下 div 应采用以下形式(假设 decorateDiv 不执行任何操作)

function appendChildren() 
{
var allDivs = document.getElementsByTagName("div");

for (var i = 0; i < allDivs.length; i++) 
  {
   var newDiv = document.createElement("div");
   decorateDiv(newDiv);
   allDivs[i].appendChild(newDiv);
  }
}

// Mock of decorateDiv function for testing purposes
function decorateDiv(div) {}

我做错了什么?

3个回答

您发现 .getElementsByTagName() 返回了一个 实时 NodeList。这意味着,您添加到页面的新 <div> 元素会在您这样做后立即成为列表的一部分。

您可以做的是预先将该 NodeList 转换为普通数组:

var allDivs = document.getElementsByTagName("div");
allDivs = [].slice.call(allDivs, 0);

现在,在循环中使用“allDivs”只会将您的新元素附加到您最初寻找它们时存在的元素中。

Pointy
2015-04-13

condition 字段中使用 allDivs.length 将在每次循环迭代时访问 length 属性。因此,在函数外部为 length 声明一个变量,并在 condition 字段中指定变量名称。

function appendChildren() 
{
var allDivs = document.getElementsByTagName("div");
var len = allDivs.length;

for (var i = 0; i < len ; i++) 
  {
   var newDiv = document.createElement("div");
   decorateDiv(newDiv);
   allDivs[i].appendChild(newDiv);
  }
}

// Mock of decorateDiv function for testing purposes
function decorateDiv(div) {}
Kumar Guru
2015-08-22

getElementsByTagName 返回 实时 NodeList ,每添加一个新 div,其长度就会增加。

要么使用 document.querySelectorAll() ,它 不是实时 NodeList

let allDivs = document.querySelectorAll("div");

或者将实时 NodeList 转换为数组。使用 ES6 [...spread] 运算符,这真的很简单。

let allDivs = [...document.getElementsByTagName("div")];
Thiru
2018-04-13