如何书写高质量jQuery代码(使用jquery性能问题)


Posted in Javascript onJune 30, 2014

如何书写高质量jQuery代码(使用jquery性能问题)

1.正确引用jQuery

1.尽量在body结束前才引入jQuery,而不是在head中。
2.借助第三方提供的CDN来引入jQuery,同时注意当使用第三方CDN出现问题时,要引入本地的jQuery文件。(对于已经使用了cdn的网站可以忽略,现在用户带宽都升级了,这个可以忽略了,放别人机器不一定稳定)
3.如果在</body>前引入script文件的话,就不用写document.ready了,因为这时执行js代码时DOM已经加载完毕了。

<body>
 <script src="http://libs.baidu.com/jquery/1.8.3/jquery.min.js"></script>
 <script>window.jQuery || document.write('<script src="jquery1.8.min.js">\x3C/script>')</script>
</body>

2.优化jQuery选择器

高效正确的使用jQuery选择器是熟练使用jQuery的基础,而掌握jQuery选择器需要一定的时间积累,我们开始学习jQuery时就应该注意选择器的使用。

<div id="nav" class="nav">
 <a class="home" href="https://3water.com">三水点靠木</a>
 <a class="articles" href="https://3water.com/list/list_172_1.htm">jQuery教程</a>
</div>

如果我们选择class为home的a元素时,可以使用下边代码:

$('.home'); //1
$('#nav a.home'); //2
$('#nav').find('a.home'); //3

1.方法1会使jQuery在整个DOM中查找class为home的a元素,性能可想而知。
2.方法2为要查找的元素添加了上下文,在这里变为查找id为nav的子元素,查找性能得到了很大提升。
3.方法3使用了find方法,它的速度更快,所以方法三最好。

关于jQuery选择器的性能优先级,ID选择器快于元素选择器,元素选择器快于class选择器。因为ID选择器和元素选择器是原生的JavaScript操作,而类选择器不是,大家顺便可以看下find context 区别,find() children区别。

3.缓存jQuery对象

缓存jQuery对象可以减少不必要的DOM查找,关于这点大家可以参考下缓存jQuery对象来提高性能。

4.正确使用事件委托
事件委托可以使事件更好的执行,在动态添加的元素上绑定事件也需要委托来实现,在新版本的jQuery中推荐大家使用on来给元素绑定一个或多个事件的处理函数。

<table id="t">
 <tr>
  <td>我是单元格</td>
 </tr>
</table>

比如我们要在上边的单元格上绑定一个单击事件,不注意的朋友可能随手写成下边的样子:

$('#t').find('td').on('click', function () {
 $(this).css({ 'color': 'red', 'background': 'yellow' });
});

这样会为每个td绑上事件,在为100个单元格绑定click事件的测试中,两者性能相差7倍之多,好的做法应该是下边写法:

$('#t').on('click', 'td', function () {
 $(this).css({ 'color': 'red', 'background': 'yellow' });
});

5.精简jQuery代码
如在上述代码中我们对jQuery代码进行了适当的合并,类似的还有.attr()方法等,我们没有写成下边的方式:

$('#t').on('click', 'td', function () {
 $(this).css('color', 'red').css('background', 'yellow');
});

6.减少DOM操作
刚开始使用jQuery时可能会频繁的操作DOM,这是相当耗费性能的。如我们要在body中动态输出一个表格,一些朋友会这样写:

var $t = $('body');
$t.append('<table>');
$t.append('<tr><td>1</td></tr>');
$t.append('</table>');

好的做法:

$('body').append('<table><tr><td>1</td></tr></table>');

这样在拼接完table串后再添加到body中,对DOM的操作只需一次。群里以前有朋友就因为这个导致在IE下输出时出现问题,而关于字符串的拼接可以参考下最快创建字符串的方法。

7.不使用jQuery

原生函数总是最快的,这点不难理解,在代码书写中我们不应该忘记原生JS。

就先总结这几条吧,每条建议并不难理解,但总结全面的话还是要花费不少时间的。如在减少代码段中,如果需要根据条件从数组中得到新数组时,可以使用$.grep() 方法,如果你在使用jQuery时有自己必得的话,欢迎在留言中和大家分享!

下面是其它网友的补充:

注意定义jQuery变量的时候添加var关键字

这个不仅仅是jQuery,所有javascript开发过程中,都需要注意,请一定不要定义成如下:

$loading = $('#loading'); //这个是全局定义,不知道哪里位置倒霉引用了相同的变量名,就会郁闷至死的

请使用一个var来定义变量

如果你使用多个变量的话,请如下方式定义:

var page = 0,

  $loading = $('#loading'),

  $body = $('body');

不要给每一个变量都添加一个var关键字,除非你有严重的强迫症
定义jQuery变量

申明或者定义变量的时候,请记住如果你定义的是jQuery的变量,请添加一个$符号到变量前,如下:

var$loading = $('#loading');

这里定义成这样的好处在于,你可以有效的提示自己或者其它阅读你代码的用户,这是一个jQuery的变量。

DOM操作请务必记住缓存(cache)

在jQuery代码开发中,我们常常需要操作DOM,DOM操作是非常消耗资源的一个过程,而往往很多人都喜欢这样使用jQuery:

$('#loading').html('完毕');

$('#loading').fadeOut();

代码没有任何问题,你也可以正常运行出结果,但是这里注意你每次定义并且调用$('#loading')的时候,都实际创建了一个新的变量,如果你需要重用的话,记住一定要定义到一个变量里,这样可以有效的缓存变量内容,如下:

var $loading = $('#loading');

$loading.html('完毕');$loading.fadeOut();

这样性能会更好。

使用链式操作

上面那个例子,我们可以写的更简洁一些:

