我們在經(jīng)過詞法分析,簡單過濾,找到適合的種子集合之后,最終的選擇器抽出了input這個種子合集seed,重組的選擇器selectorAaron [name=ttt]
,還有詞法分析合集group,通過tokenize最終分類出來的group分別都有對應(yīng)的幾種 type:
var match = [{ matches: ["div"], type: "TAG", value: "Aaron" }, { type: " ", value: " " }, { matches: ["name", "=", "ttt"], type: "ATTR", value: "[name=ttt]" }]
每一種type都會有對應(yīng)的處理方法 Expr.filter:
Expr.filter = { ATTR : function (name, operator, check) { CHILD : function (type, what, argument, first, last) { CLASS : function (className) { ID : function (id) { PSEUDO : function (pseudo, argument) { TAG : function (nodeNameSelector) { }
可以把“元”理解為“原子”,也就是最小的那個匹配器。
每條選擇器規(guī)則最小的幾個單元可以劃分為:ATTR | CHILD | CLASS | ID | PSEUDO | TAG
在Sizzle里邊有一些工廠方法用來生成對應(yīng)的這些元匹配器,它就是Expr.filter。
舉2個例子(ID類型的匹配器由Expr.filter["ID"]生成,應(yīng)該是判斷elem的id屬性跟目標(biāo)屬性是否一致),到這里應(yīng)該想到Sizzle其實是不是就是通過對selector做“分詞”,打散之后再分別從Expr.filter 里面去找對應(yīng)的方法來執(zhí)行具體的查詢或者過濾的操作?
答案基本是肯定的。
但是這樣常規(guī)的做法邏輯上是OK的,但是效率如何?
所以Sizzle有更具體和巧妙的做法,Sizzle在這里引入了編譯函數(shù)的概念。
請驗證,完成請求
由于請求次數(shù)過多,請先驗證,完成再次請求
打開微信掃碼自動綁定
綁定后可得到
使用 Ctrl+D 可將課程添加到書簽
舉報