jquery 选择器引擎sizzle浅析


Posted in Javascript onFebruary 06, 2013

I'm sorry!我用jquery的大概有一年了,只知道$(selector),其内部选择器的流程走向完全不清晰!于是看了jquery的源码,jquery用的选择器的引擎是sizzle,是jquery的作者另一开源项目,在github上面有,号称最快的dom选择器!不到2000行代码。

上面说了不是很精彩的开场白,我么来个 for example: $('.test') 在jquery的流程是怎么走的呢?
1.首先会做如下的判断

/** 
*关于 querySelectorAll函数 
*返回当前文档中匹配一个特定选择器的所有的元素 
*var nodelist = element.querySelectorAll("div.test"); 
*支持浏览器 ie8+,Chrome,Firefox(3.5) 
* 如果你不清楚可以google 一下 
*/ 
if ( document.querySelectorAll ) { 
(function(){ 
var oldSizzle = Sizzle, 
div = document.createElement("div"), 
id = "__sizzle__"; 
div.innerHTML = "<p class='TEST'></p>"; 
// Safari can't handle uppercase or unicode characters when 
// in quirks mode. 
if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { 
return; 
} 
Sizzle = function( query, context, extra, seed ) { 
//使用querySelectorAll 来查询 
} 
}

如果你的浏览器是ie8+ 或者 谷歌,直接通过内置的querySelectorAll(".test")返回dom结构。 如果你使用是ie6,那么下面事情发生了
2. 不支持querySelectorAll 就会启动内部 sizzle。下面是流程
/** 
.sizzle 通过 
chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g 
这个正则进行匹配, 
.把我们传来的参数'.test',匹配成'.test' 放到数组 
.检测浏览器是否支持getElementsByClassName 如果支持,则通过此函数返回dom,如果不支持此函数则 context.getElementsByTagName( "*" ) ,通过上下文把所有的元素选出来,在通过循环,选择className = 'test' 的元素,放入数组返回dom。 
*/

ok,以上是$('.test')的流程,如果你很迷惑,你可以看看源码,调试一下。
关于sizzle的选择器
个人认为,sizzle选择器是增强版的querySelectorAll 函数, 因为querySelectorAll 不支持 'div.test :eq(1)' 这样的selector 和css3选择!
当你的selector里面不出现nth|eq|gt|lt|first|last|even|odd 这样的字符时候, 从右向左,所谓的从右向左,比如 $('div img') 首先会把所有的img 选出来,通过parent 是div 进行过滤 。 这样很高效的原因是只进行一次dom的查询!
当你selector 出现了'eq(1)' 这样的字符的时候,就变正常了,从左向右!这是因为要对结果集进行过滤。
思考
$('div img:eq(0)') 与 $('div img').first() 哪个效率高? 个人认为 后一个高一些,因为 第一从左向右效率低下!没有测试过!理论推导!

今天大致看了下流程,具体的代码没怎么细研究!这里面好的思想值得学习和吸收
欢迎拍砖

Javascript 相关文章推荐
解决extjs在firefox中关闭窗口再打开后iframe中js函数访问不到的问题
Nov 06 Javascript
js multiple全选与取消全选实现代码
Dec 04 Javascript
AngularJS使用angular-formly进行表单验证
Dec 27 Javascript
Atitit.js的键盘按键事件捆绑and事件调度
Apr 01 Javascript
深入浅析jQuery对象$.html
Aug 22 Javascript
微信小程序访问node.js接口服务器搭建教程
Apr 25 Javascript
vue实现页面加载动画效果
Sep 19 Javascript
Vue实现美团app的影院推荐选座功能【推荐】
Aug 29 Javascript
JS实现水平移动与垂直移动动画
Dec 19 Javascript
React实现轮播效果
Aug 25 Javascript
vue 动态生成拓扑图的示例
Jan 03 Vue.js
vue+spring boot实现校验码功能
May 27 Vue.js
extjs3 combobox取value和text案例详解
Feb 06 #Javascript
js汉字转拼音实现代码
Feb 06 #Javascript
jquery解决图片路径不存在执行替换路径
Feb 06 #Javascript
JavaScript去除空格的三种方法(正则/传参函数/trim)
Feb 06 #Javascript
js中top/parent/frame概述及案例应用
Feb 06 #Javascript
ExtJS4 Grid改变单元格背景颜色及Column render学习
Feb 06 #Javascript
jquery load事件(callback/data)使用方法及注意事项
Feb 06 #Javascript
You might like
php discuz 主题表和回帖表的设计
2009/03/13 PHP
php操作xml
2013/10/27 PHP
64位windows系统下安装Memcache缓存
2015/12/06 PHP
CodeIgniter自定义控制器MY_Controller用法分析
2016/01/20 PHP
thinkPHP实现递归循环栏目并按照树形结构无限极输出的方法
2016/05/19 PHP
PHP简单读取PDF页数的实现方法
2016/07/21 PHP
php微信扫码支付 php公众号支付
2019/03/24 PHP
php反射学习之依赖注入示例
2019/06/14 PHP
Add a Picture to a Microsoft Word Document
2007/06/15 Javascript
Convert Seconds To Hours
2007/06/16 Javascript
用函数式编程技术编写优美的 JavaScript_ibm
2008/05/16 Javascript
jQuery旋转插件—rotate支持(ie/Firefox/SafariOpera/Chrome)
2013/01/16 Javascript
js动态创建上传表单通过iframe模拟Ajax实现无刷新
2014/02/20 Javascript
node.js Web应用框架Express入门指南
2014/05/28 Javascript
jQuery对于显示和隐藏等常用状态的判断方法
2014/12/13 Javascript
ClearTimeout消除闪动实例代码
2016/02/29 Javascript
使用Script元素发送JSONP请求的方法
2016/06/12 Javascript
引用jquery框架后出错的解决方法
2016/08/09 Javascript
angularJS利用ng-repeat遍历二维数组的实例代码
2017/06/03 Javascript
vue项目引入Iconfont图标库的教程图解
2018/10/24 Javascript
vue 解决文本框被键盘遮住的问题
2019/11/06 Javascript
js实现浏览器打印功能的示例代码
2020/07/15 Javascript
CentOS中升级Python版本的方法详解
2017/07/10 Python
Python实现的拟合二元一次函数功能示例【基于scipy模块】
2018/05/15 Python
Selenium的使用详解
2018/10/19 Python
python按修改时间顺序排列文件的实例代码
2019/07/25 Python
selenium自动化测试入门实战
2020/12/21 Python
全面解析CSS Media媒体查询使用操作(推荐)
2017/08/15 HTML / CSS
美国最好的保健品打折网店:Swanson
2017/08/04 全球购物
.NET面试10题
2014/02/24 面试题
UNIX文件系统分类
2014/11/11 面试题
会计出纳岗位职责
2013/12/25 职场文书
煤矿安全承诺书
2014/05/22 职场文书
党员演讲稿
2014/09/04 职场文书
小学“向国旗敬礼”网上签名寄语活动总结
2014/09/27 职场文书
新员工试用期工作总结2015
2015/05/28 职场文书