如何书写高质量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 相关文章推荐
推荐自用 Javascript 缩图函数 (onDOMLoaded)……
Oct 23 Javascript
JavaScript的parseInt 取整使用
May 09 Javascript
Struts2的s:radio标签使用及用jquery添加change事件
Apr 08 Javascript
异步动态加载JS并运行(示例代码)
Dec 13 Javascript
jquery使整个div区域可以点击的方法
Jun 24 Javascript
jQuery实现响应鼠标事件的图片透明效果【附demo源码下载】
Jun 16 Javascript
详解Sea.js中Module.exports和exports的区别
Feb 12 Javascript
js轮播图无缝滚动效果
Jun 17 Javascript
老生常谈Bootstrap媒体对象
Jul 06 Javascript
NestJs 静态目录配置详解
Mar 12 Javascript
详解auto-vue-file:一个自动创建vue组件的包
Apr 26 Javascript
javascript实现视频弹幕效果(两个版本)
Nov 28 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
《神奇女侠:血脉》神力女超人大战犯罪公司
2020/04/09 欧美动漫
网站加速 PHP 缓冲的免费实现方法
2006/10/09 PHP
php中大括号作用介绍
2012/03/22 PHP
php中session使用示例
2014/03/29 PHP
php给一组指定关键词添加span标签的方法
2015/03/31 PHP
浅析php-fpm静态和动态执行方式的比较
2016/11/09 PHP
javascript 函数调用的对象和方法
2010/07/01 Javascript
JavaScript编程开发中的五个实用小技巧
2010/07/22 Javascript
jquery $.ajax相关用法分享
2012/03/16 Javascript
用JavaScript实现动画效果的方法
2013/07/20 Javascript
跟我学习javascript的全局变量
2015/11/16 Javascript
AngularJS 模块详解及简单实例
2016/07/28 Javascript
微信小程序 获取设备信息 API实例详解
2016/10/02 Javascript
jquery实现焦点轮播效果
2017/02/23 Javascript
jQuery轻松实现无缝轮播效果
2017/03/22 jQuery
BootStrap 获得轮播中的索引和当前活动的焦点对象
2017/05/11 Javascript
vue-resource 拦截器(interceptor)的使用详解
2017/07/04 Javascript
基于webpack-hot-middleware热加载相关错误的解决方法
2018/02/22 Javascript
解决vue-cli webpack打包后加载资源的路径问题
2018/09/25 Javascript
vue实现将一个数组内的相同数据进行合并
2019/11/07 Javascript
linux服务器快速卸载安装node环境(简单上手)
2021/02/22 Javascript
[00:16]热血竞技场
2019/03/06 DOTA
[46:49]完美世界DOTA2联赛PWL S3 access vs Rebirth 第二场 12.19
2020/12/24 DOTA
Python使用百度API上传文件到百度网盘代码分享
2014/11/08 Python
Python中的MongoDB基本操作:连接、查询实例
2015/02/13 Python
python并发编程多进程之守护进程原理解析
2019/08/20 Python
Python Websocket服务端通信的使用示例
2020/02/25 Python
Python requests模块session代码实例
2020/04/14 Python
去除python中的字符串空格的简单方法
2020/12/22 Python
Melijoe英国官网:法国儿童时尚网站
2016/11/18 全球购物
有关打架的检讨书
2014/01/25 职场文书
会计岗位职责范本
2014/03/07 职场文书
2014年库房工作总结
2014/11/26 职场文书
餐厅收银员岗位职责
2015/04/07 职场文书
创卫工作总结2015
2015/04/22 职场文书
Python-OpenCV教程之图像的位运算详解
2021/06/21 Python