首页 > 代码库 > 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中不符合条件的元素
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。