高效的插入子节点DocumentFragment

DocumentFragment 对象

DocumentFragment 接口表示文档的一部分(或一段)。更确切地说,它表示一个或多个邻接的 Document 节点和它们的所有子孙节点。
DocumentFragment 节点不属于文档树,继承的 parentNode 属性总是 null。
不过它有一种特殊的行为,该行为使得它非常有用,即当请求把一个 DocumentFragment 节点插入文档树时,插入的不是 DocumentFragment 自身,而是它的所有子孙节点。这使得 DocumentFragment 成了有用的占位符,暂时存放那些一次插入文档的节点。它还有利于实现文档的剪切、复制和粘贴操作,尤其是与 Range 接口一起使用时更是如此。
可以用 Document.createDocumentFragment() 方法创建新的空 DocumentFragment 节点。
也可以用 Range.extractContents() 方法 或 Range.cloneContents() 方法 获取包含现有文档的片段的 DocumentFragment 节点。

通常我们插入文档的操作如下:

var nodes = div.childNodes;
for (var i=0, length=nodes.length; i<length; i+=1) {
   // 容器container加载克隆的节点 - 克隆的作用是保证nodes的完整
   container.appendChild(nodes[i].cloneNode(true));
}

这样会导致浏览器不断的reflow 重绘,对性能造成影响。我们可以利用documentFragment的特点:

HTMLElement.prototype.appendHTML = function(html) {
    var divTemp = document.createElement("div"), nodes = null

        , fragment = document.createDocumentFragment();
    divTemp.innerHTML = html;
    nodes = divTemp.childNodes;
    for (var i=0, length=nodes.length; i<length; i+=1) {
       fragment.appendChild(nodes[i].cloneNode(true));
    }
    this.appendChild(fragment);

    nodes = null;
    fragment = null;
};

只有一次~~~。

对于直接用innerHTML的方法,如果插入的元素要有什么click事件的绑定,当再次插入的时候事件就没了。这种情况下用使用事件的委托来搞定。比如:Jquery的on方法

insertAdjacentHTML

insert(插入)Adjacent(邻近)HTML。

语法如下:

element.insertAdjacentHTML(position, html);

position是相对于element元素的位置,并且只能是以下的字符串之一:

beforebegin
在 element 元素的前面。
afterbegin
在 element 元素的第一个子元素前面。
beforeend
在 element 元素的最后一个子元素后面。
afterend
在 element 元素的后面。

html是字符串被解析成HTML或XML插入到DOM树中。

时间: 2024-11-10 15:42:42

高效的插入子节点DocumentFragment的相关文章

深入理解DOM节点类型第四篇——文档片段节点DocumentFragment

× 目录 [1]特征 [2]作用 前面的话 在所有节点类型中,只有文档片段节点DocumentFragment在文档中没有对应的标记.DOM规定文档片段(document fragment)是一种“轻量级”的文档,可以包含和控制节点,但不会像完整的文档那样占用额外的资源 特征 创建文档片段,要使用document.createDocumentFragment()方法.文档片段继承了Node的所有方法,通常用于执行那些针对文档的DOM操作 文档片段节点的三个node属性——nodeType.nod

js中改变文档的层次结构(创建元素节点,添加结点,插入子节点,取代子节点,删除子节点)

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title></title> <style type="text/css"> .box1, .box2{ width: 300px; height: 250px; margin-top: 10px; margin-bottom: 30px;

javascript所有的节点和方法

属性: 1.Attributes 存储节点的属性列表(只读) 2.childNodes 存储节点的子节点列表(只读) 3.dataType 返回此节点的数据类型 4.Definition 以DTD或XML模式给出的节点的定义(只读) 5.Doctype 指定文档类型节点(只读) 6.documentElement 返回文档的根元素(可读写) 7.firstChild 返回当前节点的第一个子节点(只读) 8.Implementation 返回XMLDOMImplementation对象 9.las

js操作节点小结

节点对象代表文档树中的一个单独的节点. 下面节点的API可以当词典使用哦!! 属性:(绝大部分都是只读的) 1 Attributes 存储节点的属性列表(只读) 2 childNodes 存储节点的子节点列表(只读) 3 dataType 返回此节点的数据类型 4 Definition 以DTD或XML模式给出的节点的定义(只读) 5 Doctype 指定文档类型节点(只读) 6 documentElement 返回文档的根元素(可读写) 7 firstChild 返回当前节点的第一个子节点(只

Js节点属性与方法

属性: Attributes     存储节点的属性列表(只读) childNodes 存储节点的子节点列表(只读) dataType     返回此节点的数据类型 Definition     以DTD或XML模式给出的节点的定义(只读) Doctype     指定文档类型节点(只读) documentElement     返回文档的根元素(可读写) firstChild     返回当前节点的第一个子节点(只读) Implementation     返回XMLDOMImplementa

js遍历 子节点 子元素

Js 节点 子元素 属性 方法 // 添加子节点前 删除所有子节点 var usernameEle = document.getElementById("username"); var childs = usernameEle.childNodes; for(var i = childs.length - 1; i >= 0; i--) { usernameEle.removeChild(childs[i]); } var username = document.createTe

使用JavaScript操作DOM节点元素的常用方法(创建/删除/替换/复制等)

getElementById(id)这是通过id来访问某一元素,最常用的之一,例:<html><body><div id="myid">test</div><script language="javascript">alert(document.getElementById("myid").innerHTML);</script></body></html&

【转】JavaScript 节点操作 以及DOMDocument属性和方法

最近发现DOMDocument对象很重要,还有XMLHTTP也很重要 注意大小写一定不能弄错. 属性: 1Attributes 存储节点的属性列表(只读) 2childNodes 存储节点的子节点列表(只读) 3dataType 返回此节点的数据类型 4Definition 以DTD或XML模式给出的节点的定义(只读) 5Doctype 指定文档类型节点(只读) 6documentElement 返回文档的根元素(可读写) 7firstChild 返回当前节点的第一个子节点(只读) 8Imple

JS DOM操作(创建、遍历、获取、操作、删除节点)

创建节点 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=devic