對jquery原始碼中 clean函式的一些體會

neuyu發表於2021-09-09

對於jquery原始碼本人正在學習中,屬於小白,大神勿笑,寫這個也是純粹給自己理思路。
clean()函式出現的地方較多。
就挑在buildFragment()中出現的這處。
原始碼是這樣

  if ( !fragment ) {
         fragment = doc.createDocumentFragment();
           jQuery.clean( args, doc, fragment, scripts );
          }

在這裡執行clean函式
clean: function( elems, context, fragment, scripts ) {
clean()函式在此處的作用就是轉換html程式碼為dom元素,同時抓取出html中script標籤,手動執行標籤中的程式碼.

clean部分一些程式碼,就不說了。主要是調整文件物件和判斷是否是 文字節點。

我主要理一下開始讓我困惑的地方。
1.不知道為什麼要在建立文件碎片中加一個div標籤。
解釋:由於在clean函式中處理HTML轉換成DOM元素的,主要用的是innerHTML屬性。但是這個屬性沒法用於沒有作用域的標籤。比如script,link,只有在外面套上一層div只些標籤才能被瀏覽器“識別”。
2.這段程式碼的用處,不理解為什麼要這樣。
var tag = (rtagName.exec( elem ) || ["", ""])[1].toLowerCase(), wrap = wrapMap[ tag ] || wrapMap._default, depth = wrap[0], div = context.createElement("div"); div.innerHTML = wrap[1] + elem + wrap[2];
把wrapMap也貼出來
wrapMap = { option: [ 1, "" ], legend: [ 1, "

", "
" ], thead: [ 1, "", "
" ], tr: [ 2, "", "
" ], td: [ 3, "", "
" ], col: [ 2, "", "
" ], area: [ 1, "", "" ], _default: [ 0, "", "" ] };

解釋:先判斷,tag是不是wrapMap幾種標籤。由於採取的是利用div innerHTML屬性巢狀子元素。但是wrapMap中幾種標籤是無法直接巢狀在div中的,是無法成為div的子元素。比如td,tr。所以必須手工給他們套上能夠使他們正常執行的父元素。如果不是wrapMap其中的標籤那就跳過。
3,關於script標籤的處理。
首先判斷是否是script標籤。如果是的話,將script剝離出來。放入scripts陣列中。等待其他函式呼叫手動執行。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4550/viewspace-2798246/,如需轉載,請註明出處,否則將追究法律責任。

相關文章