十个迅速提升JQuery性能让你的JQuery跑得更快


Posted in Javascript onDecember 10, 2012

本文提供即刻提升你的脚本性能的十个步骤。不用担心,这并不是什么高深的技巧。人人皆可运用!这些技巧包括:
使用最新版本
合并、最小化脚本
用for替代each
用ID替代class选择器
给选择器指定前后文
建立缓存
避免DOM操作
避免使用concat(),利用join()处理长字串
返回false值
利用小抄和参考文档
使用最新版本
jQuery一直处于不断的开发和改进过程中。 John 和他的团队不断研究着提升程序性能的新方法。
一点题外话,几个月前他还发布了Sizzle,一个据说能在Firefox中把程序性能提升3倍的JS选择器库。
如果你不想时刻关注是否有新版本,然后再花时间下载上传,Google 就又能帮你一把了。他们的服务器上存储了大量Ajax库供您选择。

<!-- 利用一个简单的script标签调用API --> 
<script type="text/javascript" src="http://www.google.com/jsapi"></script> 
<script type="text/javascript"> 
/* 加载 jQuery v1.3.2 */ 
google.load ("jquery", "1.3.2", {uncompressed: false}); 
/* 加载完成后弹出消息 */ 
function onLoad () { 
alert ("jQuery + Google API!"); 
} 
google.setOnLoadCallback (onLoad); 
</script>

另一个更为简单快速的方法是直接使用脚本链接。如果要使用特定版本的jQuery,你可以使用上面的方法;如果想直接使用最新版,下面这句代码就够了:
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.js"></script>

特定版本的还可以这样加载:
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>

合并、最小化脚本
大部分浏览器都不能同时处理多个脚本文件,所以它们都是排队加载——加载时间也相应地延长了。
考虑到你网站的每个页面都会加载这些脚本,你应该考虑把它们放到单个文件中,然后利用压缩工具(比如 Dean Edwards 的这款)把它们最小化。更小的文件无疑将带来更快的加载速度。
JavaScript和CSS压缩的目的是在保持脚本的执行性能的同时,减少数据传递的字节数(可以通过减小原始文件,也可以利用gzip。大多数产品级的网络服务器都把gzip作为HTTP协议的一部分)。引自 YUI compressor,一款 jQuery官方推荐的压缩脚本的工具。
用for替代each
原生函数总是比辅助组件更快。
如果遇到需要遍历对象的情况(如从远程接收的JSON对象),你最好重写你的(JSON)对象为一个数组,数组的循环处理要容易些。
利用Firebug,我们能测定每个函数的执行时间。
var array = new Array (); 
for (var i=0; i<10000; i++) { 
array[i] = 0; 
} 
console.time('native'); //原生for函数 
var l = array.length; 
for (var i=0; i<10000; i++) { 
}

十个迅速提升JQuery性能让你的JQuery跑得更快 
上面的结果显示原生代码只需2毫秒就做到的事,利用jQuery的each方法需要26毫秒。而且这还只是我在本机上测试一个基本上啥也没做的函数的结果,当遇到更复杂的情况,例如设置css属性或DOM操作时,时间差异肯定更大。
用ID替代class选择器
利用ID选择对象要好得多,因为这时jQuery会使用浏览器的原生函数getElementByID()来获取对象,查询速度很快。
因此,比起利用那些方便的css选择技巧,使用更为复杂的选择器也是值得的(jQuery也为我们提供了复杂选择器)。你也可以手工书写自己的选择器(其实比你想象中简单),或者为你想要选择的元素指定一个有ID的容器。
//下例创建一个列表并且填充条目内容 
//然后每个条目都被选择一次 
//首先使用class选择 
console.time('class'); 
var list = $('#list'); 
var items = ' 
'; 
for (i=0; i<1000; i++) { 
items += ' 
item 
'; 
} 
items += ' 
'; 
list.html (items); 
for (i=0; i<1000; i++) { 
var s = $('.item' + i); 
} 
console.timeEnd('class'); 
//然后利用ID选择 
console.time('id'); 
var list = $('#list'); 
var items = ' 
'; 
for (i=0; i<1000; i++) { 
items += ' 
item 
'; 
} 
items += ' 
'; 
list.html (items); 
for (i=0; i<1000; i++) { 
var s = $('#item' + i); 
} 
console.timeEnd('id');

