Javascript 是否可以更新/刷新节点列表?

Javascript 是否可以更新/刷新节点列表?,javascript,dom,Javascript,Dom,我有一个“Maindiv”(div),里面有4个元素。让我们考虑属于一个名为“子DIVE”的元素。当我用“Maindiv.getElementsByClassName('Subdiv').length;”查询“Subdiv”的数量时,它会像预期的那样返回4。但是如果我创建一个新的“Subdiv”并将其附加到我的主“Maindiv”中并立即查询长度,它将返回4(这是错误的),直到节点列表被更新(通常在附加新元素后20-50毫秒),它将返回4。最后,在这个间隔之后,它返回正确的数字(5)。我的问题是

我有一个“Maindiv”(div),里面有4个元素。让我们考虑属于一个名为“子DIVE”的元素。当我用“Maindiv.getElementsByClassName('Subdiv').length;”查询“Subdiv”的数量时,它会像预期的那样返回4。但是如果我创建一个新的“Subdiv”并将其附加到我的主“Maindiv”中并立即查询长度,它将返回4(这是错误的),直到节点列表被更新(通常在附加新元素后20-50毫秒),它将返回4。最后,在这个间隔之后,它返回正确的数字(5)。我的问题是,是否有一种方法可以在添加新元素后更快地更新/刷新节点列表

<div>
  <div id='Maindiv'>
    <div class='Subdiv' id='Subdiv1'></div>
    <div class='Subdiv' id='Subdiv2'></div>
    <div class='Subdiv' id='Subdiv3'></div>
    <div class='Subdiv' id='Subdiv4'></div>
  </div>
<button type='button' onclick='CreateNewSubdivs()'>Create Subdiv</button>
</div>

    <script>
function CreateNewSubdivs(){
var MainDiv = document.getElementById('Maindiv');
var SubdivsLength= MainDiv.getElementsByClassName('Subdiv').length;
var NewSubDiv = document.createElement('div');
var NewCopyNumber = SubdivsLength+1;
var NewSubDivID = 'Subdiv'+NewCopyNumber;
NewSubDiv.setAttribute('class', 'Subdiv');
NewSubDiv.setAttribute('id', NewSubDivID );
MainDiv.appendChild(NewSubDiv );
var SubdivsLength= MainDiv .getElementsByClassName('Subdiv').length;
console.log(SubdivsLength);  /// This number is wrong until 20-50 millisec later
}
</script>

创建细分曲面
函数CreateNewSubdivs(){
var MainDiv=document.getElementById('MainDiv');
var SubdivsLength=MainDiv.getElementsByClassName('Subdiv').length;
var NewSubDiv=document.createElement('div');
var NewCopyNumber=SubdivsLength+1;
var NewSubDivID='Subdiv'+NewCopyNumber;
setAttribute('class','Subdiv');
setAttribute('id',NewSubDivID);
main div.appendChild(NewSubDiv);
var SubdivsLength=MainDiv.getElementsByClassName('Subdiv').length;
console.log(SubdivsLength);///直到20-50毫秒之后,这个数字才正确
}

NodeList可以是静态或“活动”节点集合

在某些情况下,节点列表是活动的,这意味着DOM中的更改会自动更新集合

e、 g.
Node.childNodes

在其他情况下,节点列表是静态的,其中DOM中的任何更改都不会影响集合的内容

e、 g.
querySelectorAll()返回的列表

资料来源:


正如您在本例中看到的,我设置了一次对
childNodes
的引用。只要DOM发生更改,它就会保持最新

const list=document.querySelector('#main');
const items=list.childNodes;
设置间隔(()=>{
const item=document.createElement('li');

item.innerHTML='感谢您的回复,我正在做与您相同的事情,但是当您有许多maindiv和许多subdiv时,它不会返回正确的长度。我认为有一种方法可以更快地刷新列表,但正如您所说,列表会自动刷新,而且问题似乎是刷新需要一些时间,因为我拥有的元素数量。您发布的代码示例不一样。请尝试使用
childNodes
。再次感谢,但这对我来说是不可能的,我需要按类名获取它们,因为还有其他childNodes。遗憾的是,我无法向上投票,我是新来的。如果您需要计算的元素是直接子元素,您仍然可以使用
childNodes
并过滤掉您不想包含在计数中的元素。我非常感谢您的帮助。因此,如果我通过childNodes获取它们,然后创建一个数组,并将那些具有我想要的类名的元素推送到数组中,它会起作用吗?我还需要用它们做其他事情,这不仅仅是我需要的长度。