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 }

优化:

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);

扩展原型:

 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 }

同理也是可以直接修改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 }

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

时间: 2024-11-10 12:00:58

Js中的appenChild,insertBefore--createDocumentFragment的相关文章

js中常用追加元素的几种方法:append,appendTo,after,before,insertAfter,insertBefore,appendChild

js中常用追加元素的几种方法,点击下面每个按钮,即可查看效果 我是第一个子元素 我是第二个子元素 append appendTo prepend prependTo after before appendChild insertAfter insertBefore

js 中事件的个人理解

事件 事件组成 1,触发谁的事件 事件源2,触发是什么事件 click mouseover mouseout3,事件触发之后,干什么 事件函数 (干什么写在事件函数中) 事件对象 类似于飞机的“黑匣子” 用于保存 一个事件发生的时候,所有的信息比如:事件发生时鼠标的坐标如何获取事件对象: 兼容性问题:在不同浏览器上 获取方法不一样 在IE 以及DOM标准:全局的对象(window下) 名字event 在高版本IE 以及 chrome 不支持event来获取事件对象的,另外一种方式 自动变成事件函

简单谈谈js中的MVC

MVC是什么? MVC是一种架构模式,它将应用抽象为3个部分:模型(数据).视图.控制器(分发器). 本文将用一个经典的例子todoList来展开(代码在最后). 一个事件发生的过程(通信单向流动): 1.用户在视图 V 上与应用程序交互 2.控制器 C 触发相应的事件,要求模型 M 改变状态(读写数据) 3.模型 M 将数据发送到视图 V ,更新数据,展现给用户 在js的传统开发模式中,大多基于事件驱动的: 1.hash驱动 2.DOM事件,用来驱动视图 3.模型事件(业务模型事件和数据模型事

JS中的函数、Bom、DOM及JS事件

本期博主给大家带来JS的函数.Bom.DOM操作,以及JS各种常用的数据类型的相关知识,同时,这也是JavaScript极其重要的部分,博主将详细介绍各种属性的用法和方法. 一.JS中的函数 [函数的声明及调用] 1.函数声明的格式: function 函数名(参数1,参数2,参数3,--){//函数体 return 结果; } >>>函数的调用格式: 直接调用:函数调用的格式:函数名(参数一的值,参数二的值,--): 事件调用:事件名=函数名( ); 2.函数声明的几点强调: ①函数名

js中方法单词以及意思

浏览器对象是什么,它是JS编程中的顶级作用域,JS中的一切方法和属性,都是这个对象的后代 (window). 文档或文档对象,通俗的讲就是:凡是我们能看的见编码,就属于文档(document). 通过id来获取一个HTML元素,以便我们用JS来控制操作(document.getElemetnById). 在整个网页内通过标签名获得一组HTML元素的集合对象(document.getElementsByTagName). JS中创建元素的方法 (createElement). JS中添加子元素的方

JS中的BOM以及DOM操作

screen:对象 console.log(screen.width);//屏幕宽度   console.log(screen.availHeight);//可用高度=屏幕高度-底部任务栏   console.log(screen.height);//屏幕高度   console.log(screen.availWidth);//可用宽度 location对象    *     * 完整的URL路径:    * 协议://主机名(IP地址):端口号/文件路径?传递参数(name1=value1&

JS中的DOM操作和事件

[DOM树节点] DOM节点分为三大类: 元素节点. 属性节点. 文本节点: 文本节点.属性节点属于元素节点的子节点.操作时,均需要先取到元素节点,再操作子节点: 可以使用getElement系列方法,取到元素节点. [查看元素节点] 1.getElementById:通过id取到唯一节点.如果ID重名,只能取到第一个. getElementsByName(): 通过name属性   getElementsByTagName(): 通过标签名   getElementsByClassName()

js中的dom节点以及offset,client,scroll家族

一.节点. 1.父节点:parentNode; 2.兄弟节点: (1).下一个兄弟节点:nextElementSibling(在Ie中用nextSibling); (2).上一个兄弟节点:previousElementSibling(在Ie中用 previousSibling); 3.子节点: (1).选中第一个子节点:firstElementChild(在Ie中用firstChild); (2).选中最后一个子节点:lastElementChild(在ie中用lastChild); (3).选

从零开始的JS生活(二)——BOM、DOM与JS中的事件

上回书说道,JS中变量.运算符.分支结构.循环和嵌套循环等内容.本回就由本K给大伙唠唠JS中的BOM.DOM和事件. 一."花心大萝卜"--BOM 1.震惊,FFF团为何对BOM举起了火把--BOM简介 BOM(Browser Object Model) 是指浏览器对象模型,在JS中BOM是个不折不扣的花心大萝卜,因为它有很多个对象,其中代表浏览器窗口的Window对象是BOM的"正室".也就是最重要的,其他对象都是正室的下手.或者叫侧室也不足为过. 2.细数BOM