当你准备使用 jQuery,我强烈建议你遵循下面这些指南:

1. 缓存变量

DOM 遍历是昂贵的,所以尽量将会重用的元素缓存。

// 糟糕
h = $('#element').height();
$('#element').css('height', h-20); // 建议
$element = $('#element');
h = $element.height();
$element.css('height', h-20);

2. 避免全局变量

jQuery 与 javascript 一样,一般来说,最好确保你的变量在函数作用域内。

// 糟糕
$element = $('#element');
h = $element.height();
$element.css('height', h-20); // 建议
var $element = $('#element');
var h = $element.height();
$element.css('height', h-20);

3. 使用匈牙利命名法

在变量前加 $ 前缀,便于识别出 jQuery 对象。

// 糟糕
var first = $('#first');
var second = $('#second');
var value = $first.val(); // 建议 - 在 jQuery 对象前加 $ 前缀
var $first = $('#first');
var $second = $('#second'),
var value = $first.val();

4. 使用 var 链(单 var 模式)

将多条 var 语句合并为一条语句,我建议将未赋值的变量放到后面。

var
$first = $('#first'),
$second = $('#second'),
value = $first.val(),
k = 3,
cookiestring = 'SOMECOOKIESPLEASE',
i,
j,
myArray = {};

5. 请使用 'on'

在新版 jQuery 中,更短的 on("click") 用来取代类似 click() 这样的函数。 在之前的版本中 on() 就是 bind()。 自从 jQuery 1.7 版本后,on() 附加事件处理程序的首选方法。 然而,出于一致性考虑,你可以简单的全部使用 on() 方法。

// 糟糕
$first.click(function(){
$first.css('border','1px solid red');
$first.css('color','blue');
}); $first.hover(function(){
$first.css('border','1px solid red');
}) // 建议
$first.on('click',function(){
$first.css('border','1px solid red');
$first.css('color','blue');
}) $first.on('hover',function(){
$first.css('border','1px solid red');
})

6. 精简 javascript

一般来说,最好尽可能合并函数。

// 糟糕
$first.click(function(){
$first.css('border','1px solid red');
$first.css('color','blue');
}); // 建议
$first.on('click',function(){
$first.css({
'border':'1px solid red',
'color':'blue'
});
});

7. 链式操作

jQuery 实现方法的链式操作是非常容易的。 下面利用这一点。

// 糟糕
$second.html(value);
$second.on('click', function(){
alert('hello everybody');
});
$second.fadeIn('slow');
$second.animate({height:'120px'}, 500); // 建议
$second.html(value);
$second.on('click', function(){
alert('hello everybody');
}).fadeIn('slow').animate({height:'120px'}, 500);

8. 维持代码的可读性

伴随着精简代码和使用链式的同时,可能带来代码的难以阅读。 添加缩紧和换行能起到很好的效果。

// 糟糕
$second.html(value);
$second.on('click',function(){
alert('hello everybody');
}).fadeIn('slow').animate({height:'120px'},500); // 建议
$second.html(value);
$second
.on('click',function(){ alert('hello everybody');})
.fadeIn('slow')
.animate({height:'120px'},500);

9. 选择短路求值

短路求值是一个从左到右求值的表达式,用 &&(逻辑与)或 ||(逻辑或)操作符。

// 糟糕
function initVar($myVar) {
if(!$myVar) {
$myVar = $('#selector');
}
} // 建议
function initVar($myVar) {
$myVar = $myVar || $('#selector');
}

10. 选择捷径

精简代码的其中一种方式是利用编码捷径。

// 糟糕
if(collection.length > 0){..} // 建议
if(collection.length){..}

11. 繁重的操作中分离元素

如果你打算对 DOM 元素做大量操作(连续设置多个属性或 css 样式),建议首先分离元素然后在添加。

// 糟糕
var
$container = $("#container"),
$containerLi = $("#container li"),
$element = null; $element = $containerLi.first();
//... 许多复杂的操作 // 建议
var
$container = $("#container"),
$containerLi = $container.find("li"),
$element = null; $element = $containerLi.first().detach();
//... 许多复杂的操作 $container.append($element);

12. 熟记技巧

