jQuery代码优化 选择符篇


Posted in Javascript onNovember 01, 2011

本文就从选择符的角度简单探讨一下优化jQuery代码的问题。

Sizzle的运行机制

jQuery从1.3开始把根据选择符表达式查找元素的代码独立出来,也就是Sizzle引擎。当我们把一个选择符表达式(比如"#id"、".class"、":nth-child(2)")传递给$()函数时,Sizzle在内部会优先利用浏览器原生支持的DOM方法来查找元素,以求得最大的执行速度。以下就是Sizzle会优先选用的几个标准的原生方法(各个方法的用途不再赘述):

getElementById() 
getElementsByTagName() 
getElementsByClassName() 
querySelectorAll()

如果浏览器不支持某个方法,或者传入的选择符表达式不是标准选择符(如":eq()"、":odd"或其他自定义选择符),Sizzle就会使用document.getElementsByTagName('*')来取得文档中的所有元素,然后再遍历并测试每个元素。显然,这是万不得已才会用的方法;可想而知,这个最笨的方法,效率也是最低的。

优化示例
举个例子,假设我们要取得页面表单中的所有的文本框,即:

<input type="text">
可以使用两个选择符:

$('input[type="text"]') 
$('input:text')

第一个选择符是标准的CSS属性选择符,第二个选择符是自定义选择符。根据前面对Sizzle引擎的分析可知,在大多数现代浏览器(支持原生querySelectorAll()方法的浏览器)中,第一个选择符的速度比第二个要快很多。

再举一个例子。假设有下面两个jQuery查询:

$('input').eq(1) 
$('input:eq(1)')

第一个查询先通过标准的CSS元素选择符查找所有input元素,然后再调用jQuery的eq()方法取得匹配结果中的第二个元素(eq()方法的索引参数是从0开始计算的)。第二个查询则使用了自定义的伪类选择符:eq()。通过测试可以看出,第一种方法的速度比第二种方法快得就更多了。

结论
要尽可能使用CSS规范中规定的选择符,除非没有标准选择符,才考虑使用jQuery的自定义选择符。

(注:本文基于《jQuery基础教程(第3版)》相关章节内容编撰而成。)

Javascript 相关文章推荐
img的onload的另类用法
Jan 10 Javascript
谈谈我对JavaScript中typeof和instanceof的深入理解
Dec 25 Javascript
jQuery模拟物体自由落体运动(附演示与demo源码下载)
Jan 21 Javascript
详解Node.js中的事件机制
Sep 22 Javascript
浅谈js之字面量、对象字面量的访问、关键字in的用法
Nov 20 Javascript
angularJS 指令封装回到顶部示例详解
Jan 22 Javascript
iscroll.js滚动加载实例详解
Jul 18 Javascript
微信小程序之滚动视图容器的实现方法
Sep 26 Javascript
Vue+Vux项目实践完整代码
Nov 30 Javascript
js实现把时间戳转换为yyyy-MM-dd hh:mm 格式(es6语法)
Dec 28 Javascript
AngularJS对动态增加的DOM实现ng-keyup事件示例
Mar 12 Javascript
vue 解决mintui弹窗弹起来,底部页面滚动bug问题
Nov 12 Javascript
jQuery代码优化之基本事件
Nov 01 #Javascript
js下获得客户端操作系统的函数代码(1:vista,2:windows7,3:2000,4:xp,5:2003,6:2008)
Oct 31 #Javascript
线路分流自动智能跳转代码,自动选择最快镜像网站(js)
Oct 31 #Javascript
IE与Firefox在JavaScript上的7个不同句法分享
Oct 30 #Javascript
加载 Javascript 最佳实践
Oct 30 #Javascript
js判断是否为数组的函数: isArray()
Oct 30 #Javascript
JS trim去空格的最佳实践
Oct 30 #Javascript
You might like
推荐php模板技术[转]
2007/01/04 PHP
php switch语句多个值匹配同一代码块的实现
2014/03/03 PHP
使用xampp搭建运行php虚拟主机的详细步骤
2015/10/21 PHP
Yii框架实现邮箱激活的方法【数字签名】
2016/10/18 PHP
利用javascript中的call实现继承
2007/01/22 Javascript
JQuery一种取同级值的方式(比如你在GridView中)
2012/03/15 Javascript
js日期联动示例
2014/05/02 Javascript
jQuery的animate函数实现图文切换动画效果
2015/05/03 Javascript
easyui Draggable组件实现拖动效果
2015/08/19 Javascript
jquery实现顶部向右伸缩的导航区域代码
2015/09/02 Javascript
jQuery控制li上下循环滚动插件用法实例(附demo源码下载)
2016/05/28 Javascript
JQuery为元素添加样式的实现方法
2016/07/20 Javascript
JavaScript中Array的实用操作技巧分享
2016/09/11 Javascript
深入理解javascript中concat方法
2016/12/12 Javascript
vue.js选中动态绑定的radio的指定项
2017/06/02 Javascript
浅谈javascript中的prototype和__proto__的理解
2019/04/07 Javascript
jquery将json转为数据字典的实例代码
2019/10/11 jQuery
js实现双色球效果
2020/08/02 Javascript
解决python nohup linux 后台运行输出的问题
2018/05/11 Python
python基于socket实现的UDP及TCP通讯功能示例
2019/11/01 Python
python如何输出反斜杠
2020/06/18 Python
python 如何区分return和yield
2020/09/22 Python
python利用opencv实现颜色检测
2021/02/23 Python
澳大利亚排名第一的在线酒类商店:MyBottleShop
2018/04/26 全球购物
加州风格的游泳和沙滩装品牌:Cupshe
2019/06/10 全球购物
英国Radley包德国官网:Radley London德国
2019/11/18 全球购物
英国时尚首饰品牌:Missoma
2020/06/29 全球购物
留学自荐信
2013/10/10 职场文书
人力资源总监工作说明
2014/03/03 职场文书
大学迎新晚会主持词
2014/03/24 职场文书
乡镇党委书记个人整改措施
2014/09/15 职场文书
优秀班组申报材料
2014/12/25 职场文书
小学一年级语文教学反思
2016/03/03 职场文书
为什么MySQL分页用limit会越来越慢
2021/07/25 MySQL
TV动画《史上最强大魔王转生为村民A》番宣CM公布
2022/04/01 日漫
Spring boot实现上传文件到本地服务器
2022/08/14 Java/Android