本文提供即刻提升你的脚本性能的十个步骤。不用担心,这并不是什么高深的技巧。人人皆可运用!这些技巧包括:
- 使用最新版本
 
- 合并、最小化脚本
 
- 用for替代each
 
- 用ID替代class选择器
 
- 给选择器指定前后文
 
- 建立缓存
 
- 避免DOM操作
 
- 避免使用concat(),利用join()处理长字串
 
- 返回false值
 
- 利用小抄和参考文档
 
使用最新版本
jQuery一直处于不断的开发和改进过程中。 John 和他的团队不断研究着提升程序性能的新方法。
一点题外话,几个月前他还发布了Sizzle,一个据说能在Firefox中把程序性能提升3倍的JS选择器库。
如果你不想时刻关注是否有新版本,然后再花时间下载上传,Google 就又能帮你一把了。他们的服务器上存储了大量Ajax库供您选择。
01 | 
<!-- 利用一个简单的script标签调用API --> | 
 
03 | 
<script type="text/javascript"> | 
 
04 | 
/* 加载 jQuery v1.3.2 */ | 
 
05 | 
google.load ("jquery", "1.3.2", {uncompressed: false}); | 
 
09 | 
alert ("jQuery + Google API!"); | 
 
12 | 
google.setOnLoadCallback (onLoad); | 
 
 
 
另一个更为简单快速的方法是直接使用脚本链接。如果要使用特定版本的jQuery,你可以使用上面的方法;如果想直接使用最新版,下面这句代码就够了:
特定版本的还可以这样加载:
合并、最小化脚本
大部分浏览器都不能同时处理多个脚本文件,所以它们都是排队加载——加载时间也相应地延长了。
考虑到你网站的每个页面都会加载这些脚本,你应该考虑把它们放到单个文件中,然后利用压缩工具(比如 Dean Edwards 的这款)把它们最小化。更小的文件无疑将带来更快的加载速度。
JavaScript和CSS压缩的目的是在保持脚本的执行性能的同时,减少数据传递的字节数(可以通过减小原始文件,也可以利用gzip。大多数产品级的网络服务器都把gzip作为HTTP协议的一部分)。引自 YUI compressor,一款 jQuery官方推荐的压缩脚本的工具。
用for替代each
原生函数总是比辅助组件更快。
如果遇到需要遍历对象的情况(如从远程接收的JSON对象),你最好重写你的(JSON)对象为一个数组,数组的循环处理要容易些。
利用Firebug,我们能测定每个函数的执行时间。
1 | 
var array = new Array (); | 
 
