首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何更优地去创建DOM元素

如何更优地去创建DOM元素

作者头像
IMWeb前端团队
发布于 2019-12-03 09:32:04
发布于 2019-12-03 09:32:04
2.3K10
代码可运行
举报
文章被收录于专栏:IMWeb前端团队IMWeb前端团队
运行总次数:0
代码可运行

本文作者:IMWeb yuchenli 原文出处:IMWeb社区 未经同意,禁止转载

如何更优地去创建DOM元素

创建DOM元素是最为基本的DOM操作,这里先举个栗子

这里先使用createElement创建了10个li元素

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var list = document.querySelector('.list'),
    num = 10,;

for (t = 0; t < num; t++) {
   var li = document.createElement('li');
   list.appendChild(li);
}

measurethat测试的结果是:

这里简单地通过createElement创建DOM是存在比较严重的性能问题的:

1、createElement本身就是不小的性能开支

2、 每次创建li元素都换插入到DOM中,会引起多次重排和重绘。

innerHTM

对面上面那种问题,可能就会想到通过innterHTML方式去创建DOM元素 这里先举个栗子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var str = '';
for (t = 0; t < num; t++) {
    str += `<li><li>`;
}
list = str;

测试结果如下:

相比之前的createElement方式性能提升了很多,不过这种方式仍然存在弊端:不方便获取创建的li元素,你不得不要等它渲染完成时,再去获取它。

cloneNode

cloneNode是用于克隆节点的,相比直接调用createElement创建DOM元素而言,它所花费的开销会更小些,就好比:读书的时候,抄作业要比做作业的容易的多。

举个栗子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var li = document.createElement('li');
for (t = 0; t < num; t++) {
   var cloneLi = li.cloneNode();
   list.appendChild(cloneLi);
}

测试结果:

从结果中看出,cloneNode虽然比createElement快,但是还是不。那么还有没有更快的方式去创建DOM元素呢?接下来先介绍一个东西DocumentFragment

DocumentFragment

DocumentFragment是示一个没有父级文件的最小文档对象。它被当做一个轻量版的 Document使用,用于存储已排好版的或尚未打理好格式的XML片段。最大的区别是因为DocumentFragment不是真实DOM树的一部分,它的变化不会引起DOM树的重新渲染的操作,且不会导致性能等问题。考虑这个因素,我们可以结合cloneNode和DocumentFragment在去创建DOM元素并插入到文档:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var fragment = document.createDocumentFragment();
var li = document.createElement('li');
for (t = 0; t < num; t++) {
   var cloneLi = li.cloneNode();
   fragment.appendChild(cloneLi);
}
list.appendChild(fragment);

优化cloneNode+fragment

我们完全没有必要按照上面的方式,通过100次循环去将li放入fragment,因为fragment自身是可以被克隆的。利用这种特性,可以将100次循环降低到10次循环,具体的代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function cloneMultiple (elem, times, deep) {
   var fragment = document.createDocumentFragment();
   fragment.appendChild(elem.cloneNode(deep));
   if (times <= 1) {
       return fragment;
   }

   var i = 1,
       rest = [];

   while((times % 2 === 0 || !!(rest[i] = 1 && --times)) && (times /= 2) && times >3 ) {
        i += 1;  
   }

   while ( times > 1 ) {
      fragment.appendChild(elem.cloneNode(deep));
      --times;
   }

    for ( ; i; --i ) {
      fragment.appendChild(fragment.cloneNode(true));   
      rest[i] && fragment.appendChild(elem.cloneNode(deep));
    }

   return fragment;
}

 var li = document.createElement('li');
 list.appendChild(cloneMultiple(li, num, true));

最终测试结果