上面的例子很好地说明了不同选择方式之间的显著性能差异。请看下图,利用class来做选择,时间无限增大,甚至超过了五秒。
给选择器指定前后文
jQuery的参考文档里说:传递给jQuery() 原始DOM节点的前后文(如果没有东西被传递,则前后文为整个文档)。目的是连同选择器一起,实现更为准确的查询。
所以,如果你一定要利用class来指定目标,至少为选择器指定上下文,以免jQuery费精力去遍历整个DOM文档:
与其这样写:
$('.class').css ('color' '#123456');

为选择器加上前后文比较好(expression: 目标选择器;context: 前后文):
$(expression, context)

也就是说:
$('.class', '#class-container').css ('color', '#123456');

这样做要快得多,因为它不用遍历整个DOM。只要找到#class-container就好了。
建立缓存
不要犯不断重新选择同一个东西的错误。你应该把你要处理的元素缓存为一个变量。
更不要在一个循环里重复选择同一个元素!这样做十分影响速度!
$('#item').css('color', '#123456'); 
$('#item').html('hello'); 
$('#item').css('background-color', '#ffffff'); 
// 这样写更好 
$('#item').css('color', '#123456').html('hello').css('background-color', '#ffffff'); 
// 甚至这样 
var item = $('#item'); 
item.css('color', '#123456'); 
item.html('hello'); 
item.css('background-color', '#ffffff'); 
// 遇到循环,这样做非常不好 
console.time('no cache'); 
for (var i=0; i<1000; i++) { 
$('#list').append(i); 
} 
console.timeEnd('no cache'); 
// 下面这样要好得多 
console.time('cache'); 
var item = $('#list'); 
for (var i=0; i<1000; i++) { 
item.append (i); 
} 
console.timeEnd('cache');

避免DOM操作
DOM操作应该越少越好,因为诸如prepend(),append(),after()的插入动作都很费时。上面的例子如果用html()会更快:
var list = ''; 
for (var i=0; i<1000; i++) { 
list += ' 
'+i+' 
'; 
} 
('#list').html (list);

避免使用concat(),利用join()处理长字串
听起来可能挺奇怪,不过这样做真的能提升速度,尤其是当连接特别长的字串时。先建立一个数组,放入你想要串联的东西。join()方法比字符串的concat()函数要快得多。
var array = []; 
for (var i=0; i< =10000; i++) { 
array[i] = ' 
'+i+''; 
} 
$('#list').html(array.join (''));

“ += 操作符更快——比把字串片段放到数组中然后join起来还要快”,“作为字串缓冲(string buffer)的数组在大部分浏览器中都比string.prototype.concat.apply方法效率更高,Windows下的Firefox 2.0.0.14例外。” — Tom Trenka
返回false值
您可能已经注意到,如果函数执行后不返回false,你就会被跳转到页面顶部。如果页面较长,这种反应是很烦人的。
所以,与其这样:
$('#item').click (function () { 
// stuff here 
});

不如多加一句:
$('#item').click (function () { 
// stuff here 
return false; 
});

