DocumentFragment是一种特殊的Node,它作为其他节点的一个临时容器,像document节点咿呀,DocumentFragment是独立的,而不是任何其他文档的一部分,它的parentNode总是null。但类似element,它可以有任意的子节点,可以用appendChild()、insertBefore()等方法来操作。通常我们会利用它来创建文档元素,我们可以利用文档片段的特性先把要插入的文档创建在文档片段中然后整体插入,相对于一个一个的插入文档元素而言性能会提高很多,有关文档碎片(document fragment)的用法详解请阅读()
jQuery
.buildFragment( args, context, scripts )
;
参数args:数组,含有待转换为DOM元素的HTML代码。
参数nodes:数组,含有文档对象、jQuery对象或DOM元素,用于修正创建文档片段DocumentFragment的文档对象
参数scripts: 数组,用于存放HTML代码中的script元素。
方法jQuery.buildFragment( args, context, scripts )先创建一个文档片段DocumentFragment,然后调用方法jQuery.clean()将HTML代码转换为DOM元素,并存在创建的文档片段中
方法执行步骤:
jQuery.buildFragment = fragment, cacheable, cacheresults, doc,
first = args[
0 ];
( nodes && nodes[
0] ) {
doc = nodes[
0].ownerDocument || nodes[
0];
}
// doc依然可能不是文档对象,如果调用jQuery构造函数时第二个参数javascript对象,此时doc是传入的javascript对象而不是文档对象,如果不存在则修正doc为当前文档对象是document
if ( !doc.createDocumentFragment ) {
doc = document;
}
( args.length ===
1 &&
typeof first ===
"string" && first.length <
512 && doc === document &&
first.charAt(
0) ===
"<" && !rnocache.test( first ) &&
(jQuery.support.checkClone || !rchecked.test( first )) &&
(jQuery.support.html5Clone || !rnoshimcache.test( first )) ) {
cacheable =
true;
cacheresults = jQuery.fragments[ first ];
if ( cacheresults && cacheresults !==
1 ) {
fragment = cacheresults;
}
}
if ( !fragment ) {
fragment = doc.createDocumentFragment();
jQuery.clean( args, doc, fragment, scripts );
}
if ( cacheable ) {
//如果html代码符合缓存条件,则把转换后的DOM元素放入缓存对象jQuery.fragment中,第一次转换后设置缓存值为1;第二次转换后设置为文档片段;第三次开始则从缓存中读取
jQuery.fragments[ first ] = cacheresults ? fragment :
1;
}
//返回文档片段和缓存状态:文档片段fragment中包含了转换后的DOM元素,缓存状态cacheable则指示了如何使用这些DOM元素
return { fragment: fragment, cacheable: cacheable };
};
jQuery.fragments = {};