天天看点

jQuery技术内幕:深入解析jQuery架构设计与实现原理. 3.13 总结

<b>3.13 总结</b>

在本章中,对选择器引擎sizzle做了完整的介绍和分析,总体源码结构见代码清单3-1,方法功能和调用关系见图3-1。在本章的最后还介绍和分析了jquery对sizzle的整合和扩展。

选择器表达式由块表达式和块间关系符组成。块表达式分为3种:简单表达式、属性表达式、伪类表达式;块间关系符分为4种:"&gt;"父子关系、""祖先后代关系、"+"紧挨着的兄弟元素、"~"之后的所有兄弟元素;块表达式和块间关系符组成了层级表达式。见图3-3。

sizzle( selector, context, results, seed )用于查找与选择器表达式selector匹配的元素集合。如果浏览器支持原生方法queryselectorall(),则调用该方法查找元素,如果不支持,则模拟该方法的行为。执行过程见图3-2。

正则chunker用于从选择器表达式中提取块表达式和块间关系符,其分解图和测试用例见图3-4。

sizzle.find( expr, context, isxml )负责查找与块表达式匹配的元素集合。该方法按照表达式类型数组sizzle.selectors.order规定的查找顺序(id、class、name、tag)逐个尝试查找,如果未找到,则查找上下文的所有后代元素(*)。执行过程见图3-5。

sizzle.filter( expr, set, inplace, not )负责用块表达式过滤元素集合。该方法通过调用过滤函数集sizzle.selectors.filter中的过滤函数来执行过滤操作。执行过程见图3-6。

sizzle.selectors包含了sizzle在查找和过滤过程中用到的正则、查找函数、过滤函数,见图3-1。

sizzle.selectors.order中定义了查找单个块表达式时的查找顺序,依次是id、class、name、tag。其中,class需要浏览器支持方法getelementsbyclassname()。

sizzle.selectors.match/leftmatch中存放了表达式类型和正则的映射,正则用于确定块表达式的类型,并解析其中的参数。解析图见图3-7~图3-14,测试用例见表3-3~表3-11。

sizzle.selectors.find中定义了id、class、name、tag所对应的查找函数。其中,class需要浏览器支持方法getelementsbyclassname()。查找函数会返回数组或undefined,内部通过调用相应的原生方法来查找元素,见表3-11。

sizzle.selectors.relative中存放了块间关系符和对应的块间关系过滤函数。块间关系过滤函数用于检查映射集checkset中的元素是否匹配块间关系符左侧的块表达式。支持的块间关系符和对应的过滤方式见表3-2。

sizzle.selectors.prefilter中定义了class、id、tag、child、attr、pseudo、pos所对应的预过滤函数。预过滤函用于在过滤函数之前修正与过滤操作相关的参数,每种类型的预过滤函数的修正行为见表3-12;预过滤函数有3种返回值,见表3-13。

sizzle.selectors.filters中定义了一组伪类和对应的伪类过滤函数。伪类过滤函数负责检查元素是否匹配伪类,返回一个布尔值。

sizzle.selectors.setfilters中定义了一组位置伪类和对应的伪类过滤函数。位置伪类过滤函数通过比较下标来确定元素在集合中的位置,返回一个布尔值。

sizzle.selectors.filter中定义了pseudo、child、id、tag、class、attr、pos对应的过滤函数。过滤函数负责检查元素是否匹配过滤表达式,返回一个布尔值。

继续阅读