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 相关文章推荐
getElementById在任意一款浏览器中都可以用吗的疑问回复
May 13 Javascript
jQuery入门知识简介
Mar 04 Javascript
原生JavaScript编写俄罗斯方块
Mar 30 Javascript
javascript动态设置样式style实例分析
May 13 Javascript
jQuery插件ImageDrawer.js实现动态绘制图片动画(附源码下载)
Feb 25 Javascript
深入理解jQuery layui分页控件的使用
Aug 17 Javascript
JS弹出窗口的运用与技巧大全
Nov 01 Javascript
JavaScript实现前端分页控件
Apr 19 Javascript
vue上传图片组件编写代码
Jul 26 Javascript
vue.js的双向数据绑定Object.defineProperty方法的神奇之处
Jan 18 Javascript
layui原生表单验证的实例
Sep 09 Javascript
vue项目中的支付功能实现(微信支付和支付宝支付)
Feb 18 Vue.js
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实现定时生成HTML网站首页实例代码
2008/11/20 PHP
php zlib压缩和解压缩swf文件的代码
2008/12/30 PHP
PHP中通过加号合并数组的一个简单方法分享
2011/01/27 PHP
安装PHP扩展时解压官方 tgz 文件后没有configure文件无法进行配置编译的问题
2020/08/26 PHP
基于JQUERY的多级联动代码
2012/01/24 Javascript
js 判断一个元素是否在页面中存在
2012/12/27 Javascript
探讨在JQuery和Js中,如何让ajax执行完后再继续往下执行
2013/07/09 Javascript
js动态创建表格,删除行列的小例子
2013/07/20 Javascript
javascript获取元素CSS样式代码示例
2013/11/28 Javascript
nodejs分页类代码分享
2014/06/17 NodeJs
jQuery制作效果超棒的手风琴折叠菜单
2015/04/03 Javascript
javascript将中国数字格式转换成欧式数字格式的简单实例
2016/08/02 Javascript
Angular 通过注入 $location 获取与修改当前页面URL的实例
2017/05/31 Javascript
react-native 封装选择弹出框示例(试用ios&amp;android)
2017/07/11 Javascript
vue小白入门教程
2018/04/02 Javascript
如何用input标签和jquery实现多图片的上传和回显功能
2018/05/16 jQuery
浅谈在vue-cli3项目中解决动态引入图片img404的问题
2020/08/04 Javascript
Python3.5 Pandas模块之Series用法实例分析
2019/04/23 Python
python pygame实现方向键控制小球
2019/05/17 Python
python按修改时间顺序排列文件的实例代码
2019/07/25 Python
Django实现网页分页功能
2019/10/31 Python
Python+Selenium+phantomjs实现网页模拟登录和截图功能(windows环境)
2019/12/11 Python
Python yield的用法实例分析
2020/03/06 Python
Python xlrd excel文件操作代码实例
2020/03/10 Python
Python Selenium截图功能实现代码
2020/04/26 Python
python安装读取grib库总结(推荐)
2020/06/24 Python
迪卡侬印尼体育用品商店:Decathlon印尼
2020/03/11 全球购物
应届生妇产科护士求职信
2013/10/27 职场文书
优秀老员工获奖感言
2014/02/15 职场文书
中文教师求职信
2014/02/22 职场文书
小学生开学感言
2014/02/28 职场文书
分层教学实施方案
2014/03/19 职场文书
2015年乡镇发展党员工作总结
2015/03/31 职场文书
《酸的和甜的》教学反思
2016/02/18 职场文书
接触艺术对孩子学习思维有益
2019/08/06 职场文书
Python下opencv库的安装过程及问题汇总
2021/06/11 Python