var $loading = $('#loading');

$loading.html('完毕').fadeOut();

精简jQuery代码

尽量把一些代码都整合到一起,请勿这样编码:

// !!反面人物$button.click(function(){

    $target.css('width','50%');

    $target.css('border','1px solid #202020');

    $target.css('color','#fff');

});

应该这样书写:

$button.click(function(){

    $target.css({'width':'50%','border':'1px solid #202020','color':'#fff'});

});

避免使用全局类型的选择器

请勿如下方式书写:$('.something > *');

这样书写更好:$('.something').children();

不要叠加多个ID

请勿如下书写:$('#something #children');

这样就够了:$('#children');

多用逻辑判断||或者&&来提速

请勿如下书写:

if(!$something) {

    $something = $('#something ');

}

这样书写性能更好:

$something= $something|| $('#something');
 
 
尽量使用更少的代码

与其这样书写:if(string.length > 0){..}

不如这样书写:if(string.length){..}

尽量使用 .on方法

如果你使用比较新版本的jQuery类库的话,请使用.on,其它任何方法都是最终使用.on来实现的。

尽量使用最新版本的jQuery

最新版本的jQuery拥有更好的性能,但是最新的版本可能不支持ie6/7/8,所以大家需要自己针对实际情况选择。

尽量使用原生的Javascript

如果使用原生的Javascript也可以实现jQuery提供的功能的话,推荐使用原生的javascript来实现。

Javascript 相关文章推荐
支持ie与FireFox的剪切板操作代码
Sep 28 Javascript
推荐20家国外的脚本下载网站
Apr 28 Javascript
限制textbox或textarea输入字符长度的JS代码
Oct 16 Javascript
javascript贪吃蛇完整版(源码)
Dec 09 Javascript
JavaScript常用验证函数实例汇总
Nov 25 Javascript
node.js 使用ejs模板引擎时后缀换成.html
Apr 22 Javascript
js实现点击链接后延迟3秒再跳转的方法
Jun 05 Javascript
基于JQuery和CSS3实现仿Apple TV海报背景视觉差特效源码分享
Sep 21 Javascript
javascript创建对象的3种方法
Nov 02 Javascript
微信小程序中页面FOR循环和嵌套循环
Jun 21 Javascript
浅谈JavaScript_DOM学习篇_图片切换小案例
Mar 19 Javascript
Element Notification通知的实现示例
Jul 27 Javascript
jQuery+ajax实现鼠标单击修改内容的思路
Jun 29 #Javascript
html文本框提示效果的示例代码
Jun 28 #Javascript
使用delegate方法为一个tr标签加一个链接
Jun 27 #Javascript
javaScript中两个等于号和三个等于号之间的区别介绍
Jun 27 #Javascript
js获取指定日期周数以及星期几的小例子
Jun 27 #Javascript
网页下载文件期间如何防止用户对网页进行其他操作
Jun 27 #Javascript
jQuery+ajax实现鼠标单击修改内容的方法
Jun 27 #Javascript
You might like
图片存储与浏览一例(Linux+Apache+PHP+MySQL)
2006/10/09 PHP
PHP中MD5函数使用实例代码
2008/06/07 PHP
php cookie名使用点号(句号)会被转换
2014/10/23 PHP
php删除文本文件中重复行的方法
2015/04/28 PHP
php ci 获取表单中多个同名input元素值的代码
2016/03/25 PHP
php注册系统和使用Xajax即时验证用户名是否被占用
2017/08/31 PHP
JavaScript 变量命名规则
2009/09/23 Javascript
初识javascript 文档碎片
2010/07/13 Javascript
浅析jQuery EasyUI中的tree使用指南
2014/12/18 Javascript
jQuery源码解读之hasClass()方法分析
2015/02/20 Javascript
用jQuery向div中添加Html文本内容的简单实现
2016/07/13 Javascript
利用Angular.js限制textarea输入的字数
2016/10/20 Javascript
使用JS 插件qrcode.js生成二维码功能
2017/02/20 Javascript
jQuery手风琴的简单制作
2017/05/12 jQuery
微信小程序picker组件简单用法示例【附demo源码下载】
2017/12/05 Javascript
简单的vuex 的使用案例笔记
2018/04/13 Javascript
JS数组实现分类统计实例代码
2018/09/30 Javascript
turn.js异步加载实现翻书效果
2019/07/25 Javascript
通过实例解析js可枚举属性与不可枚举属性
2020/12/02 Javascript
Python实现3行代码解简单的一元一次方程
2014/08/18 Python
Python中List.count()方法的使用教程
2015/05/20 Python
Ruby使用eventmachine为HTTP服务器添加文件下载功能
2016/04/20 Python
Python通过Django实现用户注册和邮箱验证功能代码
2017/12/11 Python
Python 编码规范(Google Python Style Guide)
2018/05/05 Python
详谈Python 窗体(tkinter)表格数据(Treeview)
2018/10/11 Python
python绘制散点图并标记序号的方法
2018/12/11 Python
Python 使用 attrs 和 cattrs 实现面向对象编程的实践
2019/06/12 Python
python如何读取bin文件并下发串口
2019/07/05 Python
jupyter notebook中美观显示矩阵实例
2020/04/17 Python
借助HTML5 Canvas API制作一个简单的猜字游戏
2016/03/25 HTML / CSS
机械设计制造专业个人求职信
2013/09/25 职场文书
青春励志演讲稿
2014/04/29 职场文书
法院个人总结
2015/03/03 职场文书
idea编译器vue缩进报错问题场景分析
2021/07/04 Vue.js
利用Python实现模拟登录知乎
2022/05/25 Python
Python加密与解密模块hashlib与hmac
2022/06/05 Python