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 相关文章推荐
Dojo之路:如何利用Dojo实现Drag and Drop效果
Apr 10 Javascript
线路分流自动智能跳转代码,自动选择最快镜像网站(js)
Oct 31 Javascript
javascript 获取模态窗口的滚动位置代码
Aug 06 Javascript
JavaScript中数据结构与算法(三):链表
Jun 19 Javascript
avalon js实现仿google plus图片多张拖动排序附源码下载
Sep 24 Javascript
JS鼠标拖拽实例分析
Nov 23 Javascript
更高效的使用JQuery 这里总结了8个小技巧
Apr 13 Javascript
js实现下拉框效果(select)
Mar 28 Javascript
AngularJS模糊查询功能实现代码(过滤内容下拉菜单排序过滤敏感字符验证判断后添加表格信息)
Oct 24 Javascript
JS判断数组里是否有重复元素的方法小结
May 21 Javascript
浅谈layui 数据表格前后台传值的问题
Sep 12 Javascript
js动态添加带圆圈序号列表的实例代码
Feb 18 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
《星际争霸》各版本雷兽特点图文解析 雷兽不同形态一览
2020/03/02 星际争霸
php+ajax实时刷新简单实例
2015/02/25 PHP
PHP基于curl模拟post提交json数据示例
2018/06/22 PHP
PHP 实现缩略图
2021/03/09 PHP
sina的lightbox效果。
2007/01/09 Javascript
jQuery操作input type=radio的实现代码
2012/06/14 Javascript
js 通过html()及text()方法获取并设置p标签的显示值
2014/05/14 Javascript
JQuery简单实现锚点链接的平滑滚动
2015/05/03 Javascript
jQuery ajax调用后台aspx后台文件的两种常见方法(不是ashx)
2016/06/28 Javascript
基于jQuery代码实现圆形菜单展开收缩效果
2017/02/13 Javascript
基于AngularJS的拖拽文件上传的实例代码
2017/07/15 Javascript
使用Node.js实现RESTful API的示例
2017/08/01 Javascript
React Native 集成jpush-react-native的示例代码
2017/08/16 Javascript
JavaScript EventEmitter 背后的秘密 完整版
2018/03/29 Javascript
jQuery实现的隔行变色功能【案例】
2019/02/18 jQuery
微信小程序实现的五星评价功能示例
2019/04/25 Javascript
基于Vue实现平滑过渡的拖拽排序功能
2019/06/12 Javascript
微信小程序中的video视频实现 自定义播放按钮、封面图、视频封面上文案
2020/01/02 Javascript
javascript设计模式 ? 代理模式原理与用法实例分析
2020/04/16 Javascript
[04:36]DOTA2国际邀请赛 ti3精彩集锦
2013/08/19 DOTA
Python多线程中阻塞(join)与锁(Lock)使用误区解析
2018/04/27 Python
python 找出list中最大或者最小几个数的索引方法
2018/10/30 Python
浅谈Python反射 &amp; 单例模式
2019/03/21 Python
解决ROC曲线画出来只有一个点的问题
2020/02/28 Python
python+opencv边缘提取与各函数参数解析
2020/03/09 Python
基于Pytorch版yolov5的滑块验证码破解思路详解
2021/02/25 Python
35款精致的 CSS3 和 HTML5 网页模板 推荐
2012/08/03 HTML / CSS
加拿大折扣、优惠券和交易网站:WagJag
2018/02/07 全球购物
草莓网中国:StrawberryNet中国
2020/08/17 全球购物
JAVA中的关键字有什么特点
2014/03/07 面试题
Python的两道面试题
2013/06/29 面试题
秋季婚礼证婚词
2014/01/11 职场文书
教师求职自荐信
2014/03/09 职场文书
给妈妈洗脚活动方案
2014/08/16 职场文书
golang中字符串MD5生成方式总结
2021/07/04 Golang
10大幻兽系恶魔果实 蝙蝠果实上榜,第一自愈能力强
2022/03/18 日漫