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 相关文章推荐
javascript事件模型代码
Jul 01 Javascript
由JavaScript中call()方法引发的对面向对象继承机制call的思考
Sep 12 Javascript
js隐藏与显示回到顶部按钮及window.onscroll事件应用
Jan 25 Javascript
jquery 清空file域示例(兼容个浏览器)
Oct 11 Javascript
基于jQuery实现文本框只能输入数字(小数、整数)
Jan 14 Javascript
Node.js开发教程之基于OnceIO框架实现文件上传和验证功能
Nov 30 Javascript
javascript使用递归算法求两个数字组合功能示例
Jan 03 Javascript
JavaScript实现滑动导航栏效果
Aug 30 Javascript
node的process以及child_process模块学习笔记
Mar 06 Javascript
深入理解移动前端开发之viewport
Oct 19 Javascript
Auto.JS实现抖音刷宝等刷视频app,自动点赞,自动滑屏,自动切换视频功能
May 08 Javascript
vue实现匀速轮播效果
Jun 29 Javascript
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
10 个经典PHP函数
2013/10/17 PHP
PHP中使用strpos函数实现屏蔽敏感关键字功能
2014/08/21 PHP
PHP实现通用alert函数的方法
2015/03/11 PHP
CodeIgniter配置之SESSION用法实例分析
2016/01/19 PHP
php+mysql实现简单登录注册修改密码网页
2016/11/30 PHP
php redis实现对200w用户的即时推送
2017/03/04 PHP
分享几种好用的PHP自定义加密函数(可逆/不可逆)
2020/09/15 PHP
Array.prototype.slice 使用扩展
2010/06/09 Javascript
JavaScript NodeTree导航栏(菜单项JSON类型/自制)
2013/02/01 Javascript
JavaScript中的console.log()函数详细介绍
2014/12/29 Javascript
javascript中局部变量和全局变量的区别详解
2015/02/27 Javascript
javascript中日期函数new Date()的浏览器兼容性问题
2015/09/05 Javascript
JS实现网页标题栏显示当前时间和日期的完整代码
2015/11/02 Javascript
jQuery页面弹出框实现文件上传
2017/02/09 Javascript
jQuery实现遍历复选框的方法示例
2017/03/06 Javascript
Express + Node.js实现登录拦截器的实例代码
2017/07/01 Javascript
详解Layer弹出层样式
2017/08/21 Javascript
js事件触发操作实例分析
2019/06/21 Javascript
JS Thunk 函数的含义和用法实例总结
2020/04/08 Javascript
vuex实现购物车功能
2020/06/28 Javascript
[58:15]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 NB vs Liquid
2018/04/02 DOTA
以一段代码为实例快速入门Python2.7
2015/03/31 Python
python3.5实现socket通讯示例(TCP)
2017/02/07 Python
Python深拷贝与浅拷贝用法实例分析
2019/05/05 Python
Python面向对象编程基础实例分析
2020/01/17 Python
python中count函数简单的实例讲解
2020/02/06 Python
纯CSS绘制漂亮的圆形图案效果
2014/05/07 HTML / CSS
全球最大的游戏市场:G2A
2018/07/05 全球购物
eBay意大利购物网站:eBay.it
2019/09/04 全球购物
Michael Kors香港官网:美国奢侈品品牌
2019/12/26 全球购物
入党积极分子评语
2014/05/04 职场文书
关爱残疾人演讲稿
2014/05/24 职场文书
门店业绩提升方案
2014/06/08 职场文书
公司领导九九重阳节发言稿2014
2014/09/25 职场文书
离婚代理词范文
2015/05/23 职场文书
Mysql数据库手动及定时备份步骤
2021/11/07 MySQL