国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

jQuery選擇器源碼解讀(六):Sizzle選擇器匹配邏輯分析

2024-05-06 16:17:56
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了jQuery選擇器源碼解讀(六):Sizzle選擇器匹配邏輯分析,,需要的朋友可以參考下
 

近期看了一些網上關于Sizzle的分析文章,就匹配次序往往就說使用了從右到左的逆向匹配法,但是具體如何并沒有詳細介紹,或者就像我之前的幾篇文章一樣,就代碼一行一行做詳細介紹,但缺乏整體概念,這里就jQuery-1.10.2版本的Sizzle的匹配邏輯(預編譯結果)做一整體說明,這里就不談過多的細節了。

Sizzle的匹配過程采用的是以從右到左的逆向匹配法為基礎的改進版本,因為HTML的搜索畢竟和文本匹配有差異,它有自己獨特的一面,所以,需要針對HTML的搜索進行優化。在此先申明一點,下面所說的關系選擇器是指W3C中的Combinator選擇器,因本人覺得用關系選擇器這個名字要比其它更加貼近實際意義,故用此命名。

1、簡單介紹一下Sizzle編譯執行的兩個主要函數:

a) matcherFromTokens——針對一個塊選擇器生成執行函數,所謂塊選擇器就是不包含逗號分隔的選擇器字符串。

b) matcherFromGroupMatchers——將不同的塊選擇器生成的最終執行函數,該函數還負責將最終結果過濾掉重復對象。

2、matcherFromTokens函數針對不同類型的選擇器產生不同的執行函數。若包含偽類,則返回setMatcher,否則返回的是elementMatcher,代碼通過鑒別matcher是否包含expando屬性來區別setMatcher和elementMatcher:

a) 針對非偽類且非關系選擇器,直接從左到右依次生成執行函數,各函數作為同一個matchers數組的不同元素存在。

b) 針對關系選擇器,將會把之前生成的matchers壓入一個新的matchers數組中。

c) 針對偽類選擇器,將通過setMatcher函數生成一個執行函數,調用setMatcher時,依次傳入6個參數,分別是preFilter, selector, matcher, postFilter, postFinder, postSelector。

      preFilter是在執行setMatcher函數之前已生成的matchers數組經elementMatcher函數加工過的最終函數,elementMatcher(matchers)將返回一個從后向前依次執行每一個matchers元素函數的新函數;。

      selector是matchers對應的選擇器字符串;

      matcher是偽類自身的匹配函數;

      postFilter是偽類之后,到第一個偽類或關系符之間的選擇器字符串對應的匹配函數,它是嵌套調用matcherFromTokens函數的返回結果;

      postFinder是postFilter對應選擇器之后的所有選擇器生成的匹配函數,同樣也是通過嵌套調用matcherFromTokens函數的返回結果;

      postSelector是postFinder對應的選擇器字符串。

d) 若選擇器字符串中沒有偽類,那么,將返回elementMatcher(matchers)生成的最終匹配函數。

從上面的介紹可以看出,生成的執行函數之間存在著嵌套關系,簡單的講就是setMatcher包含matchers,關系選擇器匹配函數包含非偽類且非關系選擇器匹配函數。

3、執行過程的介紹:

a) 執行塊選擇器的執行函數:

      針對elementMatcher,從外到里從后到前依次執行,即從最外層數組到最里層數組依次執行,同一個數組中,從最后一個元素到第一個元素依次執行。

      針對setMatcher,先依據preFilter和selector獲得匹配結果;然后執行matcher函數獲取匹配結果;之后,執行postFilter函數,最后,依據postFinder和postSelector獲取匹配結果。

c) 依次執行每個塊選擇器的執行函數后,過濾掉重復數據,并返回結果。


看了上述大致過程,再去看各方法的詳細介紹應該比較容易理解了,當然在這里沒有談到一些細節,例如初始結果集(seed)的生成及由此帶來的函數執行邏輯細節上的差異等。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 新乡县| 高清| 嵩明县| 资溪县| 贵港市| 广南县| 枝江市| 隆尧县| 衡南县| 高台县| 华容县| 凌源市| 浙江省| 石首市| 军事| 长治市| 原平市| 印江| 景泰县| 通州区| 库尔勒市| 德惠市| 平定县| 奉新县| 石屏县| 宝清县| 甘德县| 临邑县| 景东| 奉化市| 江都市| 醴陵市| 阳山县| 洛宁县| 安新县| 隆子县| 广州市| 基隆市| 会昌县| 禹城市| 韩城市|