你可能对使用 jQuery 中的方法缺少经验,一定要查看的文档,可能会有一个更好或更快的方法来使用它。

// 糟糕
$('#id').data(key,value); // 建议 (高效)
$.data('#id',key,value);

13. 使用子查询缓存的父元素

正如前面所提到的,DOM 遍历是一项昂贵的操作。 典型做法是缓存父元素并在选择子元素时重用这些缓存元素。

// 糟糕
var
$container = $('#container'),
$containerLi = $('#container li'),
$containerLiSpan = $('#container li span'); // 建议 (高效)
var
$container = $('#container '),
$containerLi = $container.find('li'),
$containerLiSpan= $containerLi.find('span');

14. 避免通用选择符

将通用选择符放到后代选择符中,性能非常糟糕。

// 糟糕
$('.container > *'); // 建议
$('.container').children();

15. 避免隐式通用选择符

通用选择符有时是隐式的,不容易发现。

// 糟糕
$('.someclass :radio'); // 建议
$('.someclass input:radio');

16. 优化选择符

例如,id 选择符应该是唯一的,所以没有必要添加额外的选择符。

// 糟糕
$('div#myid');
$('div#footer a.myLink'); // 建议
$('#myid');
$('#footer .myLink');

17. 避免多个 ID 选择符

在此强调,ID 选择符应该是唯一的,不需要添加额外的选择符,更不需要多个后代 ID 选择符。

// 糟糕
$('#outer #inner'); // 建议
$('#inner');

18. 坚持最新版本

新版本通常更好:更轻量级,更高效。 显然,你需要考虑你要支持的代码的兼容性。 例如,2.0 版本不支持 ie 6/7/8。

19. 摒弃弃用方法

关注每个新版本的废弃方法是非常重要的并尽量避免使用这些方法。

// 糟糕 - live 已经废弃
$('#stuff').live('click', function() {
console.log('hooray');
}); // 建议
$('#stuff').on('click', function() {
console.log('hooray');
});
// 注:此处可能不当,应为live能实现实时绑定,delegate或许更合适

20. 利用 CDN

谷歌的 CND 能保证选择离用户最近的缓存并迅速响应。 (使用谷歌CND请自行搜索地址,此处地址以不能使用,推荐 jquery 官网提供的 CDN)。

