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

Posted 自诩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了嫌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/

 

以上是关于嫌innerHTML性能不够好,推荐几个新方法的主要内容,如果未能解决你的问题,请参考以下文章

有些ES6方法极简,但是性能不够好

如何使用颤动的底部导航栏导航到几个新页面?

ES6中常用的几个新特性

推荐几个免费得云主机的方法(优质长期放送)

总是抱怨处境不好,为什么不从自己身上找原因呢?

从 Firefox 扩展中清除 innerHTML 的最佳方法