这是一篇关于jQuery的文章,写到这里给初学者一些建议。
原文地址:http://flippinawesome.org/2013/11/25/writing-better-jquery-code/
现在已经有很多文章讨论jQuery和JavaScript的性能问题,然而,在这篇文章中我计划总结一些提升速度的技巧和一些我自己的建议来改善你的jQuery和JavaScript代码。更好的代码意味着更快的应用程序,快速渲染和反应性意味着一个更好的用户体验。
首先,我们要记住最重要的一点是:jQuery也是javascript,也就是意味着我们要对jQuery和javascript使用相同的编码规则和风格指南,还有最佳实践。
另外,如果你是一个javascript的初学者,那么我建议你在开始jQuery之前看一下JavaScript best practices for beginners 和 writing high quality JavaScript这两篇文章。
如果你已经开始使用jQuery了,那么我强烈建议遵守下面的建议:
缓存变量
DOM的遍历是非常昂贵的,所以尽量缓存一些可能会被重新用到的变量。
1 // bad
2
3 h = $('#element').height();
4 $('#element').css('height',h-20);
5
6 // good
7
8 $element = $('#element');
9 h = $element.height();
10 $element.css('height',h-20);
避免全局变量
使用jQuery和使用javascript一样,最好确保你的变量在你的函数作用域内。
1 // bad
2
3 $element = $('#element');
4 h = $element.height();
5 $element.css('height',h-20);
6
7 // good
8
9 var $element = $('#element');
10 var h = $element.height();
11 $element.css('height',h-20);
使用匈牙利命名法
在变量前加上一个$符号,很容易看出来这是一个jQuery变量。
1 // bad
2
3 var first = $('#first');
4 var second = $('#second');
5 var value = first.val();
6
7 // better - we use to put $ symbol before jQuery-manipulated objects
8
9 var $first = $('#first');
10 var $second = $('#second'),
11 var value = $first.val();
使用 Var 链(单 Var 模式)
不要使用多个var声明,可以将它们合并为一个var声明,建议将没有指定值的变量放在最后。
1 var
2 $first = $('#first'),
3 $second = $('#second'),
4 value = $first.val(),
5 k = 3,
6 cookiestring = 'SOMECOOKIESPLEASE',
7 i,
8 j,
9 myArray = {};
最好使用on 绑定事件
最新版本的jQuery已经将click()改变为函数on('click')的简写。在之前的版本中实现的不同,click()简写bind()。在jQuery 1.7中,on()是首选方法用于附加事件处理程序。然而,对于一致性可以简单地使用on()。
1 // bad
2
3 $first.click(function(){
4 $first.css('border','1px solid red');
5 $first.css('color','blue');
6 });
7
8 $first.hover(function(){
9 $first.css('border','1px solid red');
10 })
11
12 // better
13 $first.on('click',function(){
14 $first.css('border','1px solid red');
15 $first.css('color','blue');
16 })
17
18 $first.on('hover',function(){
19 $first.css('border','1px solid red');
20 })
压缩精简javascript
一般来说,我们要尽可能的合并函数
1 // bad
2
3 $first.click(function(){
4 $first.css('border','1px solid red');
5 $first.css('color','blue');
6 });
7
8 // better
9
10 $first.on('click',function(){
11 $first.css({
12 'border':'1px solid red',
13 'color':'blue'
14 });
15 });
使用链式操作
根据上面的规则,jQuery很容易将方法链接在一起,我们要利用这一优点。
1 // bad
2
3 $second.html(value);
4 $second.on('click',function(){
5 alert('hello everybody');
6 });
7 $second.fadeIn('slow');
8 $second.animate({height:'120px'},500);
9
10 // better
11
12 $second.html(value);
13 $second.on('click',function(){
14 alert('hello everybody');
15 }).fadeIn('slow').animate({height:'120px'},500);
保持代码的可读性
当精简了javascript代码和使用了链式操作,你的代码有时候会变得不可读,尽量使用缩进和换行使代码变得漂亮些。
1 // bad
2
3 $second.html(value);
4 $second.on('click',function(){
5 alert('hello everybody');
6 }).fadeIn('slow').animate({height:'120px'},500);
7
8 // better
9
10 $second.html(value);
11 $second
12 .on('click',function(){ alert('hello everybody');})
13 .fadeIn('slow')
14 .animate({height:'120px'},500);
使用短路求值
短路求值是一个从左到右求值的表达式,用 &&(逻辑与)或 || (逻辑或)操作符。
1 // bad
2
3 function initVar($myVar) {
4 if(!$myVar) {
5 $myVar = $('#selector');
6 }
7 }
8
9 // better
10
11 function initVar($myVar) {
12 $myVar = $myVar || $('#selector');
13 }
使用快捷的方式
精简代码的方式之一就是利用一些编码捷径。
1 // bad
2
3 if(collection.length > 0){..}
4
5 // better
6
7 if(collection.length){..}
复杂的操作要分离元素
如果对DOM元素做大量操作(连续设置多个属性或css样式),建议首先分离元素然后在添加。
1 // bad
2
3 var
4 $container = $("#container"),
5 $containerLi = $("#container li"),
6 $element = null;
7
8 $element = $containerLi.first();
9 //... a lot of complicated things
10
11 // better
12
13 var
14 $container = $("#container"),
15 $containerLi = $container.find("li"),
16 $element = null;
17
18 $element = $containerLi.first().detach();
19 //...a lot of complicated things
20
21 $container.append($element);
了解技巧
你可能对使用jQuery中的方法缺少经验,一定要查看的文档,可能会有一个更好或更快的方法来使用它。
1 // bad
2
3 $('#id').data(key,value);
4
5 // better (faster)
6
7 $.data('#id',key,value);
使用子查询缓存的父元素
像之前提到的一样,DOM的遍历的代价很大,典型做法是缓存父元素并在选择子元素时重用这些缓存元素。
1 // bad
2
3 var
4 $container = $('#container'),
5 $containerLi = $('#container li'),
6 $containerLiSpan = $('#container li span');
7
8 // better (faster)
9
10 var
11 $container = $('#container '),
12 $containerLi = $container.find('li'),
13 $containerLiSpan= $containerLi.find('span');
避免通用选择符
当和其他的选择符一起使用时,通用选择符非常的慢。
1 // bad
2
3 $('.container > *');
4
5 // better
6
7 $('.container').children();
避免使用隐式通用选择符
当你漏下了选择符,通用选择符(*)仍然起作用
1 // bad
2
3 $('.someclass :radio');
4
5 // better
6
7 $('.someclass input:radio');
优化选择符
例如,Id选择符应该是唯一的,所以没有必要添加额外的选择符。
1 // bad
2
3 $('div#myid');
4 $('div#footer a.myLink');
5
6 // better
7 $('#myid');
8 $('#footer .myLink');
避免多个ID选择符
再次强调ID 选择符应该是唯一的,不需要添加额外的选择符,更不需要多个后代ID选择符。
1 // bad
2
3 $('#outer #inner');
4
5 // better
6
7 $('#inner');
尽量使用最新版本
新版本通常更好:更轻量级,更高效。显然,你需要考虑你要支持的代码的兼容性。例如,2.0版本不支持ie 6/7/8。
不要使用被弃用的方法
关注每个新版本的废弃方法是非常重要的并尽量避免使用这些方法。
1 // bad - live is deprecated
2
3 $('#stuff').live('click', function() {
4 console.log('hooray');
5 });
6
7 // better
8 $('#stuff').on('click', function() {
9 console.log('hooray');
10 });
利用CDN加载jQuery
谷歌的CND能保证选择离用户最近的缓存并迅速响应,地址是http://code.jQuery.com/jQuery-latest.min.js
必要时组合jQuery和javascript原生代码
上所述,jQuery就是javascript,这意味着用jQuery能做的事情,同样可以用原生代码来做。原生代码的可读性和可维护性可能不如jQuery,而且代码更长。但也意味着更高效(通常更接近底层代码可读性越差,性能越高,例如:汇编,当然需要更强大的人才可以)。记住没有任何框架能比原生代码更小,更轻,更高效。
最后忠告
最后,写这篇文章的目的是提高jQuery的性能和给出一些好的建议。如果你想深入的研究对这个话题你会发现很多乐趣。记住,jQuery并非不可或缺,仅是一种选择。思考为什么要使用它。DOM操作?ajax?模版?css动画?还是选择符引擎?有时候,javascript微型框架或jQuery的需求定制版同样是值得考虑的。