var buildFragment = function(args, nodes, scripts){
var fragment, cacheable, cacheresults, doc, first = args[0];
/**
* 继续使用原来的doc
*/
if (nodes && nodes[0]) {
doc = nodes[0].ownerDocument || nodes[0];
}
// Ensure that an attr object doesn't incorrectly stand in as a document
// object
// Chrome and Firefox seem to allow this to occur and will throw
// exception
// Fixes #8950
/**
* documentFragment 是一个无父窗口的document对象,相当于缓冲区
*/
if (!doc.createDocumentFragment) {
doc = document;
}
// Only cache "small" (1/2 KB) HTML strings that are associated with the
// main document
// Cloning options loses the selected state, so don't cache them
// IE 6 doesn't like it when you put <object> or <embed> elements in a
// fragment
// Also, WebKit does not clone 'checked' attributes on cloneNode, so
// don't cache
// Lastly, IE6,7,8 will not correctly reuse cached fragments that were
// created from unknown elems #10501
if (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];//将first缓存起来
if (cacheresults && cacheresults !== 1) {
fragment = cacheresults;
}
}
/**
* 缓存不存在
*/
if (!fragment) {
fragment = doc.createDocumentFragment();//创建文档缓存
jQuery.clean(args, doc, fragment, scripts);
}
/**
* 如果支持缓存
*/
if (cacheable) {
jQuery.fragments[first] = cacheresults ? fragment : 1;
}
/**
* 返回缓存信息
*/
return {
fragment: fragment,
cacheable: cacheable
};
};
待写