jQuery.extend({
clean: function( elems, context, fragment, scripts ) {
pth, div, hasBody, tbody, len, handleScript, jsTags,
safe = context === document && safeF // 確保變數context為文檔根節點document
if ( !context || typeof context.createDocumentFragment === "undefined" ) {
context = created safe fragment if context permits
for ( i = 0; (elem = elems[i]) != null; i ) {
// elem為數字,則轉換為字串
🎜> elem = "";
}
// 如果elem為undefined,跳出本次循環
if ( !elem ) {
continue;
}
// Convert html string into DOM nodes
// 轉換陣列項目(字串)為DOM節點
// 若不存在html實體編號或標籤,則建立文字節點
}
// 處理為html標籤字串的陣列項目
// Ensure a safe container in which to render the html
瀏覽器中,safe為HTMLDocument類型節點,且nodeNames數組為空白
// 建立一個div元素並插入文件碎片
div = context.createElement("div");
safe.appendChild( div ); // 除了area,br,col,embed,hr, img,input,link,meta,param這些標籤外,
// // 將開始標籤結尾 elem = elem.replace(rxhtmlTag, " $2>");
// Go to html and back, then peel 左邊第一個標籤元素
tag = ( rtagName.exec( elem ) || ["" , ""] )[1].toLowerCase();
wrap = wrapMap[ tag ] || wrapMap._default;
地🎜> // Move to the right depth
賦值為元素最近的包裹元素(即:包含第一層包裹元素)
while div = div.lastChild;
}
// Remove IE's autoinserted
from table fragments if ( !jQuery .support.tbody ) {
// String was a // 判斷字串中是否擁有空白tbody標籤
.test(elem);
// 若 // 變數tbody為div.firstChild.childNodes(新加入的tbody標籤集合)
= tag === "table" && !hasBody ?
div.firstChild && div.firstChild.childNodes :
// String was a bare or
// 如果字符串中只有一個空thead或tfoot標籤
wrap[1] === "" && !hasBody ?
[];
// 使用的thead或tfoot標籤
jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
🎜> ( tbody[ j ] );
}
}
// IE completely kills leading whitespace when inner 9以下瀏覽器中,字串以空白字串開頭,將空白字串作為div元素的第一個文字子節點
div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
🎜> // 取得已處理完畢的div子節點集合(nodeList物件)
🎜> // Take out of fragment container (we need a fresh div 下一次循環處理字串陣列項目前,清除處理已建立的div元素
div. 🎜> }
// 若elem為DOM節點)
if ( elem.nodeType ) {
ret.push( elem );
}
// 將nodeList對像中節點合併到返回的數組中
else {
jQuery .merge( ret, elem );
}
} elem = div = safe = null;
}
// Reset defaultChecked for any radios and checkboxes
// 在ie6,7中,擁有checked屬性的單選按鈕,複選框在插入到其他標籤後,選中狀態會失效(下面代碼修復該bug)
if ( !jQuery.support.appendChecked ) { if ( jQuery.nodeName( elem, "in fixDefaultChecked( elem );
} else if ( typeof elem.getElementsByTagName != = "undefined" ) {
jQuery.grep( elem.getElementsBy }
}
}
// Append elements to a provided document fragment
// // 將ret數組中的各DOM中,位置為其原父元素索引位置後
if ( fragment ) {
tion( elem ) {
// Check if we consider it executable
// 若elem元素中為type屬性或type值為javascript或為ecmascript
) ) {
// Detach the script and store it in the scripts array (if provided) or the fragment
return scripts ?
( elem ) : elem ) :
};
for ( i = 0; (elem = ret[i]) != null; i ) {
// Check if we're done after handling an executable script
含) && handleScript( elem ) ) ) {
// Append to fragment and handle embedded scripts
// 將elem元素加入文件中並處理嵌入的腳本 fragment.appendChild( elem );
" ) {
// handleScript alters the DOM, so jsTags = jQuery.grep( jQuery.merge( [], elem.getElementsByTagName("script") ), handleScript ) ;
// Splice the scripts into ret after their // 將script標籤加入陣列,位置為其原父元素索引位置後
( ret, [i 1, 0].concat( jsTags ) );
}
}
}
}
🎜>