额外小贴士 ? 小抄和参考文档
十个迅速提升JQuery性能让你的JQuery跑得更快 
这条建议并不直接提升函数的执行速度,不过如果你肯花时间在这上面,研究研究这些小抄和参考文档,你将来定能节约很多时间。
请在手边随时放一张小抄以作快速参考。
Javascript 相关文章推荐
最常用的12种设计模式小结
Aug 09 Javascript
php与js的区别是什么
Aug 05 Javascript
屏蔽script注入小例子
Nov 12 Javascript
Node.js数据库操作之连接MySQL数据库(一)
Mar 04 Javascript
node文件上传功能简易实现代码
Jun 16 Javascript
JavaScript与Java正则表达式写法的区别介绍
Aug 15 Javascript
jQuery实现可兼容IE6的遮罩功能详解
Sep 19 jQuery
async/await优雅的错误处理方法总结
Jan 30 Javascript
Nuxt.js实现一个SSR的前端博客的示例代码
Sep 06 Javascript
node.js使用zlib模块进行数据压缩和解压操作示例
Feb 12 Javascript
基于vue中的scoped坑点解说
Sep 04 Javascript
quickjs 封装 JavaScript 沙箱详情
Nov 02 Javascript
JQuery each()函数如何优化循环DOM结构的性能
Dec 10 #Javascript
jquery的$getjson调用并获取远程的JSON字符串问题
Dec 10 #Javascript
如何用ajax来创建一个XMLHttpRequest对象
Dec 10 #Javascript
iframe 上下滚动条如何默认在下方实现原理
Dec 10 #Javascript
Ajax执行顺序流程及回调问题分析
Dec 10 #Javascript
js切换div css注意的细节
Dec 10 #Javascript
不同的jQuery API来处理不同的浏览器事件
Dec 09 #Javascript
You might like
php.ini中的php-5.2.0配置指令详解
2008/03/27 PHP
114啦源码(114la)不能生成地方房产和地方报刊问题4级页面0字节的解决方法
2012/01/12 PHP
php使用异或实现的加密解密实例
2013/09/04 PHP
CI框架中zip类应用示例
2014/06/17 PHP
解决PHP程序运行时:Fatal error: Maximum execution time of 30 seconds exceeded in的错误提示
2016/11/25 PHP
PHP中$GLOBALS['HTTP_RAW_POST_DATA']和$_POST的区别分析
2017/07/03 PHP
一段实现页面上的图片延时加载的js代码
2010/02/11 Javascript
JQuery对class属性的操作实现按钮开关效果
2013/10/11 Javascript
javascript框架设计之种子模块
2015/06/23 Javascript
js实现仿阿里巴巴城市选择框效果实例
2015/06/24 Javascript
原生JavaScript编写canvas版的连连看游戏
2016/05/29 Javascript
JS实现类似百叶窗下拉菜单效果
2016/12/30 Javascript
vue路由守卫+登录态管理实例分析
2019/05/21 Javascript
echarts实现折线图的拖拽效果
2019/12/19 Javascript
解决微信授权成功后点击按返回键出现空白页和报错的问题
2020/06/08 Javascript
webstorm建立vue-cli脚手架的傻瓜式教程
2020/09/22 Javascript
JavaScript 实现轮播图特效的示例
2020/11/05 Javascript
[56:41]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 Newbee vs OG
2018/04/01 DOTA
举例讲解Python程序与系统shell交互的方式
2015/04/09 Python
Sanic框架请求与响应实例分析
2018/07/16 Python
Python单元和文档测试实例详解
2019/04/11 Python
Django工程的分层结构详解
2019/07/18 Python
关于python中plt.hist参数的使用详解
2019/11/28 Python
用Python去除图像的黑色或白色背景实例
2019/12/12 Python
python实现的批量分析xml标签中各个类别个数功能示例
2019/12/30 Python
Python描述符descriptor使用原理解析
2020/03/21 Python
英语系毕业生自荐信
2013/10/31 职场文书
护理毕业生自荐信范文
2013/12/22 职场文书
建筑设计学生的自我评价
2014/01/16 职场文书
网上签名寄语活动留言
2014/01/18 职场文书
《诺贝尔》教学反思
2014/02/17 职场文书
经营管理策划方案
2014/05/22 职场文书
税务干部个人整改措施思想汇报
2014/10/10 职场文书
党支部书记岗位职责
2015/02/15 职场文书
红领巾广播站广播稿
2015/08/19 职场文书
如何做好员工培训计划?
2019/07/09 职场文书