首页 > 代码库 > JQuery日记_5.13 Sizzle选择器(六)选择器的效率

JQuery日记_5.13 Sizzle选择器(六)选择器的效率

当选择表达式不符合快速匹配(id,tag,class)和原生QSA不可用或返回错误时,将调用select(selector, context, results, seed)方法,此方法迭代DOM选择、过滤元素,
在DOM树非常大的时候为了保证效率,应该保证html设计的合理,尽量使用可快速匹配(id,tag,class)的表达式,其次是QSA支持的选择器,尽量不要使用jquery扩展的selector和嵌套selector,然后是尽量不要使用位置伪类(它是从左向右查找,需要多次循环内套循环遍历),还有要尽量缩小context.

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中不符合条件的元素