Js中的appenChild,insertBefore--createDocumentFragment
平时项目中会有一些流程,或者是评论相关的东西,这些一般只会是在页面初次加载一部分,剩余部分搞一个更多的标签,当点击更多的时候,ajax请求把所有数据加载完(当然这里也有分页的实现方法,本篇不作讨论), ajax加载的数据一般会运用到appendChild,insertBefore方法来附加在原来标签前后,相信大家对循环附加一定很熟练了,这里我要写的是另一种在性能方面比较赞的方法--运用文档片段,在低版本的IE下,缺少优化机制,循环附加造成的回流和渲染,会让浏览器hold不住(几何改变会造成浏览器重排)
看看一般appendChild做法,当然你可以直接innerHtml或者jquery的Html到容器上,这里是考虑原HTML可能包含事件,才把Html字符串转换为节点。
var ele=document.creatElement("div");
ele.innerHtml=html;//ajax获取到的
var divs=ele.childNodes;//所以子节点
for(var i=0,length=divs.length;i<length;i++)
{
container.appendChild(divs[i].cloneNode(true));//克隆到需要附加的容器
}
优化:
//接上例子
var fragment=document.createDocumentFragment(); for(var i=0;length=divs.length;i++){
fragment.apendChild(divs[i].cloneNode(true)); }
//最后一次性附加到容器
container.appendChild(fragment);
扩展原型:
//IE9+
//IE678隐藏了对HTMLElement的访问
//请用var appendHtmlOp=function(el,html){
// el.appendChild(frament);//这里不能用this,this指向了window;
//}
HTMLElement.prototype.appendHtmlOp=function(html){
var div=document.createElement("div"),nodes=null,
fragment=document.createDocumentFragment(); div.innerHTML=html;
nodes=div.childNodes;
for(var i=0,length=nodes.length;i++){
fragment.appendChild(nodes[i].cloneNode(true));
}
this.appendChild(fragment);
//释放
nodes=null;
fragment=null; }
同理也是可以直接修改insertBefore的;把前面的最后的appendChild改为insertBefore;
当然可以传个标识参数来区分;
var appendHtmlOp=function(el,html,where){
var div=document.createElement("div"),fragment=document.createDocumentFragment();nodes=null;
where=where||"bottom";
div.innertHTML=html;
nodes=div.childNodes;
for(var i=0,length=nodes.length;i<length;i++){
fragement.appendChild(nodes[i].cloneNode(true));
}
where!=="before"?el.appendChild(fragment):el.insertBefore(fragment,el.firstChild);
}
这就是文档片段优化法,来减少appendChild多次直接附加在HTML后,使其呈现几何数值增加;
Js中的appenChild,insertBefore--createDocumentFragment的更多相关文章
- 手写面试编程题- 数组去重 深拷贝 获取文本节点 设置奇数偶数背景色 JS中检测变量为string类型的方法 第6题闭包 将两个数组合并为一个数组 怎样添加、移除、移动、复制、创建和查找节点? 继承 对一个数组实现随机排序 让元素水平 垂直居中的三种方式 通过jQuery的extend方法实现深拷贝
第1题==>实现数组去重 通过 new Set(数组名) // var arr = [12, 12, 3, 4, 5, 4, 5, 6, 6]; // var newarr1 = new Set ...
- js中各种跨域问题实战小结(一)
什么是跨域?为什么要实现跨域呢? 这是因为JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象.也就是说只能访问同一个域中的资源.我觉得这就有必要了解下javascript中的同源策略 ...
- JS中document.createElement()用法及注意事项
今天处理了一个日期选择器的ie和ff的兼容问题,本来这种情况就很难找错误,找了好久才把错误定位到js中创建元素的方法document.createElement(),这个方法在ie下支持这样创建元素 ...
- Bom和Dom编程以及js中prototype的详解
一.Bom编程: 1.事件练习: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "h ...
- JS中的函数、Bom、DOM及JS事件
本期博主给大家带来JS的函数.Bom.DOM操作,以及JS各种常用的数据类型的相关知识,同时,这也是JavaScript极其重要的部分,博主将详细介绍各种属性的用法和方法. 一.JS中的函数 [函数的 ...
- DOM 以及JS中的事件
[DOM树节点] DOM节点分为三大节点:元素节点,文本节点,属性节点. 文本节点,属性节点为元素节点的两个子节点通过getElment系列方法,可以去到元素节点 [查看节点] 1 document. ...
- 细看JS中的BOM、DOM对象
DOM对象模型 DOM(Document Object Model),是指文档对象模型,是W3C组织推荐的处理可扩展标志语言的 ...
- 从零开始的JS生活(二)——BOM、DOM与JS中的事件
上回书说道,JS中变量.运算符.分支结构.循环和嵌套循环等内容.本回就由本K给大伙唠唠JS中的BOM.DOM和事件. 一."花心大萝卜"--BOM 1.震惊,FFF团为何对BOM举 ...
- 简单谈谈js中的MVC
MVC是什么? MVC是一种架构模式,它将应用抽象为3个部分:模型(数据).视图.控制器(分发器). 本文将用一个经典的例子todoList来展开(代码在最后). 一个事件发生的过程(通信单向流动): ...
随机推荐
- [Tommas] 如何创建自动化功能测试的基本原则
每个实行持续交付的项目,都有生产流水线的元素,如持续集成和自动化测试.这些测试是在不同层面进行的,从单元测试到冒烟测试再到功能测试.自动化功能测试的优点之一是可重复性和可预测的执行时间.出于这个原因, ...
- CentOS6.x安装配置nginx [转]
博文来源:http://leyewen.blog.163.com/ nginx安装 nginx的官网:http://nginx.org/ 相应下载页面:http://nginx.org/en/ ...
- curl检查远程文件是否存在
size_t processdata(void *buffer, size_t size, size_t nmemb, void *user_p) { //写一个空的写函数 return nmemb; ...
- 【CSS3】Advanced9:Transformation
1.transform:rotate(-10deg) skew(20deg,10deg) scaling(2/1,2) translate/移动(100px,200px) 2.transform:ma ...
- 数据中心基础设施自动化运维之puppet专项
http://forge.puppetlabs.com/treydock/yum_cron [puppet功能扩展forge] http://docs.puppetlabs.com/referenc ...
- oracle数据库自动备份脚本
::通过exp命令导出远程机器(192.168.2.1)上指定服务(orcl)指定用户(pmis)及密码(pmis)的数据 ::运行该脚本的机器必须安装oracle @echo off @echo [ ...
- PL/SQL基础
打印 hi set serveroutput on --打开输出开关 declare --说明部分(变量说明,光标申明或者例外说明) begin --程序 ...
- 图像处理界的标准图像Lena背后的故事
今天晚上实验室的哥们问到我:“蒋志强,你知道咱们数字图像处理界标准图像Lena吗?” “当然知道啊,不就是那个512×512的美丽姐姐的标准图像么?”我不以为然的回答: “那幅图像事实上不是原始图像? ...
- java的定时器用法
java定时器的使用 定时器类Timer在java.util包中.使用时,先实例化,然后使用实例的schedule(TimerTask task, long delay)方法,设定指定的任务task在 ...
- Linux select TCP并发服务器与客户端编程
介绍:运行在ubuntu linux系统,需要先打开一个终端运行服务端代码,这时,可以打开多个终端同时运行多个客户端代码(注意客户端数目要小于MAX_FD);在客户端输入数据后回车,可以看见服务器收到 ...