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 相关文章推荐
javascript iframe内的函数调用实现方法
Jul 19 Javascript
JavaScript学习笔记记录我的旅程
May 23 Javascript
Javascript基础 函数“重载” 详细介绍
Oct 25 Javascript
ie下$.getJSON出现问题的解决方法
Feb 12 Javascript
JavaScript中的原型prototype属性使用详解
Jun 05 Javascript
js实现汉字排序的方法
Jul 23 Javascript
jQuery实现下拉框左右移动(全部移动,已选移动)
Apr 15 Javascript
javascript中Number的方法小结
Nov 21 Javascript
手机软键盘弹出时影响布局的解决方法
Dec 15 Javascript
js设置随机切换背景图片的简单实例
Nov 12 Javascript
angularjs 页面自适应高度的方法
Jan 17 Javascript
vue中axios的封装问题(简易版拦截,get,post)
Jun 15 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的宝库目录--PEAR
2006/10/09 PHP
解析如何修改phpmyadmin中的默认登陆超时时间
2013/06/25 PHP
php实现递归与无限分类的方法
2015/02/16 PHP
ThinkPHP实现生成和校验验证码功能
2017/04/28 PHP
php处理抢购类功能的高并发请求
2018/02/08 PHP
PHP中abstract(抽象)、final(最终)和static(静态)原理与用法详解
2020/06/05 PHP
jQuery UI Autocomplete 体验分享
2012/02/14 Javascript
javascript生成随机大小写字母的方法
2014/02/20 Javascript
javascript事件冒泡详解和捕获、阻止方法
2014/04/12 Javascript
jQuery判断元素上是否绑定了指定事件的方法
2015/03/17 Javascript
javascript实现行拖动的方法
2015/05/27 Javascript
javascript性能优化之DOM交互操作实例分析
2015/12/12 Javascript
javascript运动效果实例总结(放大缩小、滑动淡入、滚动)
2016/01/08 Javascript
JS遍历数组和对象的区别及递归遍历对象、数组、属性的方法详解
2016/06/14 Javascript
JS查找字符串中出现最多的字符及个数统计
2017/02/04 Javascript
canvas实现爱心和彩虹雨效果
2017/03/09 Javascript
Bootstrap fileinput文件上传组件使用详解
2017/06/06 Javascript
详解windows下vue-cli及webpack 构建网站(二)导入bootstrap样式
2017/06/17 Javascript
详解在vue-cli项目中安装node-sass
2017/06/21 Javascript
浅谈vue-router2路由参数注意的问题
2017/11/08 Javascript
jquery 时间戳转日期过程详解
2019/10/12 jQuery
[02:03]永远的信仰DOTA2 中国军团历届国际邀请赛回顾
2016/06/26 DOTA
mac安装pytorch及系统的numpy更新方法
2018/07/26 Python
Python求一批字符串的最长公共前缀算法示例
2019/03/02 Python
django query模块
2019/04/20 Python
使用Django实现把两个模型类的数据聚合在一起
2020/03/28 Python
python爬虫多次请求超时的几种重试方法(6种)
2020/12/01 Python
Pycharm制作搞怪弹窗的实现代码
2021/02/19 Python
瑞贝卡·明可弗包包官网:Rebecca Minkoff
2016/07/21 全球购物
安全保证书范文
2014/04/29 职场文书
关于诚信的活动方案
2014/08/18 职场文书
房屋过户委托书范本
2014/10/07 职场文书
先进单位事迹材料
2014/12/25 职场文书
建筑工地资料员岗位职责
2015/04/13 职场文书
2015年社区平安建设工作总结
2015/05/13 职场文书
2015暑假实习报告范文
2015/07/13 职场文书