-1

由于forEach数组方法现在可以在NodeList. 我想知道为什么如果您childNodes在循环时更改 NodeList的内容forEachforEach却不会检测到更改。

grid.childNodes.forEach(function(tableRow, index, nodeList) {
  tableRow.remove();
});

在这里,我试图遍历我的表(网格)元素子元素并tableRow从表中删除每个子元素()。但是,forEach永远不要完全循环每个元素,总是遗漏最后一个元素,我认为这与 childNodes NodeList 处于活动状态以及 forEach 无法正确跟随它或其他原因有关tableRowremove

4

1 回答 1

1

这是因为,在较低级别上,.forEach()仍然保持计数并使用元素的索引。当您删除一些时,您将从数组/节点列表的开头删除它们,然后索引器变得不准确,因为所有元素索引都必须向下移动一个。例如,以前位于索引位置 5 的元素现在位于索引位置 4。

对于这样的事情,最好使用计数循环并从最后一个索引开始删除元素并向后工作。这将在循环期间保持适当的计数,因为不会修改元素到索引的映射。

这是一个例子:

let grid = document.getElementById("myTable");
document.querySelector("input").addEventListener("click", function(){
  for(i = grid.childNodes.length-1; i > -1; i--) {
    grid.removeChild(grid.childNodes[i]);
  }
});
<table id="myTable">
 <tr>
   <td>Row 1</td>
 </tr>
 <tr>
   <td>Row 2</td>
 </tr>
 <tr>
   <td>Row 3</td>
 </tr>
 <tr>
   <td>Row 4</td>
 </tr>
 <tr>
   <td>Row 5</td>
 </tr> 
</table>

<input type="button" value="Delete Rows">

现在,如果您要使用DOM Table API.deleteRow()

let grid = document.getElementById("myTable");
document.querySelector("input").addEventListener("click", function(){
  for(i = grid.rows.length-1; i > -1; i--) {
    grid.deleteRow(i);
  }
});
<table id="myTable">
 <tr>
   <td>Row 1</td>
 </tr>
 <tr>
   <td>Row 2</td>
 </tr>
 <tr>
   <td>Row 3</td>
 </tr>
 <tr>
   <td>Row 4</td>
 </tr>
 <tr>
   <td>Row 5</td>
 </tr> 
</table>

<input type="button" value="Delete Rows">

而且,当然,您可以通过清除.innerHTML.

let grid = document.getElementById("myTable");
document.querySelector("input").addEventListener("click", function(){      
    grid.innerHTML = "";
});
<table id="myTable">
 <tr>
   <td>Row 1</td>
 </tr>
 <tr>
   <td>Row 2</td>
 </tr>
 <tr>
   <td>Row 3</td>
 </tr>
 <tr>
   <td>Row 4</td>
 </tr>
 <tr>
   <td>Row 5</td>
 </tr> 
</table>

<input type="button" value="Delete Rows">

于 2018-07-07T22:43:41.607 回答