jQuery代码优化 遍历篇


Posted in Javascript onNovember 01, 2011

了解了jQuery对DOM进行遍历背后的工作机制,可以在编写代码时有意识地避免一些不必要的重复操作,从而提升代码的性能。本文就从jQuery的遍历机制入手简单探讨一下优化jQuery代码的问题。

jQuery对象栈

jQuery内部维护着一个jQuery对象栈。每个遍历方法都会找到一组新元素(一个jQuery对象),然后jQuery会把这组元素推入到栈中。而每个jQuery对象都有三个属性:context、selector和prevObject,其中的prevObject属性就指向这个对象栈中的前一个对象,而通过这个属性可以回溯到最初的DOM元素集。

jQuery为我们操作这个内部对象栈提供了两个非常有用的方法:

.end()
.andSelf()
调用第一个方法只是简单地弹出一个对象(结果就是回到前一个jQuery对象)。第二个方法更有意思,调用它会在栈中回溯一个位置,然后把两个位置上的元素集组合起来,并把这个新的、组合之后的元素集推入栈的上方。

利用这个DOM元素栈可以减少重复的查询和遍历的操作,而减少重复操作也正是优化jQuery代码性能的关键所在。

优化示例
下面是一个函数(省略了前后代码),用于实现表格行条纹效果:

function stripe() { 
$('#news').find('tr.alt').removeClass('alt'); 
$('#news tbody').each(function() { 
$(this).children(':visible').has('td') 
.filter(':group(3)').addClass('alt'); 
}); 
}

stripe()函数两次使用了ID选择符#news查找元素:一次是为了从带有alt类的行中删除该类,另一次是为了给新选中的行添加这个类。

优化这个函数的方法有两个,一是连缀。

连缀
连缀优化利用的就是jQuery的内部对象栈和.end()方法。优化后的代码如下:

function stripe() { 
$('#news'). 
find('tr.alt').removeClass('alt').end() 
find('tbody').each(function() { 
$(this).children(':visible').has('td') 
.filter(':group(3)').addClass('alt'); 
}); 
}

第一次调用.find()会把表格行推到栈上,然后的.end()方法则把这些行弹出,从而让下一次调用.find()仍然是在#news表格上执行操作。这样就把两次选择符查找减少为一次。

另一个优化方法是缓存。

缓存
所谓缓存,在这里就是把之前操作的结果保存起来,以便将来重用。优化后的代码如下:

var $news = $('#news'); 
function stripe() { 
$news.find('tr.alt').removeClass('alt'); 
$news.find('tbody').each(function() { 
$(this).children(':visible').has('td') 
.filter(':group(3)').addClass('alt'); 
}); 
}

与连缀的方法相比,缓存方式稍嫌冗长,因为额外创建了一个用于保存jQuery对象的变量。但从另一个角度来看,这种方式在代码中可以实现对选中元素的两次操作完全分离,而这也许可以满足我们其他情况下的需求。同样,因为可以把选中的元素保存在stripe()函数之外,也就避免了每次调用函数时重复查询选择符的操作。

结论
利用jQuery的内部对象栈和缓存,可以减少重复的DOM查询及遍历,从而提高脚本执行速度。

因为根据ID在页面中选择元素速度极快,以上两个例子在优化前后不会有明显的性能差异。在实际编码中,应该选择可读性最好、最容易维护的方式。如果真的遇到了性能瓶颈,以上优化技术都可以起到立竿见影的效果。

(注:本文基于《jQuery基础教程(第3版)》相关章节内容编撰而成。)

Javascript 相关文章推荐
js 目录列举函数
Nov 06 Javascript
JQuery 插件模板 制作jquery插件的朋友可以参考下
Mar 17 Javascript
基于SVG的web页面图形绘制API介绍及编程演示
Jun 28 Javascript
Node.js中使用Log.io在浏览器中实时监控日志(等同tail -f命令)
Sep 17 Javascript
JavaScript实现列出数组中最长的连续数
Dec 29 Javascript
深入浅出分析javaScript中this用法
May 09 Javascript
JavaScript中的原始值和复杂值
Jan 07 Javascript
jQuery双向列表选择器select版
Nov 01 Javascript
详解升级react-router 4 踩坑指南
Aug 14 Javascript
babel7.x和webpack4.x配置vue项目的方法步骤
May 12 Javascript
JS中如何轻松遍历对象属性的方式总结
Aug 06 Javascript
Nuxt 嵌套路由nuxt-child组件用法(父子页面组件的传值)
Nov 05 Javascript
jQuery代码优化 选择符篇
Nov 01 #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
You might like
PHP学习笔记之字符串编码的转换和判断
2014/05/22 PHP
漂亮的仿flash菜单,来自蓝色经典
2006/06/26 Javascript
双击滚屏-常用推荐
2006/11/29 Javascript
JS操作Cookies包括(读取添加与删除)
2012/12/26 Javascript
jQuery 网易相册鼠标移动显示隐藏效果实现代码
2013/03/31 Javascript
javascript使用正则获取url上的某个参数
2014/09/04 Javascript
12306验证码破解思路分享
2015/03/25 Javascript
JS+CSS实现仿msn风格选项卡效果代码
2015/10/22 Javascript
JavaScript判断图片是否已经加载完毕的方法汇总
2016/02/05 Javascript
巧方法 JavaScript获取超链接的绝对URL地址
2016/06/14 Javascript
微信小程序 新建登录页并实现tabBar隐藏
2017/06/13 Javascript
js断点调试经验分享
2017/12/08 Javascript
Angular父组件调用子组件的方法
2018/04/02 Javascript
vue.js中ref和$refs的使用及示例讲解
2019/08/14 Javascript
[51:11]2014 DOTA2国际邀请赛中国区预选赛5.21 LGD-CDEC VS DT
2014/05/22 DOTA
Python实现测试磁盘性能的方法
2015/03/12 Python
Python while、for、生成器、列表推导等语句的执行效率测试
2015/06/03 Python
Python实现信用卡系统(支持购物、转账、存取钱)
2016/06/24 Python
tensorflow 用矩阵运算替换for循环 用tf.tile而不写for的方法
2018/07/27 Python
python实现简易数码时钟
2021/02/19 Python
Python二叉树的镜像转换实现方法示例
2019/03/06 Python
Python实现的统计文章单词次数功能示例
2019/07/08 Python
python实现银行管理系统
2019/10/25 Python
Python中filter与lambda的结合使用详解
2019/12/24 Python
序列化Python对象的方法
2020/08/01 Python
python递归函数用法详解
2020/10/26 Python
HTML5之tabindex属性全面解析
2016/07/07 HTML / CSS
C语言编程题
2015/03/09 面试题
内业资料员岗位职责
2014/01/04 职场文书
社区七一党员活动方案
2014/01/25 职场文书
班级学习计划书
2014/04/27 职场文书
2014年国庆节广播稿
2014/09/19 职场文书
毕业生就业推荐表自我评价
2015/03/02 职场文书
Python scrapy爬取起点中文网小说榜单
2021/06/13 Python
Java面试题冲刺第十八天--Spring框架3
2021/08/07 面试题
js中Map和Set的用法及区别实例详解
2022/02/15 Javascript