jQuery选择器源码解读(五):tokenize的解析过程
以下分析基于jQuery-1.10.2.js版本。
下面将以$("div:not(.class:contain('span')):eq(3)")为例,说明tokenize和preFilter各段代码是如何协调完成解析的。若想了解tokenize方法和preFilter类的每行代码的详细解释,请参看如下两篇文章:
https://www.nhooo.com/article/63155.htm
https://www.nhooo.com/article/63163.htm
下面是tokenize方法的源码,为了简便期间,我把有关缓存、逗号的匹配以及关系符的匹配的代码全部去掉了,只留了与当前例子有关的核心代码。被去掉的代码很简单,若需要可以看一下上述文章即可。
另外,代码统一写在说明文字上方。
functiontokenize(selector,parseOnly){ varmatched,match,tokens,type,soFar,groups,preFilters; soFar=selector; groups=[]; preFilters=Expr.preFilter;
while(soFar){ if(!matched){ groups.push(tokens=[]); } matched=false;
for(typeinExpr.filter){ if((match=matchExpr[type].exec(soFar)) &&(!preFilters[type]||(match=preFilters[type] (match)))){ matched=match.shift(); tokens.push({ value:matched, type:type, matches:match }); soFar=soFar.slice(matched.length); } }
if(!matched){ break; } }
returnparseOnly?soFar.length:soFar?Sizzle.error(selector): tokenCache(selector,groups).slice(0); }