JQuery日記_5.13 Sizzle選擇器(六)選擇器的效率

    當選擇表達式不符合快速匹配(id,tag,class)和原生QSA不可用或返回錯誤時,將調用select(selector, context, results, seed)方法,此方法迭代DOM選擇、過濾元素,
    在DOM樹非常大的時候爲了保證效率,應該保證html設計的合理,儘量使用可快速匹配(id,tag,class)的表達式,其次是QSA支持的選擇器,儘量不要使用jquery擴展的selector和嵌套selector,然後是儘量不要使用位置僞類(它是從左向右查找,需要多次循環內套循環遍歷),還有要儘量縮小context
    可以多次重複利用同一選擇器,它並不會每次都去篩選DOM(JQuery會對其結果進行緩存,當然如果選擇元素太多,不會對其緩存).

select(selector, context, results, seed)方法分爲下面幾個關鍵步驟
1  調用tokenize(selector)分割selector
    tokenize(selector,parseOnly)方法的執行步驟
    1.1定義變量 matched匹配元素、match匹配捕獲組、tokens存放selector的各個部分和其類型、sofar存放當前selector
        (被上次處理分割後的selector)、groups存放每個selector的tokens、preFilter就是Expr.preFilter
    1.2首先查看tokenCache緩存中此selector是否已經被分割過,如果有返回緩存的值,否則繼續向下執行.
    1.3定義groups數組,它是一個二維數組,每個selector('div, div span'注意此表達式有兩個selector)對應一個groups元素
    1.4分割關係符(後代,>,+,~),將匹配的關係符包括前後空白和去除空白的關係符放入tokens.將soFar設置爲剩下的selector
    1.5匹配selector的類型(ATTR,CHILD,CLASS,ID,PSEUDO,TAG),將匹配的selector部分和其類型放入tokens,將soFar設置爲剩下的selector
    1.6沒有匹配的元素則退出循環,防止soFar不變造成的死循環
    1.7如果傳入的parseOnly表明只轉換返回soFar的長度,否則將其groups放入tokenCache緩存中並返回groups(如果soFar還有說明selector有誤,拋出錯誤)
2  如果selector只有一個
    2.1如果selector第一分割是id選擇器,將其設置爲查找上下文,如果查找不到id的元素,則快速返回.
    2.2如果是需要上下文的選擇器,從右向左查找.
    2.3根據分割的片段類型,調用相應Expr.find方法,將返回結果作爲seed
3  調用compile(selector, match)(seed, context)剔除seed中不符合條件的元素
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章