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 相关文章推荐
JS Timing
Apr 21 Javascript
JavaScript 节点操作 以及DOMDocument属性和方法
Dec 06 Javascript
javascript 匿名函数的理解(透彻版)
Jan 28 Javascript
JavaScript操纵窗口的方法小结
Jun 28 Javascript
多个$(document).ready()的执行顺序实例分析
Jul 26 Javascript
jscript读写二进制文件的方法
Apr 22 Javascript
快速掌握Node.js事件驱动模型
Mar 21 Javascript
JS中的Replace()传入函数时的用法详解
Sep 11 Javascript
解决Layui 表单提交数据为空的问题
Aug 15 Javascript
vue-cli2打包前和打包后的css前缀不一致的问题解决
Aug 24 Javascript
JS左右无缝轮播功能完整实例
May 16 Javascript
如何使JavaScript休眠或等待
Apr 27 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
DIY实用性框形天线
2021/03/02 无线电
PHP 处理TXT文件(打开/关闭/检查/读取)
2013/05/13 PHP
PHP获取和操作配置文件php.ini的几个函数介绍
2013/06/24 PHP
浅谈web上存漏洞及原理分析、防范方法(安全文件上存方法)
2013/06/29 PHP
php curl选项列表(超详细)
2013/07/01 PHP
解析array splice的移除数组中指定键的值,返回一个新的数组
2013/07/02 PHP
php实现的RSS生成类实例
2015/04/23 PHP
phpcms中的评论样式修改方法
2016/10/21 PHP
PHP程序员简单的开展服务治理架构操作详解(三)
2020/05/14 PHP
关于使用runtimeStyle属性问题讨论文章
2007/03/08 Javascript
AutoSave/自动存储功能实现
2007/03/24 Javascript
超越Jquery_01_isPlainObject分析与重构
2010/10/20 Javascript
javascript 进阶篇3 Ajax 、JSON、 Prototype介绍
2012/03/14 Javascript
Jquery数字上下滚动动态切换插件
2015/08/08 Javascript
jQuery Validate表单验证深入学习
2015/12/18 Javascript
完美实现八种js焦点轮播图(上篇)
2016/07/18 Javascript
深入理解requestAnimationFrame的动画循环
2016/09/20 Javascript
jQGrid Table操作列中点击【操作】按钮弹出按钮层的实现代码
2016/12/05 Javascript
javascript 使用正则test( )第一次是 true,第二次是false
2017/02/22 Javascript
基于Vue的SPA动态修改页面title的方法(推荐)
2018/01/02 Javascript
JavaScript基于用户照片姓名生成海报
2020/05/29 Javascript
vue使用echarts图表自适应的几种解决方案
2020/12/04 Vue.js
Python中声明只包含一个元素的元组数据方法
2014/08/25 Python
Django1.7+python 2.78+pycharm配置mysql数据库教程
2014/11/18 Python
使用Python的Flask框架构建大型Web应用程序的结构示例
2016/06/04 Python
python中实现迭代器(iterator)的方法示例
2017/01/19 Python
详解python里的命名规范
2018/07/16 Python
Python类的继承用法示例
2019/01/31 Python
python MD5加密的示例
2020/10/19 Python
html5的canvas元素使用方法介绍(画矩形、画折线、圆形)
2014/04/14 HTML / CSS
Charlotte Tilbury英国官网:英国彩妆品牌
2017/05/26 全球购物
高一历史教学反思
2014/01/13 职场文书
勤俭节约演讲稿
2014/05/08 职场文书
艺术学院毕业生自荐信
2014/07/05 职场文书
Python下opencv使用hough变换检测直线与圆
2021/06/18 Python
使用Djongo模块在Django中使用MongoDB数据库
2021/06/20 Python