关键词:documentFragment 概念、documentFragment 使用场景
DocumentFragment
是 Web API 中的一部分,它是 DOM
(文档对象模型)的一个非常轻量级的节点,代表一组 DOM
节点的集合。它不是一个真实存在于 DOM
中的实体,因此被认为是“没有名字”的节点,或者说它不在文档的主体中渲染,通常用来作为临时的 DOM
节点仓库。
对于 DocumentFragment
的一部分内容,当它们在 DocumentFragment
之外操作时,并不会引起主 DOM 树的直接重排或重绘。然而,一旦你将整个 DocumentFragment
插入到 DOM 的一个永久节点上,那么在 DocumentFragment
内进行的更改将会触发 DOM 的重新渲染。
DocumentFragment API 有几个关键的特点和用途:
-
轻量级:
DocumentFragment
不会引起布局重排,因为其不是真实渲染的一部分。 -
节点集合:可以在
DocumentFragment
中节点集合进行分组,这个集合可以一次性插入到DOM
的某一部分中。 -
性能优化:通过在一个
DocumentFragment
中构建好一大块DOM
树,然后将它整体插入到主DOM
中,从而减少重排次数,提高效率。 -
事件不冒泡:因为
DocumentFragment
不是真实渲染的一部分,所以它的事件不会冒泡到上层的 DOM 元素,除非它被插入到了DOM
中。
使用场景
以下是一些使用 DocumentFragment
的常见场景:
-
批量操作:当你想要一次性添加多个节点到
DOM
树中时,使用DocumentFragment
可以将这些节点预先堆放在一个轻量级对象中,然后一次性添加。 -
离屏操作:如果你需要创建复杂的
DOM
结构,可以通过DocumentFragment
在不触发页面重排和重绘的情况下进行。 -
内容填充:在填充
DOM
元素内容之前,可以先创建一个DocumentFragment
完成所有节点的添加和排序,然后把它添加到DOM
树中。 -
避免内存泄漏:在某些情况下,它可以作为防止因移动节点而造成的内存泄漏的一个办法。
示例代码
// 创建 DocumentFragment
var fragment = document.createDocumentFragment();
// 创建多个节点或元素
var div = document.createElement("div");
var p = document.createElement("p");
// 将节点添加到 DocumentFragment 上
fragment.appendChild(div);
fragment.appendChild(p);
// 一次性将 DocumentFragment 添加到 DOM 的某个部分
var body = document.querySelector("body");
body.appendChild(fragment);
// 这时 div 和 p 被添加至 body 元素,而不会触发额外的布局重排。
DocumentFragment
提供了一个高效的方式去操作 DOM
而不影响页面的渲染性能,在很多需要进行批量 DOM 操作的场合非常有用。