本文提供即刻提升你的脚本性能的十个步骤。不用担心,这并不是什么高深的技巧。人人皆可运用!这些技巧包括: 
使用最新版本 
合并、最小化脚本 
用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++) { 

 
上面的结果显示原生代码只需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的一个以前的误导的更多相关文章

  1. 用jQuery做一个三级菜单,鼠标移动到二级菜单的选项上,然后再迅速离开后,当鼠标再移动到该一级菜单或其他二级菜单选项,三级菜单也会显示。

    用jQuery做一个三级菜单,鼠标移动到二级菜单的选项上,然后再迅速离开后,当鼠标再移动到该一级菜单或其他二级菜单选项,三级菜单也会显示. 原因:在为一个元素绑定hover事件之后,用户把光标移入元素 ...

  2. 用jQuery判断一个元素的各种状态

    用jQuery判断一个元素是否显示   用jQuery判断一个元素是否显示:$(element).is(":visible"); 类似的,判断一个元素是不是第一个子元素:$(ele ...

  3. 无意发现vim里插入模式可以借助Alt键输入一些特殊字符

    无意发现vim里插入模式可以借助Alt键输入一些特殊字符.如: Alt+w: ÷ Alt+:: » Alt+f  :  æ Alt+ . :  ® Alt+ ? :  ¯...

  4. 类似jquery的一个demo

    通过以下的demo,可以大体知道jquery的一些组织结构以及一些实现方法. 实际上jquery就是一个全局变量,只是在这个变量上添加了各种属性和方法. 首先我们要理解什么是匿名函数自执行,简单点就是 ...

  5. 用Jquery做一个时间日期选择器

    今天我们就用Jquery做一个时间日期选择器,当打开网页时,文本框里面显示的是当前的日期,点击文本框可以出现年.月.日的下拉菜单,并且可以选择,会根据年份的选择判断是否是闰年,从而改变二月的天数,闰年 ...

  6. 发现DELL笔记本一个很弱智的问题

    以前用联想的笔记本,最近联想笔记本坏了,用的是公司的DELL笔记本,发现DELL笔记本一个很弱智的问题. 关于禁用触摸板的问题. 起因: 由于要经常写程序,我配置的有有线鼠标,但是打字时经常碰到触摸板 ...

  7. 利用js和JQuery定义一个导航条菜单

    利用js和JQuery定义一个导航条 效果: 一.html代码: <div class="Maintenance"> <div class="Title ...

  8. jQuery生成一个DIV容器,ID是"rating".

    我们需要一些服务器端代码,这个例子中用到了一个PHP文件,读取rating参数然后返回rating总数和平均数.看一下rate.php代码.虽然这些例子也可以不使用AJAX来实现,但显示我们不会那么做 ...

  9. 利用HttpWebRequest模拟表单提交 JQuery 的一个轻量级 Guid 字符串拓展插件. 轻量级Config文件AppSettings节点编辑帮助类

    利用HttpWebRequest模拟表单提交   1 using System; 2 using System.Collections.Specialized; 3 using System.IO; ...

随机推荐

  1. C#中(int)、int.Parse()、int.TryParse()和Convert.ToInt32()的区别

    转自:http://www.cnblogs.com/leolis/p/3968943.html 在编程过程中,数据转换是经常要用到的,C#中数据转换的方法很多,拿将目标对象转换为 整型(int)来讲, ...

  2. convert与int.parse int

    1,convert :适合将object 转换 int:简单数据转换 int.parse:将string类型转换为int 2,convert:对于空值返回0 不会报异常 int.parse:将会抛出异 ...

  3. defer 和 async 本地对象和宿主对象

    <script async></script> 没有defer和async的情况下是"同步执行"的,浏览器解析到这里的时候,会先加载资源完成后立即执行,并阻 ...

  4. php获得http头部信息的方法

    $url = 'http://www.baidu.com'; $fp = fopen($url, 'r'); $meta_data = stream_get_meta_data($fp); var_d ...

  5. mockito使用心得

    前提:pom引用<dependency> <groupId>junit</groupId> <artifactId>junit</artifact ...

  6. 关于web.config中<customErrors>节点说明

    <customErrors>节点用于定义一些自定义错误信息的信息.此节点有Mode和defaultRedirect两个属性,其中defaultRedirect属性是一个可选属性,表示应用程 ...

  7. Online, Asynchronous Schema Change in F1

    F1: A Distributed SQL Database That Scales   http://disksing.com/understanding-f1-schema-change   ma ...

  8. Android LayoutInflater详解

      在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById().不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且 ...

  9. 好用的Markdown编辑器一览

    Markdown 是一种简单的.轻量级的标记语法.用户可以使用诸如 * # 等简单的标记符号以最小的输入代价生成极富表现力的文档. Markdown具有很多优点: 写作中添加简单符号即完成排版,所见即 ...

  10. as3绕过策略文件给视频截图

    接上篇 http://www.cnblogs.com/DarkMaster/p/5973593.html 这篇同样是在老外博客上找到的,分享给大家,再次感叹老外牛逼啊. 原文地址:http://gam ...