(国内用户可以试试百度的 CDN:http://developer.baidu.com/wiki/index.php?title=docs/cplat/libs#jQuery

21. 必要时组合 jQuery 和 javascript 原生代码

如上所述,jQuery 就是 javascript,这意味着用 jQuery 能做的事情,同样可以用原生代码来做。 原生代码(或 vanilla)的可读性和可维护性可能不如 jQuery,而且代码更长。 但也意味着更高效(通常更接近底层代码可读性越差,性能越高,例如:汇编,当然需要更强大的人才可以)。 牢记没有任何框架能比原生代码更小,更轻,更高效(注:测试链接已失效,可上网搜索测试代码)。

鉴于 vanilla 和 jQuery 之间的性能差异,我强烈建议吸收两人的精华,使用(可能的话)和 jQuery 等价的原生代码

高效 jquery 的奥秘的更多相关文章

  1. 高效jQuery的奥秘

    讨论jQuery和javascript性能的文章并不罕见.然而,本文我计划总结一些速度方面的技巧和我本人的一些建议,来提升你的jQuery和javascript代码.好的代码会带来速度的提升.快速渲染 ...

  2. 探索高效jQuery的奥秘

    讨论jQuery和javascript性能的文章并不罕见.然而,本文我计划总结一些速度方面的技巧和我本人的一些建议,来提升你的jQuery和javascript代码.好的代码会带来速度的提升.快速渲染 ...

  3. jQuery的奥秘

    颜海镜 高效jQuery的奥秘 讨论jQuery和javascript性能的文章并不罕见.然而,本文我计划总结一些速度方面的技巧和我本人的一些建议,来提升你的jQuery和javascript代码.好 ...

  4. 高效jQuery

    1.缓存变量 DOM遍历是昂贵的,所以尽量将会重用的元素缓存. // 糟糕 h = $('#element').height(); $('#element').css('height',h-20); ...

  5. 高效JQuery编码

    缓存变量 DOM遍历是昂贵的,所以尽量将会重用的元素缓存. // 糟糕   h = $('#element').height(); $('#element').css('height',h-20); ...

  6. 给JavaScript初学者的24条最佳实践(转:http://www.cnblogs.com/yanhaijing/p/3465237.html)

    作为“30 HTML和CSS最佳实践”的后续,本周,我们将回顾JavaScript的知识 !如果你看完了下面的内容,请务必让我们知道你掌握的小技巧! 1.使用 === 代替 == JavaScript ...

  7. javascript小小技巧

    JS的一些小技巧,我主要是做后台的(.NET),前端知识了解得不多,经验非常有限,不过还是经常写JS代码,对前端有着浓厚的兴趣,特喜欢js这门语言,虽然很多人喷它,但还是很喜欢Js.下面说说项目中我经 ...

  8. HTML初学者的三十条最佳

    颜海镜 专注web前端,分享html,css,javascript等相关知识…… 给HTML初学者的三十条最佳实践 Nettuts +运营最困难的方面是为很多技能水平不同的用户提供服务.如果我们发布太 ...

  9. sql之T-SQL

    sql之T-SQL   下面就T-SQL的几个方面来分别讲解一下. 1.变量 要动态的写sql语句,就不能没有变量. 声明变量并赋值: 1 declare @i as int;--定义一个 int 类 ...

随机推荐

  1. 【网络流24题】No.11(航空路线问题 最长不相交路径 最大费用流)

    [题意] 给定一张航空图, 图中顶点代表城市, 边代表 2 城市间的直通航线. 现要求找出一条满足下述限制条件的且途经城市最多的旅行路线.(1) 从最西端城市出发,单向从西向东途经若干城市到达最东端城 ...

  2. 被忽视的eMMC——A1 SD Bench闪存测试

    一直以来,大家对手机的配置方面都比较关注CPU和GPU的架构.频率.核心数等,却经常忽略了手机闪存的速度.实际上手机的闪存素质对手机日常操作的响应.载入速度同样起到举足轻重的影响,今天给大家介绍的则是 ...

  3. elevation 和 translationZ的区别

    Z轴阴影: Z = elevation + translationZ elevation 是静态值,是View在Z轴上的初始值 translationZ是动态值,是Z上的偏移变化 参考 http:// ...

  4. 【CF】283D Tennis Game

    枚举t加二分判断当前t是否可行,同时求出s.注意不能说|a[n]| <= |3-a[n]|就证明无解,开始就是wa在这儿了.可以简单想象成每当a[n]赢的时候,两人都打的难解难分(仅多赢一轮): ...

  5. IIS支持net.tcp

    绑定 高级设置  http和net.tcp用逗号分隔 //擦擦擦,见鬼了,下面的是tcp.net导致我找了好久,都找不出这个错误 //一定要注意,不要写错了. 否则会收到提示:找不到具有绑定 NetT ...

  6. bzoj1232

    由题意知,最后要保留的边肯定都要被走过 来回一条边所花费的时间=2*边长+安慰边两端的牛所要花的时间和 总时间就等于所保留边来回的时间和+根节点时间: 不难想到做一下最小生成树即可 贪心可知,根一定选 ...

  7. BZOJ1935: [Shoi2007]Tree 园丁的烦恼

    1935: [Shoi2007]Tree 园丁的烦恼 Time Limit: 15 Sec  Memory Limit: 357 MBSubmit: 552  Solved: 220[Submit][ ...

  8. 如何将数据库中已有表导入到powerDesigner生成pdm文件

    1.create new PDM: 2.select database menu; 3.click Reverse  Engineer database :4.then choose your scr ...

  9. 如何让虚拟目录里面的webconfig不继承网站的设置

    在一个网站 中国红木网 下 建一个虚拟目录,结果虚拟目录系统会调用 中国红木网 上的web.config, 在网上找到以下解决方案 在(如根目录)所在的Web.config加上 如:<locat ...

  10. bayer图像格式

    Bayer数据,其一般格式为:奇数扫描行输出 RGRG……偶数扫描行输出 GBGB…… 根据人眼对彩色的响应带宽不高的大面积着色特点,每个像素没有必要同时输出3种颜色.因此,数据采样时, 奇数扫描行的 ...