createDocumentFragment()用法总结

news/2024/7/5 3:31:11

createDocumentFragment()用法总结

1.描述

DocumentFragments 是DOM节点。它们不是主DOM树的一部分。通常的用例是创建文档片段,将元素附加到文档片段,然后将文档片段附加到DOM树。在DOM树中,文档片段被其所有的子元素所代替。

因为文档片段存在于内存中,并不在DOM树中,所以将子元素插入到文档片段时不会引起页面回流(对元素位置和几何上的计算)。因此,使用文档片段通常会带来更好的性能。

2.关于DocumentFragment

  1. createDocumentFragment()方法,是用来创建一个虚拟的节点对象,或者说,是用来创建文档碎片节点。它可以包含各种类型的节点,在创建之初是空的。

  2. DocumentFragment节点不属于文档树,继承的parentNode属性总是null。它有一个很实用的特点,当请求把一个DocumentFragment节点插入文档树时,插入的不是DocumentFragment自身,而是它的所有子孙节点,即插入的是括号里的节点。这个特性使得DocumentFragment成了占位符,暂时存放那些一次插入文档的节点。它还有利于实现文档的剪切、复制和粘贴操作。

    另外,当需要添加多个dom元素时,如果先将这些元素添加到DocumentFragment中,再统一将DocumentFragment添加到页面,会减少页面渲染dom的次数,效率会明显提升。

  3. 如果使用appendChid方法将原dom树中的节点添加到DocumentFragment中时,会删除原来的节点。

  4. createDocumentFragment()方法和createElement()方法的区别:

    (1) 需要很多的插入操作和改动,继续使用类似于下面的代码则会很有问题

var ul = document.getElementById("ul");
for (var i = 0; i < 20; i++) {
   
    var li = document.createElement("li");
    li.innerHTML = "index: " + i;
    ul.appendChild(li);
}

由于每一次对文档的插入都会引起重新渲染(计算元素的尺寸,显示背景,内容等),所以进行多次插入操作使得浏览器发生了很多次渲染,效率是比较低的。这是我们提倡通过减少页面的渲染来提高DOM操作的效率的原因。一个优化的方法是将要创建的元素写到一个字符串上,然后一次性写到innerHTML上,这种利用浏览器对innerHTML的解析确实是相比上面的多次插入快了很多。但是构造字符串灵活性上面比较差,很难符合创建各种各样的DOM元素的需求。利用DocumentFragment,可以弥补这两个方法的不足。

因为文档片段存在于内存中,并不在DOM中,所以将子元素插入到文档片段中时不会引起页面回流(对元素位置和几何上的计算),因此使用DocumentFragment可以起到性能优化的作用。例如上面的代码就可以改成下面的片段。

var ul = document.getElementById("ul");
var fragment = document.createDocumentFragment();
for (var i = 0; i < 20; i++) {
   
    var li = document.createElement("li");
    li.innerHTML = "index: " + i;
    fragment.appendChild(li);
}
ul.appendChild(fragment);

(2) createElement创建的元素可以使用innerHTMLcreateDocumentFragment创建的元素使用innerHTML并不能达到预期修改文档内容的效果,只是作为一个属性而已。两者的节点类型完全不同,createElement创建的是元素节点,节点类型为1,createDocumentFragment创建的是文档碎片,节点类型是11。并且createDocumentFragment创建的元素在文档中没有对应的标记,因此在页面上只能用js中访问到。


                

http://lihuaxi.xjx100.cn/news/2121201.html

相关文章

RockyLinux8 RockyLinux9安装postgresql16-devel开发包

1、PG的插件扩展有些需要自行编译&#xff0c;需要安装PG开发包 2、RockyLinux8安装 #创建用户先 useradd postgressudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm sudo dnf -qy module disab…

十四届蓝桥杯 冶炼金属(二分 / 公式)

0322重写代码&#xff1a; #include<algorithm> #include<iostream> using namespace std;int maxx1000000010,minn-1;int main() {int n;scanf("%d",&n);for(int i0;i<n;i){int a,b;scanf("%d%d",&a,&b);maxx min(maxx,a/b)…

高中数学:复合函数基本考点整理

一、复合函数定义 类似f(g(x))或者f(f(x))这种形式的函数&#xff0c;就是复合函数 二、考点 1、复合函数的定义域 解题思路&#xff1a; 1、外函数的定义域是内函数的值域 2、确定内函数的定义域 例题 f(x)的定义域是(0,1)&#xff0c;求f(lnx)的定义域 2、复合函数的奇偶…

Linux文本编辑器vi的使用

一、文本的创建与查看 功能项命令实例作用文件创建vi /opt/learn/hello.txt在目录/opt/learn下创建文件hello.txt并进入vi编辑界面touch /opt/learn/test在目录/opt/learn下创建空白文件testcat > /opt/learn/catfile << EOF创建文件catfile并在屏幕上输入内容&#…

学会在 C++ 中使用变量:从定义到实践

C 变量 变量是用于存储数据值的容器。 在 C 中&#xff0c;有不同类型的变量&#xff08;使用不同的关键字定义&#xff09;&#xff0c;例如&#xff1a; int - 存储整数&#xff08;没有小数点&#xff09;&#xff0c;例如 123 或 -123double - 存储浮点数&#xff0c;带…

docker基础(五)之docker run(第二弹)

文章目录 概述docker run语法命令选项用法速查OPTIONS说明&#xff1a;-h "mars"-e username"ritchie"--env-file[]拓展&#xff1a;为什么 env.list &#xff0c;拓展名是.list那命名为env.txt 是否能使用--env-file识别呢 --cpuset"0-2" or --…

24计算机考研调剂 | 广州医科大学

广州医科大学何玉成老师招收机器人、生物医学工程、机械自动化相关专业学硕调剂生 考研调剂相关信息 一、单位简介 广州医科大学是一所以医学为优势和特色的国家“双一流”建设高校。生物医学工程学院于2022年4月成立&#xff0c;由中国科学院院士徐涛教授担任院长。学…

RuoYi-Vue若依框架-新增子模块启动后,前端页面报接口404

如何新建子模块可以参考RuoYi-Vue若依框架-如何新增子模块 我在新增依赖的时候提过版本号的问题&#xff0c;如果不是按照我的博客走的&#xff0c;然后接口报了404&#xff0c;可以选择添加父版本号&#xff0c;官方的参考文档是没写的&#xff0c;但添加了确实能解决这个问题…