• Js中的appenChild,insertBefore--createDocumentFragment


    平时项目中会有一些流程,或者是评论相关的东西,这些一般只会是在页面初次加载一部分,剩余部分搞一个更多的标签,当点击更多的时候,ajax请求把所有数据加载完(当然这里也有分页的实现方法,本篇不作讨论), ajax加载的数据一般会运用到appendChild,insertBefore方法来附加在原来标签前后,相信大家对循环附加一定很熟练了,这里我要写的是另一种在性能方面比较赞的方法--运用文档片段,在低版本的IE下,缺少优化机制,循环附加造成的回流和渲染,会让浏览器hold不住(几何改变会造成浏览器重排)

    看看一般appendChild做法,当然你可以直接innerHtml或者jquery的Html到容器上,这里是考虑原HTML可能包含事件,才把Html字符串转换为节点。

     1 var ele=document.creatElement("div");
     2 
     3 ele.innerHtml=html;//ajax获取到的
     4 
     5 var divs=ele.childNodes;//所以子节点
     6 
     7 for(var i=0,length=divs.length;i<length;i++)
     8 
     9   {
    10 
    11       container.appendChild(divs[i].cloneNode(true));//克隆到需要附加的容器
    12 
    13 }
    View Code

    优化:

    1 //接上例子
    2 var fragment=document.createDocumentFragment();
    3 
    4 for(var i=0;length=divs.length;i++){
    5     fragment.apendChild(divs[i].cloneNode(true));
    6 
    7 }
    8 //最后一次性附加到容器
    9 container.appendChild(fragment);
    View Code

    扩展原型:

     1 //IE9+
     2 //IE678隐藏了对HTMLElement的访问
     3 //请用var appendHtmlOp=function(el,html){
     4 //        el.appendChild(frament);//这里不能用this,this指向了window;
     5 //}
     6 HTMLElement.prototype.appendHtmlOp=function(html){
     7            var div=document.createElement("div"),nodes=null,
     8                         fragment=document.createDocumentFragment();
     9 
    10                 div.innerHTML=html;
    11                 nodes=div.childNodes;
    12               for(var i=0,length=nodes.length;i++){
    13                         fragment.appendChild(nodes[i].cloneNode(true));
    14             }
    15           this.appendChild(fragment);
    16           //释放
    17           nodes=null;
    18           fragment=null;
    19 
    20 }
    View Code

    同理也是可以直接修改insertBefore的;把前面的最后的appendChild改为insertBefore;

    当然可以传个标识参数来区分;

     1 var appendHtmlOp=function(el,html,where){
     2     var     div=document.createElement("div"),fragment=document.createDocumentFragment();nodes=null;
     3 
     4    where=where||"bottom";
     5   div.innertHTML=html;
     6   nodes=div.childNodes;
     7  for(var i=0,length=nodes.length;i<length;i++){
     8             fragement.appendChild(nodes[i].cloneNode(true));
     9    }
    10       where!=="before"?el.appendChild(fragment):el.insertBefore(fragment,el.firstChild);
    11 }
    View Code

    这就是文档片段优化法,来减少appendChild多次直接附加在HTML后,使其呈现几何数值增加;

  • 相关阅读:
    web图片100%宽度自适应,高度不塌陷
    基于Kafka+ELK搭建海量日志平台
    一句话撸完重量级锁、自旋锁、轻量级锁、偏向锁、悲观、乐观锁等
    MySQL数据库设计规范
    夺命连环问:一个 TCP 连接可以发多少个 HTTP 请求?
    [Kafka]
    ZooKeeper学习总结 第一篇:ZooKeeper快速入门
    Vue图片浏览组件v-viewer,支持旋转、缩放、翻转等操作
    opencv处理验证码python代码
    mac使用pytesseract
  • 原文地址:https://www.cnblogs.com/zoujking/p/4190198.html
Copyright © 2020-2023  润新知