嫌innerHTML性能不够好,推荐几个新方法

innerHTML我们都很熟悉,并且在初学js的时候用的很多,也很方便,比一个个创建dom元素,再利用appendChild拼接方便多了,但是当我们要处理的量比较大时,innerHTML就GG了,看过网上别人分享的一些改进方法,在这里也整理一下分享给大家。

第一种解决方案:

使用insertAdjacentHTML()方法,

这个方法接收两个参数,一个是where,一个是text,

where是指插入的位置,有四个可选值,分别为:

  1. beforeBegin: 插入到标签开始前
  2. afterBegin:插入到标签开始标记之后
  3. beforeEnd:插入到标签结束标记前
  4. afterEnd:插入到标签结束标记后

text即为html文本,例如“<li></li>”;

关于四个位置参数的解析请看代码:

先看一下html结构是这样的:

<ul id="list">
      <li>one</li>
</ul>

1、beforeBegin: 插入到标签开始前:

var list=document.getElementById("list");
list.insertAdjacentHTML("beforeBegin","<li>two</li>");

在浏览器中的查看代码是这样的:

<li>two</li>
<ul>
  <li>one</li>
</ul>

2、afterBegin:插入到标签开始标记之后

var list=document.getElementById("list");
list.insertAdjacentHTML("afterBegin","<li>two</li>");

在浏览器中是这样的:

<ul id="list">
      <li>two</li>
      <li>one</li>
</ul>

3、beforeEnd:插入到标签结束标记前

var list=document.getElementById("list");
list.insertAdjacentHTML("beforeEnd","<li>two</li>");

在浏览器中是这样的:

<ul id="list">
       <li>one</li>
       <li>two</li>
</ul>

4、afterEnd:插入到标签结束标记后

var list=document.getElementById("list");
list.insertAdjacentHTML("afterEnd","<li>two</li>");

在浏览器:

<ul id="list">
      <li>one</li>
</ul>
<li>two</li>

关于第二个参数,可以是一个字符串参数,像这样:

var html="<li>two</li>";
list.insertAdjacentHTML("afterEnd",html);

各大浏览器的新版本都已经支持这个方法。具体的版本支持情况可以自行百度。

再来一个自制的方法:appendHTML();

如果你了解appendChild方法,应该能猜到,appendHTML方法就是在一个元素之后追加一段html代码,具体实现方法如下:

方法思想:

  1. 首先创建一个容器,这里是div;
  2. 然后将要追加的html代码添加到这个容器中;
  3. 取出这个容器中的所有节点,遍历每一个节点;
  4. 创建一个文档片段,fragment=document.createDocumentFragment();
  5. 将节点复制到文档片段中,这里使用cloneNode函数执行深复制;
  6. 最后将文档片段追加到元素中。
 1 function appendHTML(ele,html,site){
 2
 3                 var div=document.createElement("div"),
 4                     nodes=null,
 5                     fragment=document.createDocumentFragment();
 6                 div.innerHTML=html;
 7                 nodes=div.childNodes;
 8                 for(var i=0,len=nodes.length;i<len;i++){
 9                     fragment.appendChild(nodes[i].cloneNode(true));
10                 }
11                 site=site||"before";
12                 site !== "before"? ele.appendChild(fragment) : ele.insertBefore(fragment, ele.firstChild);
13                 // 回收内存
14                 nodes=null;
15                 fragment=null;
16             }

可以这样使用:

appendHTML(list,html,"after");
appendHTML(list,html,"before");

分别产生的效果是:(还是利用上面的html代码结构)

//after
<ul id="list">
      <li>one</li>
       <li>two</li>
</ul>
//before
<ul id="list">
      <li>two</li>
       <li>one</li>
</ul>

参考资料:

http://www.zhangxinxu.com/

时间: 2024-10-04 18:22:24

嫌innerHTML性能不够好,推荐几个新方法的相关文章

25个Apache性能优化技巧推荐

25个Apache性能优化技巧推荐 Apache至今仍处于web服务器领域的霸主,无人撼动,没有开发者不知道.本篇文章介绍25个Apache性能优化的技巧,如果你能理解并掌握,将让你的Apache性能有显著的提升! Apache部分: 1. 移除不用的模块. 2. 使用 mod_disk_cache NOT mod_mem_cache . 3. 扁平架构配置mod_disk_cache. 4. 安装恰当的Expires, Etag, 和 Cache-Control Headers . 5. 将缓

