查找的入口对应的是Sizzle.find方法:
1 | Sizzle.find = function( expr, context) {} |
expr :查找的表达式
context :查找的范围
find的步骤
- 判断主要集合,方法说过了,依次匹配,顺序就是ID –> NAME –> TAG
- (1)当有类型被匹配时,调用相应的方法,获取集合set。(2)当ID,NAME,TAG全部不匹配时,获取context范围内的全部元素集合set
- 去除expr中已经匹配的部分,返回结果{expr : expr,set : set}
因此,Sizzle.find的大致代码流程是
1 | Sizzle.find = function( expr, context, isXML ) { |
实例说明:
1 | <input type="radio" id="a" name="gender" value="man" class="default" /><label for="a" >男</label> |
1 | var set; |
因此从上面的实例来看,Sizzle.find并不是执行查找功能的部分,而是主要起了一个分发器的作用:
将不同的选择表达式分发到不同的更专一的查找器上面。上面的例子中就是将具体查找分发给 Expr.find[ ‘ID’ ]
具体代码分析:
1 | Sizzle.find = function( expr, context, isXML ) { |
讨论
关于检测’'的讨论【这个不知道对不对】
实例表达式expr = ‘.className’,CLASS匹配结果[‘.className’,’.className’], 此时原本的意图是’.’被转义,因此不应该作为class匹配,中止。
关于getElementById方法bug的讨论(源码1056行),
在某些浏览器里面,getElementById(‘test’)会返回name值为test的a节点,因此会对查询结果产生干扰。比如:
此时a节点在div前面,getElementById(‘test’)回返回而非预期中的。Sizzle也对此做了检测:
1 | (function(){ |
接下来是Sizzle.filter流程分析:《Sizzle引擎–原理与实践(四)》