if (typeof selector === "string")
...
ret = jQuery.buildFragment([match[1]], [doc]);
2. buildFragment
jQuery.clean(args, doc, fragment, scripts);
3.clean 这才是核心,还不明白为什么起这个名字。 分析文章:
div = context.createElement("div"),// 重点关注对象 .
safeChildNodes = safeFragment.childNodes,//safeFragment 是在加载完jQuery之后执行的。 它只是进行了创建,并没有追加到 DOM 中。
...
// Append wrapper element to unknown element safe doc fragment
if (context === document) {
// Use the fragment we've already created for this document
safeFragment.appendChild(div);//把div添加到 safeFragment,作用何在?
} else {
// Use a fragment created with the owner document
createSafeFragment(context).appendChild(div);
}
...
div.innerHTML = wrap[1] + elem + wrap[2];//内存开始增长。之后并没有回落,怀疑是清理有问题。
...
div.parentNode.removeChild(div);//很明显,作者想到了要清理,但根据监测结果,内存并没有回落。在HTML内容很大的情况下,观察效果明显。
var div = document.createElement("div");
document.body.appendChild(div) ;
div.innerHTML = html ;
html = $(div.childNodes );
...
document.body.removeChild(div);
html = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/.exec(html) ;
html = html[1].replace(/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig, "<$1></$2>") ;
var div = document.createElement("div");
document.body.appendChild(div) ;
div.innerHTML = "div<div>" + html +"</div>";
html = $(div.lastChild.childNodes);
...
document.body.removeChild(div);
使用 Drip,进行测试,使用 Show Memory Usage 查看,内存增加非常小,使用 Show Dom Usage 查看,曲线还是很明显(但点Show Dom Leaks,页面会变白)
使用 sIEve 进行测试,使用 Show Memory Usage 查看,内存增长曲线非常小。使用 Show Dom Usage 查看,曲线基本持平。
使用 任务管理器进行查看,发现内存可以回落。 sIEve 比 Drip 要准确。
下图是 sIEve 的两个曲线图: