这是一篇关于jQuery的文章,写到这里给初学者一些建议。

现在已经有很多文章讨论jQuery和JavaScript的性能问题,然而,在这篇文章中我计划总结一些提升速度的技巧和一些我自己的建议来改善你的jQuery和JavaScript代码。更好的代码意味着更快的应用程序,快速渲染和反应性意味着一个更好的用户体验。

首先,我们要记住最重要的一点是:jQuery也是javascript,也就是意味着我们要对jQuery和javascript使用相同的编码规则和风格指南,还有最佳实践。

另外,如果你是一个javascript的初学者,那么我建议你在开始jQuery之前看一下JavaScript best practices for beginners 和 writing high quality JavaScript这两篇文章。

如果你已经开始使用jQuery了,那么我强烈建议遵守下面的建议:

缓存变量

DOM的遍历是非常昂贵的,所以尽量缓存一些可能会被重新用到的变量。

// bad

h = $('#element').height();
$('#element').css('height',h-20); // good $element = $('#element');
h = $element.height();
$element.css('height',h-20);

避免全局变量

使用jQuery和使用javascript一样,最好确保你的变量在你的函数作用域内。

// bad

$element = $('#element');
h = $element.height();
$element.css('height',h-20); // good var $element = $('#element');
var h = $element.height();
$element.css('height',h-20);

使用匈牙利命名法

在变量前加上一个$符号,很容易看出来这是一个jQuery变量。

// bad

var first = $('#first');
var second = $('#second');
var value = first.val(); // better - we use to put $ symbol before jQuery-manipulated objects var $first = $('#first');
var $second = $('#second'),
var value = $first.val();

使用 Var 链(单 Var 模式)

不要使用多个var声明,可以将它们合并为一个var声明,建议将没有指定值的变量放在最后。

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

最好使用on 绑定事件

最新版本的jQuery已经将click()改变为函数on('click')的简写。在之前的版本中实现的不同,click()简写bind()。在jQuery 1.7中,on()是首选方法用于附加事件处理程序。然而,对于一致性可以简单地使用on()。

// bad

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

压缩精简javascript

一般来说,我们要尽可能的合并函数

// bad

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

使用链式操作

根据上面的规则,jQuery很容易将方法链接在一起,我们要利用这一优点。

// bad

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

保持代码的可读性

当精简了javascript代码和使用了链式操作,你的代码有时候会变得不可读,尽量使用缩进和换行使代码变得漂亮些。

// bad

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

使用短路求值

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

// bad

function initVar($myVar) {
if(!$myVar) {
$myVar = $('#selector');
}
} // better function initVar($myVar) {
$myVar = $myVar || $('#selector');
}

使用快捷的方式

精简代码的方式之一就是利用一些编码捷径。

// bad

if(collection.length > 0){..}

// better

if(collection.length){..}

复杂的操作要分离元素

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

// bad

var
$container = $("#container"),
$containerLi = $("#container li"),
$element = null; $element = $containerLi.first();
//... a lot of complicated things // better var
$container = $("#container"),
$containerLi = $container.find("li"),
$element = null; $element = $containerLi.first().detach();
//...a lot of complicated things $container.append($element);

了解技巧

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

// bad

$('#id').data(key,value);

// better (faster)

$.data('#id',key,value);

使用子查询缓存的父元素

像之前提到的一样,DOM的遍历的代价很大,典型做法是缓存父元素并在选择子元素时重用这些缓存元素。

// bad

var
$container = $('#container'),
$containerLi = $('#container li'),
$containerLiSpan = $('#container li span'); // better (faster) var
$container = $('#container '),
$containerLi = $container.find('li'),
$containerLiSpan= $containerLi.find('span');

避免通用选择符

当和其他的选择符一起使用时,通用选择符非常的慢。

// bad

$('.container > *'); 

// better

$('.container').children();

避免使用隐式通用选择符

当你漏下了选择符,通用选择符(*)仍然起作用

// bad

$('.someclass :radio'); 

// better

$('.someclass input:radio');

优化选择符

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

// bad

$('div#myid');
$('div#footer a.myLink'); // better
$('#myid');
$('#footer .myLink');

避免多个ID选择符

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

// bad

$('#outer #inner'); 

// better

$('#inner');

尽量使用最新版本

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

不要使用被弃用的方法

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

/ bad - live is deprecated

$('#stuff').live('click', function() {
console.log('hooray');
}); // better
$('#stuff').on('click', function() {
console.log('hooray');
}); 

利用CDN加载加载jQuery

谷歌的CND能保证选择离用户最近的缓存并迅速响应,地址是http://code.jQuery.com/jQuery-latest.min.js

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

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

最后忠告

最后,写这篇文章的目的是提高jQuery的性能和给出一些好的建议。如果你想深入的研究对这个话题你会发现很多乐趣。记住,jQuery并非不可或缺,仅是一种选择。思考为什么要使用它。DOM操作?ajax?模版?css动画?还是选择符引擎?有时候,javascript微型框架或jQuery的需求定制版同样是值得考虑的。

原文地址:http://flippinawesome.org/2013/11/25/writing-better-jquery-code/

编写更好的jQuery代码的更多相关文章

  1. 编写更好的jQuery代码的建议

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

  2. 编写更好的jQuery代码的建议(share)

    留个备份! 原文链接: Mathew Carella   翻译: 伯乐在线- yanhaijing译文链接: http://blog.jobbole.com/52770/ 讨论jQuery和javas ...

  3. 编写更好的jQuery代码(转)

    这是一篇关于jQuery的文章,写到这里给初学者一些建议. 原文地址:http://flippinawesome.org/2013/11/25/writing-better-jquery-code/ ...

  4. 使用 Promises 编写更优雅的 JavaScript 代码

    你可能已经无意中听说过 Promises,很多人都在讨论它,使用它,但你不知道为什么它们如此特别.难道你不能使用回调么?有什么了特别的?在本文中,我们一起来看看 Promises 是什么以及如何使用它 ...

  5. 编写高效的js/jQuery代码 :rocket:

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

  6. 编写更好的C#代码

    引言 开发人员总是喜欢就编码规范进行争论,但更重要的是如何能够在项目中自始至终地遵循编码规范,以保证项目代码的一致性.并且团队中的所有人都需要明确编码规范所起到的作用.在这篇文章中,我会介绍一些在我多 ...

  7. 如何编写高质量的 jQuery 代码?

    想必大家对于jQuery这个最流行的javascript类库都不陌生,而且只要是前端开发人员肯定或多或少的使用或者接触过,在今天的这篇文章中,我们将介绍一些书写高质量jQuery代码的原则,我们不单单 ...

  8. 【转】编写更好的CSS代码

    原文转自:http://blog.jobbole.com/55067/ 编写好的CSS代码,有助提升页面的渲染速度.本质上,引擎需要解析的CSS规则越少,性能越好.MDN上将CSS选择符归类成四个主要 ...

  9. 用Flow编写更好的js代码

    关于本文: 原文地址 翻译地址 译者:野草 本文发表于前端早读课[第897期] 你是否经常在debug那些简单可避免的bug?可能你给函数传参的时候搞错了参数的顺序,或者本来应该传个Number类型的 ...

随机推荐

  1. gnome-session 使用方法与介绍

    注:译自gnome-session[1],有调整,如若有误,欢迎指正 用途 启动GNOME桌面环境 概要(synopsis) 使用方法 gnome-session [--autostart=DIR] ...

  2. Tomcat笔记

    总体架构: 由三部分组成:Service.Connector.Container 多个Connector对应一个Container,构成一个Service 为Service提供一个生存环境 如何处理多 ...

  3. js中的break ,continue, return (转)

    面向对象编程语法中我们会碰到break ,continue, return这三个常用的关键字,那么关于这三个关键字的使用具体的操作是什么呢?我们在使用这三关键字的时候需要注意和需要理解的规则是什么呢? ...

  4. js按钮浮动随手指方向移动而移动

    window.document.getElementById("moveDIV").addEventListener("touchmove", function ...

  5. 使用CocoaPod导入Swift第三方库报错

    在使用cocoapod导入swift第三方时出现这样的错误: [!] Pods written in Swift can only be integrated as frameworks; add ` ...

  6. 【WEB前端】使用百度ECharts,绘制项目质量报表

    一.下载ECharts的js库 下载地址:http://echarts.baidu.com/download.html 由于我们对体积无要求,所以我们采用了完整版本,功能齐全,在项目中,我们只需要像普 ...

  7. 基于jQuery的email suggest插件

    最近项目中有表单提交的地方需要用户填写邮箱,PM(产品经理)和运营都强烈要求在用户填写邮箱的时候出现suggest列表,简化用户输入的填写流程.我考虑了下,这个应该也是经常会用到的功能,细心的朋友可能 ...

  8. (转) The major advancements in Deep Learning in 2016

    The major advancements in Deep Learning in 2016 Pablo Tue, Dec 6, 2016 in MACHINE LEARNING DEEP LEAR ...

  9. 转载:JAVA的静态变量、静态方法、静态类

    静态变量和静态方法都属于静态对象,它与非静态对象的差别需要做个说明. (1)Java静态对象和非静态对象有什么区别? 比对如下: 静态对象                                ...

  10. cygwin和mingw的区别

    之前由于做一些JNI的开发,安装了MinGW,最近有个项目需要用到cygwin,于是就有个疑问,这两个东西有什么区别?在网上看了些资料,在这里复制粘贴一下,以备后查. Unix下编译通过的C代码,在w ...