JQuery日记_5.14 Sizzle选择器(七)
for ( type in Expr.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 );
}
}
preFilter: {
//match是捕获组
//如果:[arr^='val']
"ATTR": function( match ) {
//attr的第一个捕获 组是arr,将当中的转码变成原来的字符
match[1] = match[1].replace( runescape, funescape );
// Move the given value to match[3] whether quoted or unquoted
// 将val放到捕获组3里,原来的捕获组3捕获'或"
match[3] = ( match[4] || match[5] || "" ).replace( runescape, funescape );
//如果捕获组2是~=。在match[3]前后加空格,以方便匹配单个单词
if ( match[2] === "~=" ) {
match[3] = " " + match[3] + " ";
}
//match[0] = '[arr^='val']'
//match[1] = 'arr'
//match[2] = '='
//match[3] = '111'
return match.slice( 0, 4 );
},
"CHILD": function( match ) {
/* 比如nth-child(-2n+1)的捕获组
mathc[1] nth
mathc[2] child
mathc[3] 2n+1
mathc[4] 2n
mathc[5] -
mathc[6] 2
mathc[7] +
mathc[8] 1
*/
match[1] = match[1].toLowerCase();
// nth必须须要參数
if ( match[1].slice( 0, 3 ) === "nth" ) {
// nth-* requires argument
if ( !match[3] ) {
Sizzle.error( match[0] );
}
// numeric x and y parameters for Expr.filter.CHILD
// remember that false/true cast respectively to 0/1
// xn + y
// 将even,odd修正为xn+y,match[4]修正为+-x
match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
// 将match[5]替换为+-y
match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
// other types prohibit arguments
// 除nth外其它类型禁止參数
} else if ( match[3] ) {
Sizzle.error( match[0] );
}
// match[0] :nth-child(-2n+1)
// match[1] nth
// match[2] child
// match[3] -2n+1
// match[4] -2
// match[5] 1
// match[6] 2
// match[7] +
// match[8] 1
return match;
},
/**
* match[1] :后伪类类型
* match[2] 伪类參数
* match[3] 參数中的'或者"
* match[4] 除去'或"的伪类
*/
"PSEUDO": function( match ) {
var excess,
unquoted = !match[5] && match[2];
//是CHILD伪类。返回null
if ( matchExpr[ "CHILD"].test( match[0] ) ) {
return null;
}
// Accept quoted arguments as-is
// 參数有引號
//将match[2]替换为无引號的match[4]參数
if ( match[3] && match[4] !== undefined ) {
match[2] = match[4];
// Strip excess characters from unquoted arguments
// 除去带引號的參数的多余字符
} else if ( unquoted && rpseudo.test( unquoted ) &&
// Get excess from tokenize (recursively)
//excess多余字符的长度
(excess = tokenize( unquoted, true )) &&
//excess多余參数的索引位置,excess是个负值,以便截取到多余字符之前
(excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
// excess is a negative index
match[0] = match[0].slice( 0, excess );
match[2] = unquoted.slice( 0, excess );
}
// Return only captures needed by the pseudo filter method (type and argument)
return match.slice( 0, 3 );
}
}
JQuery日记_5.14 Sizzle选择器(七)的更多相关文章
- JQuery日记_5.13 Sizzle选择器(六)选择器的效率
当选择表达式不符合高速匹配(id,tag,class)和原生QSA不可用或返回错误时,将调用select(selector, context, results, seed)方法,此方法迭代DO ...
- JQuery日记 5.11 Sizzle选择器(五)
//设置当前document和document相应的变量和方法 setDocument = Sizzle.setDocument = function( node ) { var hasCompare ...
- [转]JQuery - Sizzle选择器引擎原理分析
原文: https://segmentfault.com/a/1190000003933990 ---------------------------------------------------- ...
- jQuery源码分析系列(三)Sizzle选择器引擎-下
选择函数:select() 看到select()函数,if(match.length === 1){}存在的意义是尽量简化执行步骤,避免compile()函数的调用. 简化操作同样根据tokenize ...
- jQuery-1.9.1源码分析系列(三) Sizzle选择器引擎——编译原理
这一节要分析的东东比较复杂,篇幅会比较大,也不知道我描述后能不能让人看明白.这部分的源码我第一次看的时候也比较吃力,现在重头看一遍,再分析一遍,看能否查缺补漏. 看这一部分的源码需要有一个完整的概念后 ...
- jQuery-1.9.1源码分析系列(三) Sizzle选择器引擎——总结与性能分析
Sizzle引擎的主体部分已经分析完毕了,今天为这部分划一个句号. a. Sizzle解析流程总结 是时候该做一个总结了.Sizzle解析的流程已经一目了然了. 1.选择器进入Sizzle( sele ...
- Sizzle选择器引擎介绍
一.前言 Sizzle原来是jQuery里面的选择器引擎,后来逐渐独立出来,成为一个独立的模块,可以自由地引入到其他类库中.我曾经将其作为YUI3里面的一个module,用起来畅通无阻,没有任何障碍. ...
- JavaScipt 源码解析 Sizzle选择器
jQuery的定位就是一个DOM的操作库,那么可想而知选择器是一个至关重要的模块.Sizzle,作为一个独立全新的选择器引擎,出现在jQuery 1.3版本之后,并被John Resig作为一个开源的 ...
- jQuery源码学习:Sizzle
本文所有讨论均基于jQuery版本3.1.1,官网http://jquery.com/. 一 简介 Sizzle是用javascript实现的CSS selector engine,官网见https: ...
随机推荐
- 配置iptables,把80端口转到8080
在Linux的下面部署了tomcat,为了安全我们使用非root用户进行启动,但是在域名绑定时无法直接访问80端口号.众所周知,在unix下,非root用户不能监听1024以上的端口号,这个tomca ...
- CentOS7配置阿里云yum源和EPEL源
配置阿里云yum源(参考:http://mirrors.aliyun.com/help/centos) 1.备份 [root@bogon ~]# cd /etc/yum.repos.d/ [root@ ...
- (八)MySQL索引操作
(1)准备环境 mysql> create table t1(id int,name varchar(50)); mysql> \d $$ mysql> create procedu ...
- Java-事务管理
1.事务的概念: 事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部不成功. 2. 管理事务: 2.1. 数据库默认的事务 数据库默认支持事务的,但是数据库默认的事务是一条sql语 ...
- 2014年spark开发者大赛火热进行中!
“发现最有正能量的网络达人”,Spark开发者大赛火热进行! 2014年9月30日,2014 Spark开发者大赛在北京正式启动.本次大赛由Spark亚太研究院联合国内领先的IT技术创新与发展的互联网 ...
- ubuntu 18.04下安装编译的KMS,依赖库
libboost-system1.65.1 libglib2.0-0 libgstreamer-plugins-base1.0-0 libgstreamer1.0-0 libnice10 libsig ...
- [ThinkPHP] 独立分组配置,坑!!!
'APP_GROUP_LIST'=>'Index,Admin', //逗号后面别跟空格啊,真是逗
- Java学习之路(书籍推荐)
一.基础类 1.<Thinking in java>(阅读2遍),入门第一位是建立正确的概念 2.<Core Java>这本书更贴近实践,更多API的介绍,同样,更新也更频繁. ...
- Codeforces 919 E Congruence Equation
题目描述 Given an integer xx . Your task is to find out how many positive integers nn ( 1<=n<=x1&l ...
- [LOJ6433]最大前缀和
深刻感受到自己的水平和机房里的其他人相差甚远,他们都是随手秒这个题的... $n$很小,考虑状压DP 当一个序列在某个位置取到最大前缀和后,意味着如果把后面的数抽出来单独成序列,那么它的每个前缀和都$ ...