替换HTMLElement的所有孩子?

时间:2011-02-14 10:31:38

标签: javascript dhtml

在我的代码中,我经常需要用新的子列表替换某个HTML容器的所有子容器。

最快的方法是什么?我目前的方法是将所有新元素收集到DocumentFragment中。我发现然后实际替换孩子的唯一方法是逐个删除所有孩子,并附加片段。有没有更快的方法?

注意:解决方案不需要跨浏览器,但最好不要求使用3d-party组件,例如jQuery。目标设备是非常慢CPU上的WebKit,所以我需要完全控制任何回流。

6 个答案:

答案 0 :(得分:32)

如果你只想替换所有孩子,关于类型,你为什么不把它的内容设置为''然后添加你的代码:

container.innerHTML = '';
container.appendChild( newContainerElements );

基本上会以最快的方式移除所有孩子:)

答案 1 :(得分:5)

使用现代JS!直接使用remove而不是removeChild

while (container.firstChild) {
    container.firstChild.remove();
}

可替换地:

let child;
while (child = container.firstChild) {
    child.remove();
}

答案 2 :(得分:1)

设置innerHTML并不起作用的可能替代方案:

while(container.firstChild)
{
  container.removeChild(container.firstChild);
}
container.appendChild(newChild)

答案 3 :(得分:0)

这不是直接解决问题,但是在大多数情况下,它是可用的,并且可能是性能更高的方法之一。

您可以换出整个节点,而不用删除并填充其内容。

oldNode.parentElement.replaceChild(newNode, oldNode)

答案 4 :(得分:0)

从最上面的答案开始,我们还可以使用outerHTML在一行中做到这一点。

container.innerHTML = newContainerElements.outerHTML

答案 5 :(得分:0)

现在可以使用(支持跨浏览器)replaceChildren() API替换所有子级:

container.replaceChildren(...arrayOfNewChildren);

您还可以使用相同的API来删除现有子级,而无需替换它们:

container.replaceChildren();

Chrome / Edge 86 +,Firefox 78 +,Safari 14+等支持此功能。与这里提出的其他方法相比,该方法可能更快,因为移除了大孩子,新孩子的添加是a)不需要innerHTML,并且b)一步而不是多个。