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 相关文章推荐
javascript编程起步(第七课)
Jan 10 Javascript
js/jquery判断浏览器类型的方法小结
May 12 Javascript
JS给Textarea文本框添加行号的方法
Aug 20 Javascript
jQuery鼠标事件汇总
Aug 30 Javascript
如何判断Javascript对象是否存在的简单实例
May 18 Javascript
jQuery实现为LI列表前3行设置样式的方法【2种方法】
Sep 04 Javascript
jquery实现文字单行横移或翻转(上下、左右跳转)
Jan 08 Javascript
微信小程序 this和that详解及简单实例
Feb 13 Javascript
jQuery中DOM操作原则实例分析
Aug 01 jQuery
BootstrapValidator验证用户名已存在(ajax)
Nov 08 Javascript
vue 动态给每个页面添加title、关键词和描述的方法
Aug 28 Javascript
vue-router定义元信息meta操作
Dec 07 Vue.js
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 n个不重复的随机数生成代码
2009/06/23 PHP
php调用c接口无错版介绍
2014/03/11 PHP
PHP 5.3新增魔术方法__invoke概述
2014/07/23 PHP
PHP中file_exists()判断中文文件名无效的解决方法
2014/11/12 PHP
php中header设置常见文件类型的content-type
2015/06/23 PHP
Zend Framework实现将session存储在memcache中的方法
2016/03/22 PHP
thinkPHP删除前弹出确认框的简单实现方法
2016/05/16 PHP
浅谈Coreseek、Sphinx-for-chinaese、Sphinx+Scws的区别
2016/12/15 PHP
PHP的PDO错误与错误处理
2019/01/27 PHP
jQuery)扩展jQuery系列之一 模拟alert,confirm(一)
2010/12/04 Javascript
ExtJS DOM元素操作经验分享
2013/08/28 Javascript
JavaScript也谈内存优化
2014/06/06 Javascript
jQuery实现带延迟效果的滑动菜单代码
2015/09/02 Javascript
详解XMLHttpRequest(一)同步请求和异步请求
2016/09/14 Javascript
详解Javascript数据类型的转换规则
2016/12/12 Javascript
学习使用Bootstrap栅格系统
2017/05/11 Javascript
详解nodeJS之二进制buffer对象
2017/06/03 NodeJs
vue 将页面公用的头部组件化的方法
2017/12/18 Javascript
iview日期控件,双向绑定日期格式的方法
2018/03/15 Javascript
微信小程序wx.uploadfile 本地文件转base64的实现代码
2018/06/28 Javascript
在Vue中使用axios请求拦截的实现方法
2018/10/25 Javascript
js实现列表向上无限滚动
2020/01/13 Javascript
python将xml xsl文件生成html文件存储示例讲解
2013/12/03 Python
python中__call__内置函数用法实例
2015/06/04 Python
python实现字典(dict)和字符串(string)的相互转换方法
2017/03/01 Python
解决python xlrd无法读取excel文件的问题
2018/12/25 Python
pyqt5 QScrollArea设置在自定义侧(任何位置)
2019/09/25 Python
python图形开发GUI库pyqt5的基本使用方法详解
2020/02/14 Python
django使用多个数据库的方法实例
2021/03/04 Python
canvas绘制文本内容自动换行的实现代码
2019/01/14 HTML / CSS
法国美发器材和产品购物网站:Beauty Coiffure
2016/12/05 全球购物
德国价格合理的品牌商品购物网站:averdo
2019/03/21 全球购物
写好求职信第一句话的技巧
2013/10/26 职场文书
护理工作个人总结
2015/03/03 职场文书
冰雪公主观后感
2015/06/16 职场文书
2019同学聚会主持词
2019/05/06 职场文书