编写更好的jQuery代码(转)
这是一篇关于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的遍历是非常昂贵的,所以尽量缓存一些可能会被重新用到的变量。
// 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的需求定制版同样是值得考虑的。
编写更好的jQuery代码(转)的更多相关文章
- 编写更好的jQuery代码
这是一篇关于jQuery的文章,写到这里给初学者一些建议. 现在已经有很多文章讨论jQuery和JavaScript的性能问题,然而,在这篇文章中我计划总结一些提升速度的技巧和一些我自己的建议来改善你 ...
- 编写更好的jQuery代码的建议
讨论jQuery和javascript性能的文章并不罕见.然而,本文我计划总结一些速度方面的技巧和我本人的一些建议,来提升你的jQuery和javascript代码.好的代码会带来速度的提升.快速渲染 ...
- 编写更好的jQuery代码的建议(share)
留个备份! 原文链接: Mathew Carella 翻译: 伯乐在线- yanhaijing译文链接: http://blog.jobbole.com/52770/ 讨论jQuery和javas ...
- 使用 Promises 编写更优雅的 JavaScript 代码
你可能已经无意中听说过 Promises,很多人都在讨论它,使用它,但你不知道为什么它们如此特别.难道你不能使用回调么?有什么了特别的?在本文中,我们一起来看看 Promises 是什么以及如何使用它 ...
- 编写高效的js/jQuery代码 :rocket:
讨论jQuery和javascript性能的文章并不罕见.然而,本文我计划总结一些速度方面的技巧和我本人的一些建议,来提升你的jQuery和javascript代码.好的代码会带来速度的提升.快速渲染 ...
- 编写更好的C#代码
引言 开发人员总是喜欢就编码规范进行争论,但更重要的是如何能够在项目中自始至终地遵循编码规范,以保证项目代码的一致性.并且团队中的所有人都需要明确编码规范所起到的作用.在这篇文章中,我会介绍一些在我多 ...
- 如何编写高质量的 jQuery 代码?
想必大家对于jQuery这个最流行的javascript类库都不陌生,而且只要是前端开发人员肯定或多或少的使用或者接触过,在今天的这篇文章中,我们将介绍一些书写高质量jQuery代码的原则,我们不单单 ...
- 【转】编写更好的CSS代码
原文转自:http://blog.jobbole.com/55067/ 编写好的CSS代码,有助提升页面的渲染速度.本质上,引擎需要解析的CSS规则越少,性能越好.MDN上将CSS选择符归类成四个主要 ...
- 用Flow编写更好的js代码
关于本文: 原文地址 翻译地址 译者:野草 本文发表于前端早读课[第897期] 你是否经常在debug那些简单可避免的bug?可能你给函数传参的时候搞错了参数的顺序,或者本来应该传个Number类型的 ...
随机推荐
- css细节复习笔记——结构与层叠
每个合法的文档都会生成一个结构树,有了结构树元素的祖先.属性兄弟元素等等创建选择器来选择元素,这是CSS继承的核心.继承是从一个元素向后代元素传递属性值所采用的机制.面向一个元素使用哪些值时,用户代理 ...
- SparkSQL大数据实战:揭开Join的神秘面纱
本文来自 网易云社区 . Join操作是数据库和大数据计算中的高级特性,大多数场景都需要进行复杂的Join操作,本文从原理层面介绍了SparkSQL支持的常见Join算法及其适用场景. Join背景介 ...
- pageadmin 网站建设系统如何新建进程池并在站点中使用
1.打开iis管理界面,右键应用程序池,点击添加应用程序池,添加界面如下图,注意pageadmin cms net版本选择4.0,托管模式建议选择集成模式. 2.添加完毕后,在网站中点击对应站点,点击 ...
- 201621123023《Java程序设计》第11周学习总结
一.本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 二.书面作业 本次PTA作业题集多线程 1. 源代码阅读:多线程程序BounceThread 1.1 BallRun ...
- Gogland配置- 修改Go源代码tab值
Gogland对Go源代码默认值为8个,我很不习惯,第一次遇到tab数量这么大的,于是我决定修改这个tab值! 1,点击顶部菜单“File”->"Settings". 2,在 ...
- linux中使用unzip命令中文乱码解决办法
今天在使用unzip进行解压缩文件时,发现解压出的文件中文乱码,最后使用如下命令解决: unzip -O CP936 xxx.zip 特此记录一下.
- 字符串模式匹配算法1 - BF和KMP算法
在字符串S中定位/查找某个子字符串P的操作,通常称为字符串的模式匹配,其中P称为模式串.模式匹配有多种算法,这里先总结一下BF算法和KMP算法. 注意:本文在讨论字符位置/指针/下标时,全部使用C语法 ...
- mxonline实战14,全局搜索,修改个人中心页面个人资料信息
对应github地址:第14天 一. 全局搜索 1. 使用关键词搜索 courses/views.py/CourseListView新增代码,不用把search_keywords传到前端
- Python 魔法方法查询表 -- 总结篇
据说,Python 的对象天生拥有一些神奇的方法,它们总被双下划线所包围,他们是面向对象的 Python 的一切. 他们是可以给你的类增加魔力的特殊方法,如果你的对象实现(重载)了这些方法中的某一个, ...
- 何在不联网的情况下ping通主机与虚拟机
选择NAT模式,VM对windows选择ping操作时选择VMnet8的IP地址.