重点:怎样正确的使用QThread类(注:包括推荐使用QThread线程的新方法QObject::moveToThread)

背景描述: 以前,继承 QThread 重新实现 run() 函数是使用 QThread唯一推荐的使用方法.这是相当直观和易于使用的.但是在工作线程中使用槽机制和Qt事件循环时,一些用户使用错了.Qt  核心开发人员Bradley T. Hughes, 推荐使用QObject::moveToThread 把它们移动到线程中.不幸的是, 以用户反对这样使用.Olivier Goffart, 前Qt  核心开发人之一, 告诉这些用户你们不这样做就错了.最终这俩种用法我们都在QThread的文档中发现

mahout推荐12-相似度方法汇总

将各个计算用户相似度的方法弄过来了,可以参考下.实际运行代码 数据文件 intro.csv内容: 直接复制就行了 1,101,5.01,102,3.01,103,2.5 2,101,2.02,102,2.52,103,5.02,104,2.0 3,101,2.53,104,4.03,105,4.53,107,5.0 4,101,5.04,103,3.04,104,4.54,106,4.0 5,101,4.05,102,3.05,103,2.05,104,4.05,105,3.55,106,4.0

推荐使用的派生方法:super().__init__()

""" 推荐使用的派生方法:super().__init__() --super(),严格继承属性查找顺序 --super(),会得到一个特殊的对象,该对象就是专门用来 访问父类中的属性的(严格按照继承的关系) --super().__init__(),此处__init__(), 括号中不需要传值self. --在Python2中,super()的完整用法是super(自己类名,self), 在Python2中需要写完整,而Python3中可以简写为super(). &quo

EditPlus 3.7.1186 中文版(10月27日更新)重大性能改进,推荐更新!

3.7.* 版的 EditPlus 存在性能问题:加载行数比较多的文档时,要等很长的时间.加载一个十几兆的文本文件,可能需要等十几秒.在编辑窗口内翻页也会有明显的迟滞感.而此前的 3.6 版本并非如此. 经过我和软件作者的联合调试,新版本的 EditPlus 3.7.1186 版大幅度地优化了加载.格式化文本的性能. 加载十万行文本文档时,重新回到了3.6版秒开的速度. 此外,新版本还更好地支持编辑统一码扩展汉字 B.C.D 区(CJK-Ext B.C.D),对于使用复码(Surrogate p

createElement与innerHtml性能比较

js中,动态添加html的方法大致就是两种,一种是document.createElement等方法创建,然后使用Element.appendChild添加,或者是使用Element.innerHTML = sHTML的方式.两种方法,显然前面一种更加灵活,除了Element.appendChild方法外,还有insertBefore等等其他dom操作方式.这里且不谈灵活性,但就性能做一个探索. 比较的方式很简单: 各生成10000次形如<div><span>性能测试</sp

作为一个性能架构师推荐大家看的基本性能测试必备书籍

学习 JAVA,有什么书籍推荐?学习的方法和过程是怎样的?

原创:一只有梦想的鱼 原文链接:https://www.cnblogs.com/zhanlaoshi/p/10845765.html 本文内容比较长,主要包含下面几部分内容: 学习路线以及方法推荐 书单推荐 教程推荐 推荐一个学习中常看的仓库 学习/编程好习惯 面试必知 打开UC浏览器 查看更多精彩图片 学习路线以及方法推荐对于学习路线的话,我说一条我比较推荐的,我相信照着这条学习路线来你的学习效率会非常高.下面提到的书籍以及相关学习视频都答主已经整理好,文末有免费获取方式.很多朋友这几天领取了

几个 Ceph 性能优化的新方法和思路(2015 SH Ceph Day 参后感)

一周前,由 Intel 与 Redhat 在10月18日联合举办了 Shanghai Ceph Day.在这次会议上,多位专家做了十几场非常精彩的演讲.本文就这些演讲中提到的 Ceph性能优化方面的知识和方法,试着就自己的理解做个总结. 0. 常规的 Ceph 性能优化方法 (1). 硬件层面 硬件规划:CPU.内存.网络 SSD选择:使用 SSD 作为日志存储 BIOS设置:打开超线程(HT).关闭节能.关闭 NUMA 等 (2). 软件层面 Linux OS:MTU.read_ahead 等