js三种动态创建元素的区别

指针沙漏
• 阅读 4548

概述

js节点操作中有三种方式来动态创建元素,分别为:

  1. document.write()
  2. element.innerHTML
  3. document.createElement

采用以上三种方式会有不同的优缺点,为了在不同的场景下更为恰当的选择方法来创建元素,接下来对这三种方式进行分析总结。

1. document.write()

使用方法
document.write('<div>This is a Test</div>');
作用

在页面文档添加元素

使用弊端

当页面文档流加载完成之后,再调用该语句会造成页面重绘,场景如下:

<div>原来存在的页面元素</div>
<button>点击我增加新元素</button>
<script>
    document.querySelector('button').onclick = function () {
        document.write('<div>This is a Test</div>');
    }
</script>

出现的页面效果为:
js三种动态创建元素的区别
此时页面文档流已经加载完毕,再点击按钮,出现以下情况:
js三种动态创建元素的区别
检查页面元素:
js三种动态创建元素的区别
从上可以发现,之前的页面文档元素被重写

总结

如果非必须的情况下,不建议使用该方法创建元素,原因:

  1. 逻辑性不强
  2. 操作失误容易导致整个页面被重写

2. element.innerHTML

使用方法
<div></div>
<script>
    document.querySelector('div').innerHTML = '<a href="#">新添加的</a>';
</script>
作用

为某个元素内添加子元素

使用效率分析
  1. 采用字符串拼接的方式
    假如有以下应用场景,需要添加1000个元素
 <div></div>
<script>
    var newDate = new Date();
    for (var i = 0; i < 1000; i++) {
        document.querySelector('div').innerHTML += '<a href="#">新添加的</a>';
    }
    var oldDate = new Date();
    console.log(oldDate - newDate);
</script>

设想下,如果要完成以上的操作,浏览器需要花多少秒?
运行以上代码:
js三种动态创建元素的区别
可以看到,总共需要花费1秒多,将近2秒。出现这种情况的原因主要为:字符串是不可变的,每次创建新的字符串都需要开辟新的空间进行存储数据,因此添加1000个元素,也即需要开辟1000个空间,所以当数据量不断增加的时候,效率会变得越来越低。

  1. 采用数组拼接的方式

同样是添加1000个元素,这时采用数组拼接的方式进行,代码如下:

<div></div>
<script>
    var arr = [];
    var newDate = new Date();
    for (var i = 0; i < 1000; i++) {
        arr.push('<a href="#">新添加的</a>');
    }
    document.querySelector('div').innerHTML = arr.join('');
    var oldDate = new Date();
    console.log(oldDate - newDate);
</script>

运行结果如下:
js三种动态创建元素的区别
可以看到,此时浏览器完成以上操作仅需0.005秒,相比字符串的拼接效率大大升高。

总结
  1. 数据量比较小的情况下:两种方式都可以采用
  2. 数据量比较大:建议采用数组拼接的方式

3. document.createElement

使用方法
<div></div>
<script>
    var a = document.createElement('a');
    var div = document.querySelector('div');
    div.appendChild(a);
</script>
作用

给某一元素添加子元素

使用效率分析

同样考虑添加1000个元素的场景,代码如下:

<div></div>
<script>
    var div = document.querySelector('div');
    var newDate = new Date();
    for (var i = 0; i < 1000; i++) {
        var a = document.createElement('a');
        div.appendChild(a);
    }
    var oldDate = new Date();
    console.log(oldDate - newDate);
</script>

运行结果如下:
js三种动态创建元素的区别
可以看到运行时间还是比较低的。

总结

  1. 非必须情况不建议使用document.write()
  2. 虽然innerHTML方式的数组拼接方法与createElement效率差不多,但是当数据量很大的情况下, 不同浏览器下,innerHTML效率比createElement高,读者可以自行下去实践。
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
3年前
java线程
1.进程和线程的区别是什么?进程是执行着的应用程序,而线程是进程内部的一个执行序列。一个进程可以有多个线程。线程又叫轻量级进程。2.创建线程有几种不同方式?你喜欢哪种?为什么?有三种方式可以用来创建线程:继承Thread类实现Runnable接口应用程序可以使用Executor框架来创建线程池实现Runnabl
Stella981 Stella981
3年前
Python+Selenium自动化篇
本篇文字主要学习selenium定位页面元素的集中方法,以百度首页为例子。0.元素定位方法主要有:id定位:find\_element\_by\_id('')name定位:find\_element\_by\_name('')class定位:find\_element\_by\_class\_name(''
Wesley13 Wesley13
3年前
JS动态加载JS
1、直接document.write<scriptlanguage"javascript"document.write("<scriptsrc'test.js'<\\/script");</script2、动态改变已有script的src属性<scriptsrc''id"s1"</script<
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
3年前
Java日期时间API系列30
  实际使用中,经常需要使用不同精确度的Date,比如保留到天2020042300:00:00,保留到小时,保留到分钟,保留到秒等,常见的方法是通过格式化到指定精确度(比如:yyyyMMdd),然后再解析为Date。Java8中可以用更多的方法来实现这个需求,下面使用三种方法:使用Format方法、 使用Of方法和使用With方法,性能对比,使用
Stella981 Stella981
3年前
OpenCV访问像素点
三种方法迭代器创建一个Mat::Iterator对象it,通过itMat::begin()来的到迭代首地址,递增迭代器知道itMat::end()结束迭代;while(it!Scr.end<Vec3b()){//(it)00;//蓝色通道置零;
Stella981 Stella981
3年前
NVM、NPM、Node.js的安装选择
在安装和使用这三种工具时,我们有很多方式可以选择,这些方法各有优劣,每个人都有自己用起来比较习惯的配置,所以我在这里记录下自己比较习惯的一种安装方式与其他一些可能的选项。NVM、NPM、Node.js的关系假定我们的最终目的是为了安装并使用Node.js,那么我们有两种常规的选择:Node.js安装包
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(