1 jQuery 对象Sizzle.selectors.relative中存放了块间关系符和对应的块间关系过滤函数,称为“块间关系过滤函数集” 块间关系符共有4种,其含义和过滤方式如图所示。
在函数Sizzle( selector, context, results, seed )从右向左进行过滤时,块间关系过滤函数被
调用,用于检查映射集checkSet中的元素是否匹配块间关系符左侧的块表达式。调用时的参
数格式为:
1 | Sizzle.selectors.relative[ 块间关系符 cur ]( 映射集 checkSet, 左侧块表达式pop, |
块间关系过滤函数接受3个参数:
‰ ‰参数checkSet:映射集,对该元素集合执行过滤操作。
‰ ‰参数part:大多数情况下是块间关系符左侧的块表达式,该参数也可以是DOM元素。
‰ ‰参数isXML:布尔值,指示是否运行在一个XML文档中。
块间关系过滤函数实现的3个关键步骤如下:
1)遍历映射集checkSet。
2)按照块间关系符查找每个元素的兄弟元素、父元素或祖先元素。
3)检查找到的元素是否匹配参数part,并替换映射集checkSet中对应位置的元素。
a. 如果参数part是标签,则检查找到的元素其节点名称nodeName是否与之相等,
如果相等则替换为找到的元素,不相等则替换为false。
b. 如果参数part是DOM元素,则检查找到的元素是否与之相等,如果相等则替换
为true,不相等则替换为false。
c. 如果参数part是非标签字符串,则调用方法Sizzle.filter( selector, set, inplace, not )过滤。
也就是说,遍历结束后,映射集checkSet中的元素可能会是兄弟元素、父元素、
祖先元素、true或false。
1 块间关系符”+”匹配选择器”prev + next”,即匹配所有紧接在元素prev后的兄弟元素
next。例如,$(“div + span”)、$(“.lastdiv + span”)。对于从右向左的查找方式,则是检查元
素next之前的兄弟元素是否匹配块表达式prev。
1 | var Expr = Sizzle.selectors = { |
2 块间关系符”>”用于选择器”parent > child”,即匹配父元素parent下的子元素child。
例如,$(“div + span”)、$(“.lastdiv + span”)。对于从右向左的查找方式,则是检查子元素
child的父元素是否匹配块表达式parent。
1 | var Expr = Sizzle.selectors = { |
3 块间关系符””用于选择器”ancestor descendant”,即匹配祖先元素ancestor的所有后代
元素descendant。例如,$(“div button”)、$(“div .btn”)。对于从右向左的查找方式,则是检
查后代元素descendant的祖先元素是否匹配块表达式ancestor。
1 | var Expr = Sizzle.selectors = { |
4 块间关系符”~”用于选择器”prev~siblings”,即匹配元素prev之后的所有兄弟元
素siblings。例如,$(‘div~p’)。对于从右向左的查找方式,则是检查元素siblings之前的
兄弟元素是否匹配块表达式prev。
Sizzle.selectors.relative[“~”]( checkSet, part )的源码实现与Sizzle.selectors.relative[“”]
( checkSet, part )几乎一样,两者的区别仅仅在于调用函数dirCheck()和dirNodeCheck()时第
一个参数的值不同,前者是”previousSibling”,后者则是”parentNode”。
相关代码如下所示:
1 | var Expr = Sizzle.selectors = { |