测试样例

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-09-05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
大佬们 这个结果是有问题吗 为什么最后使用cloneMultiple函数创建 时间会更长呢
大佬们 这个结果是有问题吗 为什么最后使用cloneMultiple函数创建 时间会更长呢
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
DOM操作笔记
DOM 是 JavaScript 操作网页的接口,全称为“文档对象模型”(Document Object Model)。
bamboo
2019/01/29
1.1K0
DOM操作笔记
什么是时间分片(Time Slicing)?
所以为了避免这种情况,我们可以使用两种方案,一种是Web Worker,另一种是时间切片(Time Slicing)。
陈大鱼头
2020/09/21
1.5K0
什么是时间分片(Time Slicing)?
JavaScript中的时间分片(Time Slicing)
当延迟超过100ms,用户就会察觉到轻微的延迟。所以为了避免这种情况,我们可以使用两种方案,一种是Web Worker,另一种是时间切片(Time Slicing)。
刘亦枫
2020/03/19
3.3K0
Web 性能优化-页面重绘和回流(重排)
常见的优化网络请求的方法有:DNS Lookup,减少重定向,避免 JS、CSS 阻塞,并行请求,代码压缩,缓存,按需加载,前端模块化…
李振
2021/11/26
1.3K0
Web 性能优化-页面重绘和回流(重排)
前端页面优化,减少 reflow 的方法
如你改变了一个div的位置,或者是改变了这个div的width, height, position 或者布局类的样式。
极度狂热
2022/06/08
2860
前端性能优化小结
一个老生常谈的问题,算是一项任重而道远的工程,总的来看优化范围很广,但我们可以从单个点逐步切入,养成自动代入优化思维才是目的,这里只做简单记录一下。
2Broear
2024/03/12
2230
前端性能优化小结
使用DocumentFragment优化DOM操作
不过众所周知的原因,对 DOM 反复操作会导致页面重绘、回流,效率非常低,而且页面可能会被卡死。
九旬
2020/10/23
7560
抖音超火的罗盘时钟效果
4. 由于页面加载需要一定时间,会导致js代码未能立即执行,页面会有一段空白阶段,所以添加一个立即执行函数让页面一加载就有效果呈现
小丞同学
2021/08/16
7110
DOM操作
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
奋飛
2019/08/15
9810
「前端进阶」高性能渲染十万条数据(时间分片)
在实际工作中,我们很少会遇到一次性需要向页面中插入大量数据的情况,但是为了丰富我们的知识体系,我们有必要了解并清楚当遇到大量数据时,如何才能在不卡主页面的情况下渲染数据,以及其中背后的原理。
ConardLi
2019/09/19
2.6K0
「前端进阶」高性能渲染十万条数据(时间分片)
前端: 如何渲染十万条数据
最直接的方法就是直接渲染出来,但是这样的做法肯定是不可取的,因为直接渲染太耗性能了。
用户9914333
2022/07/22
2.9K0
DOM
DOM(文档对象模型)是针对HTML和XML文档的一个API(应用程序编程接口)。DOM描绘了一个层次变化的节点树,允许开发人员添加、移除和修改页面的某一部分。
奋飛
2019/08/15
1.7K0
ECMAScript性能优化技巧与陷阱
随着Web应用变得越来越复杂,对性能的要求也在不断提高。ECMAScript(即JavaScript的标准形式)作为Web开发的核心语言,其性能优化成为每位前端开发者必须掌握的核心技能之一。本文将深入探讨ECMAScript性能优化的各种技巧,并揭示隐藏在日常编码中的性能陷阱,帮助开发者在追求高性能的道路上少走弯路,提升Web应用的流畅度和用户体验。
井九
2024/10/12
1280
ECMAScript性能优化技巧与陷阱
属性 元素的内容 创建,插入和删除节点 虚拟节点
表示HTML文档元素的HTMLElement对象定义了读/写属性。映射了元素的HTML属性。HTMLElement定义了通用的HTTP属性。以及事件处理程序的属性。特定的Element子类型为其元素定义了特定的属性。
mySoul
2018/08/07
2.8K0
一文搞懂JS-Web-API——DOM
本章介绍 DOM 操作的知识点和题目。包括 DOM 结构,常用 DOM 操作,DOM 性能优化等。DOM 是网页结构的基础,学会 DOM 操作才可以做网页开发。
江拥羡橙
2022/11/17
5720
一文搞懂JS-Web-API——DOM
dom操作
var div = document.getElementById(‘id名’);//返回是一个,不是数组 var div = document.getElementsByTagName(‘标签名’);//返回数组 (实时) var div = document.getElementsByClassName(‘class名’);//(带s的都是数组) var div = document.getElementsByName(‘name’);//name名 var div = quarySelector();//css选择器 选择一个 里面放’id’,‘class’… var div - quarySelectorAll();//css选择器 选择一个(静态的,不实时。用途受局限)
微醺
2019/01/17
7900
如何将HTML字符转换为DOM节点并动态添加到文档中
将字符串动态转换为DOM节点,在开发中经常遇到,尤其在模板引擎中更是不可或缺的技术。 字符串转换为DOM节点本身并不难,本篇文章主要涉及两个主题:<br />
用户1631416
2018/09/14
8.8K0
如何将HTML字符转换为DOM节点并动态添加到文档中
如何渲染几万条数据并不卡住界面?
如何在不卡住页面的情况下渲染数据,也就是说不能一次性将几万条 都渲染出来,而应该一次渲染部分 DOM,那么就可以通过 requestAnimationFrame 来 每 16 ms 刷新一次。
TimothyJia
2020/02/18
6380
如何渲染几万条数据并不卡住界面?
13个需要知道的方法:使用 JavaScript 来操作 DOM
DOM 或文档对象模型是 web 页面上所有对象的根。它表示文档的结构,并将页面连接到编程语言。它的结构是一个逻辑树。每个分支结束于一个节点,每个节点包含子节点、对象。DOM API非常庞大,在本文中,咱们只讨论比较常用有有用的那些API。
前端小智@大迁世界
2022/06/15
7870
JS中文档碎片的理解和使用
每次对dom的操作都会触发"重排"(重新渲染界面,发生重绘或回流),这严重影响到能耗,一般通常采取的做法是尽可能的减少dom操作来减少"重排"
用户9914333
2022/07/22
1.7K0
相关推荐
DOM操作笔记
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档