要讀懂Sizzle的Compile執行過程,首先需要弄清楚涉及的各個子程序的功能和關鍵變量和作用,我將逐一對jQuery-1.10.2版本的Compile代碼進行說明,望能給予大家幫助。
elementMatcher(matchers)
1、源碼
代碼如下:
function elementMatcher(matchers) {
return matchers.length > 1 ? function(elem, context, xml) {
var i = matchers.length;
while (i--) {
if (!matchers[i](elem, context, xml)) {
return false;
}
}
return true;
} : matchers[0];
}
2、功能
該函數返回一個函數,用來判定傳入的elem是否符合匹配執行函數數組matchers,若不滿足返回false,否則返回true。
若matchers僅有一個元素,則返回該元素本身,否則返回一個新函數——即代碼中的function(elem, context, xml)函數。
返回函數效果有點類似於context.filter(selectors),當然,其結果僅僅返回true或false,而非jQuery對象。
3、參數
matchers——數組,每個元素都是非偽類的匹配器執行函數。例如:在實際執行過程中,div.map span:lt(10),其中div和,map的匹配執行函數就會作為matchers的兩個元素傳入elementMatcher函數來過濾span節點的父節點是否滿足要求。
4、返回函數
4.1 若matchers多於1個元素,則返回如下函數:
代碼如下:
function(elem, context, xml) {
var i = matchers.length;
while (i--) {
if (!matchers[i](elem, context, xml)) {
return false;
}
}
return true;
}
4.1.1 功能
從matchers最後一個元素到第一個元素依次調用,以匹配傳入的elem節點是否滿足要求,全部滿足返回true,否則返回false。
4.1.2 參數
elem——待檢查的單個節點元素。
context——執行整個選擇器字符串匹配的上下文節點,大部分時候是沒有用途。
xml——當前搜索對象是HTML還是XML文檔,若是HTML,則xml參數為false。
4.2 若matchers只有1個元素,則返回該元素本身。
4.2.1 功能
檢查傳入的elem是否與選擇器匹配,若匹配返回true,否則返回false。
4.2.2 參數
同4.1.2參數說明。