2 | 
for (var i=0; i<10000; i++) { | 
 
5 | 
console.time('native');  //原生for函数 | 
 
7 | 
for (var i=0; i<10000; i++) { | 
 
 
 

上面的结果显示原生代码只需2毫秒就做到的事,利用jQuery的each方法需要26毫秒。而且这还只是我在本机上测试一个基本上啥也没做的函数的结果,当遇到更复杂的情况,例如设置css属性或DOM操作时,时间差异肯定更大。
用ID替代class选择器
利用ID选择对象要好得多,因为这时jQuery会使用浏览器的原生函数getElementByID()来获取对象,查询速度很快。
因此,比起利用那些方便的css选择技巧,使用更为复杂的选择器也是值得的(jQuery也为我们提供了复杂选择器)。你也可以手工书写自己的选择器(其实比你想象中简单),或者为你想要选择的元素指定一个有ID的容器。
05 | 
console.time('class'); | 
 
06 | 
var list = $('#list'); | 
 
10 | 
for (i=0; i<1000; i++) { | 
 
24 | 
for (i=0; i<1000; i++) { | 
 
25 | 
var s = $('.item' + i); | 
 
27 | 
console.timeEnd('class'); | 
 
31 | 
var list = $('#list'); | 
 
35 | 
for (i=0; i<1000; i++) { | 
 
49 | 
for (i=0; i<1000; i++) { | 
 
50 | 
var s = $('#item' + i); | 
 
52 | 
console.timeEnd('id'); | 
 
 
 
上面的例子很好地说明了不同选择方式之间的显著性能差异。请看下图,利用class来做选择,时间无限增大,甚至超过了五秒。
给选择器指定前后文
jQuery的参考文档里说:传递给jQuery() 原始DOM节点的前后文(如果没有东西被传递,则前后文为整个文档)。目的是连同选择器一起,实现更为准确的查询。
所以,如果你一定要利用class来指定目标,至少为选择器指定上下文,以免jQuery费精力去遍历整个DOM文档:
与其这样写:
1 | 
$('.class').css ('color' '#123456'); | 
 
 
 
为选择器加上前后文比较好(expression: 目标选择器;context: 前后文):
也就是说:
1 | 
$('.class', '#class-container').css ('color', '#123456'); | 
 
 
 
这样做要快得多,因为它不用遍历整个DOM。只要找到#class-container就好了。
建立缓存
不要犯不断重新选择同一个东西的错误。你应该把你要处理的元素缓存为一个变量。
更不要在一个循环里重复选择同一个元素!这样做十分影响速度!
01 | 
$('#item').css('color', '#123456'); | 
 
02 | 
$('#item').html('hello'); | 
 
03 | 
$('#item').css('background-color', '#ffffff'); | 
 
06 | 
$('#item').css('color', '#123456').html('hello').css('background-color', '#ffffff'); | 
 
09 | 
var item = $('#item'); | 
 
10 | 
item.css('color', '#123456'); | 
 
12 | 
item.css('background-color', '#ffffff'); | 
 
15 | 
console.time('no cache'); | 
 
16 | 
for (var i=0; i<1000; i++) { | 
 
19 | 
console.timeEnd('no cache'); | 
 
22 | 
console.time('cache'); | 
 
23 | 
var item = $('#list'); | 
 
25 | 
for (var i=0; i<1000; i++) { | 
 
28 | 
console.timeEnd('cache'); | 
 
 
 
避免DOM操作
DOM操作应该越少越好,因为诸如prepend(),append(),after()的插入动作都很费时。上面的例子如果用html()会更快:
03 | 
for (var i=0; i<1000; i++) { | 
 
11 | 
('#list').html (list); | 
 
 
 
避免使用concat(),利用join()处理长字串
听起来可能挺奇怪,不过这样做真的能提升速度,尤其是当连接特别长的字串时。先建立一个数组,放入你想要串联的东西。join()方法比字符串的concat()函数要快得多。
2 | 
for (var i=0; i< =10000; i++) { | 
 
7 | 
$('#list').html(array.join ('')); | 
 
 
 
“ += 操作符更快——比把字串片段放到数组中然后join起来还要快”,“作为字串缓冲(string buffer)的数组在大部分浏览器中都比string.prototype.concat.apply方法效率更高,Windows下的Firefox 2.0.0.14例外。” — Tom Trenka
返回false值
您可能已经注意到,如果函数执行后不返回false,你就会被跳转到页面顶部。如果页面较长,这种反应是很烦人的。
所以,与其这样:
1 | 
$('#item').click (function () { | 
 
 
 
不如多加一句:
1 | 
$('#item').click (function () { | 
 
 
 												
												
								- 十个迅速提升JQuery性能的技巧
		
本文提供即刻提升你的脚本性能的十个步骤.不用担心,这并不是什么高深的技巧.人人皆可运用!这些技巧包括: 使用最新版本 合并.最小化脚本 用for替代each 用ID替代class选择器 给选择器指定前 ...
		 
						- jQuery 性能优化技巧
		
原文地址:jQuery 性能优化技巧 博客地址:http://www.extlight.com 一.使用最新版本 jQuery 类库 二.合理使用选择器 # 推荐使用 $("#id" ...
		 
						- 提升Web性能的8个技巧总结
		
提升Web性能的8个技巧总结 在互联网盛行的今天,越来越多的在线用户希望得到安全可靠并且快速的访问体验.针对Web网页过于膨胀以及第三脚本蚕食流量等问题,Radware向网站运营人员提出以下改进建议, ...
		 
						- jQuery性能优化和技巧
		
jQuery性能优化 ①使用最新版本的jQuery类库 ②使用合适的选择器 ③缓存对象 ④循环时的DOM操作 ⑤数组方式使用jQuery对象 ⑥事件代理 ⑦将你的代码转化成jQuery插件 ⑧使用jo ...
		 
						- jQuery性能优化的28个建议
		
我一直在寻找有关jQuery性能优化方面的小窍门,能让我那臃肿的动态网页应用变得轻便些.找了很多文章后,我决定将最好最常用的一些优化性能的建议列出来.我也做了一个jQuery性能优化的简明样式表,你可 ...
		 
						- HHVM 是如何提升 PHP 性能的?
		
背景 HHVM 是 Facebook 开发的高性能 PHP 虚拟机,宣称比官方的快9倍,我很好奇,于是抽空简单了解了一下,并整理出这篇文章,希望能回答清楚两方面的问题: HHVM 到底靠谱么?是否可以 ...
		 
						- jQuery:jQuery性能优化28条建议
		
http://www.xue5.com/WebDev/jQuery/671700.html 直在寻找有关jQuery性能优化方面的小窍门,能让我那臃肿的动态网页应用变得轻便些.找了很多文章后,我决定将 ...
		 
						- 28个jQuery性能优化的建议
		
我一直在寻找有关jQuery性能优化方面的小窍门,能让我那臃肿的动态网页应用变得轻便些.找了很多文章后,我决定将最好最常用的一些优化性能的建议列出来.我也做了一个jQuery性能优化的简明样式表,你可 ...
		 
						- [.net 面向对象程序设计进阶] (15) 缓存(Cache)(二) 利用缓存提升程序性能
		
[.net 面向对象程序设计进阶] (15) 缓存(Cache)(二) 利用缓存提升程序性能 本节导读: 上节说了缓存是以空间来换取时间的技术,介绍了客户端缓存和两种常用服务器缓布,本节主要介绍一种. ...
		 
		
	
随机推荐
	
									- 关于浏览器对静态HTML页面的缓存问题
			
症状: 刚才为了测试TOMCAT的BASIC安全验证,修改了tomcat-users.xml和/WEB-INF/web.xml之后进行测试,<url-pattern>/*<url-p ...
			 
						- 高德地图API INVALID_USER_SCODE问题以及keystore问题
			
今天这篇文章会给大家介绍三个问题: 1,接入API时出现invalid_user_scode问题 首先进行第一个大问题,接入高德地图API时出现invalid_user_scode问题 因为项目需要接 ...
			 
						- 10个Python 统计报表/图表图形类库
			
matplotlib,官网:http://matplotlib.sourceforge.net/,Matplotlib 是一个由 John Hunter 等开发的,用以绘制二维图形的 Python 模 ...
			 
						- EMC、Pure和NetApp推新品,NAS闪存场景在哪里
			
Hardy 架构师技术联盟 All Flash/SSD存储的趋势势不可挡,未来在NAS服务上也是如此,眼下已经有非常多家初创厂商支持全SSD的NAS存储服务,包含EMC Isilion也推出了全闪存节 ...
			 
						- 在 Java 8 中获取日期
			
前言 前面一篇文章写了<SimpleDateFormat 如何安全的使用?>, 里面介绍了 SimpleDateFormat 如何处理日期/时间,以及如何保证线程安全,及其介绍了在 Jav ...
			 
						- fmpeg
			
			
 
						- JS 拖动原理
			
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
			 
						- google cloud之查看任务任务过程
			
点击侧边栏的logging
			 
						- 敏捷软件开发实践-Sprint Retrospective Meeting(转)
			
介绍: 在敏捷开发模式中,Sprint Retrospective Meeting 也是一个必不可少的环节,它通常发生在每个Sprint的结尾,其主要作用是对于当前的迭代周期做一个阶段性的总结,包括好 ...
			 
						- 【BZOJ】1621: [Usaco2008 Open]Roads Around The Farm分岔路口(dfs)
			
http://www.lydsy.com/JudgeOnline/problem.php?id=1621 这题用笔推一下就懂了的.... 当2|(n-k)时,才能分,否则不能分. 那么dfs即可..  ...