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 相关文章推荐
学习jquery必备 api中英文对照的chm手册 下载
May 03 Javascript
jQuery中before()方法用法实例
Dec 25 Javascript
javascript实现动态改变层大小的方法
May 14 Javascript
JS判断指定dom元素是否在屏幕内的方法实例
Jan 23 Javascript
Vue-cli3项目配置Vue.config.js实战记录
Jul 29 Javascript
JavaScript实现淘宝京东6位数字支付密码效果
Aug 18 Javascript
jQuery简单实现根据日期计算星期几的方法
Jan 09 jQuery
详解使用webpack+electron+reactJs开发windows桌面应用
Feb 01 Javascript
用node.js写一个jenkins发版脚本
May 21 Javascript
Vue组件之高德地图地址选择功能的实例代码
Jun 21 Javascript
vue键盘事件点击事件加native操作
Jul 27 Javascript
详解如何在Canvas中添加事件的方法
Apr 17 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模板,主要想体现一下思路
2006/12/25 PHP
PDO版本问题 Invalid parameter number: no parameters were bound
2013/01/06 PHP
判断php数组是否为索引数组的实现方法
2013/06/13 PHP
PHP获取文件行数的方法
2015/06/10 PHP
老生常谈PHP位运算的用途
2017/03/12 PHP
基于PHP实现短信验证码发送次数限制
2020/07/11 PHP
jquery nth-child()选择器的简单应用
2010/07/10 Javascript
javascript 词法作用域和闭包分析说明
2010/08/12 Javascript
functional继承模式 摘自javascript:the good parts
2011/06/20 Javascript
jquery 回车事件实现代码
2011/08/23 Javascript
js函数中onmousedown和onclick的区别和联系探讨
2013/05/19 Javascript
js中reverse函数的用法详解
2013/12/26 Javascript
jquery五角星评分插件示例分享
2014/02/21 Javascript
JS获取客户端IP地址、MAC和主机名的7个方法汇总
2014/07/21 Javascript
JS脚本根据手机浏览器类型跳转WAP手机网站(两种方式)
2015/08/04 Javascript
uploadify多文件上传参数设置技巧
2015/11/16 Javascript
使用bootstrap3开发响应式网站
2016/05/12 Javascript
JavaScript 最佳实践:帮你提升代码质量
2016/12/03 Javascript
解析NodeJs的调试方法
2016/12/11 NodeJs
基于jQuery实现选项卡效果
2017/01/04 Javascript
jQuery插件HighCharts实现气泡图效果示例【附demo源码】
2017/03/13 Javascript
Angular CLI 安装和使用教程
2017/09/13 Javascript
JS字符串常用操作方法实例小结
2019/06/24 Javascript
Python linecache.getline()读取文件中特定一行的脚本
2008/09/06 Python
Python实现二维数组按照某行或列排序的方法【numpy lexsort】
2017/09/22 Python
Django REST framework 如何实现内置访问频率控制
2019/07/23 Python
Python列表操作方法详解
2020/02/09 Python
Python3爬虫里关于识别微博宫格验证码的知识点详解
2020/07/30 Python
matplotlib阶梯图的实现(step())
2021/03/02 Python
html5 video标签屏蔽右键视频另存为的js代码
2013/11/12 HTML / CSS
trivago美国:全球最大的酒店价格比较网站
2018/01/18 全球购物
Paul Smith英国官网:英国国宝级时装品牌
2019/03/21 全球购物
小学生十佳少年事迹材料
2014/08/20 职场文书
2014年小学生教师节演讲稿范文
2014/09/10 职场文书
公司岗位说明书
2015/10/08 职场文书
初中语文教师研修日志
2015/11/13 职场文书