如何书写高质量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 获取字符串字节数的多种方法
Jun 02 Javascript
JavaScript delete 属性的使用
Oct 08 Javascript
在jQuery中 常用的选择器介绍
Apr 16 Javascript
js判断undefined变量类型使用typeof
Jun 03 Javascript
整理的比较全的event对像在ie与firefox浏览器中的区别
Nov 25 Javascript
select多选 multiple的使用示例
Jun 16 Javascript
node.js中的url.format方法使用说明
Dec 10 Javascript
详解JS中的attribute属性
Apr 25 Javascript
对vue 键盘回车事件的实例讲解
Aug 25 Javascript
初探Vue3.0 中的一大亮点Proxy的使用
Dec 06 Javascript
对layui数据表格动态cols(字段)动态变化详解
Oct 25 Javascript
JS使用setInterval计时器实现挑战10秒
Nov 08 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
环境会对咖啡种植有什么影响
2021/03/03 咖啡文化
Warning: session_destroy() : Trying to destroy uninitialized sessionq错误
2011/06/16 PHP
ThinkPHP的截取字符串函数无法显示省略号的解决方法
2014/06/25 PHP
PHP不使用递归的无限级分类简单实例
2016/11/05 PHP
php注册审核重点解析(数据访问)
2017/05/23 PHP
TP5框架使用QueryList采集框架爬小说操作示例
2020/03/26 PHP
js 获取后台的字段 改变 checkbox的被选中的状态 代码
2013/06/05 Javascript
jquery跨域请求示例分享(jquery发送ajax请求)
2014/03/25 Javascript
AngularJS基础 ng-dblclick 指令用法
2016/08/01 Javascript
jQuery实现的小图列表,大图展示效果幻灯片示例
2016/10/25 Javascript
微信小程序 网络API Websocket详解
2016/11/09 Javascript
canvas红包照片实例分享
2017/02/28 Javascript
vue.js 左侧二级菜单显示与隐藏切换的实例代码
2017/05/23 Javascript
Vue.js获取被选择的option的value和text值方法
2018/08/24 Javascript
Vue infinite update loop的问题解决
2019/04/23 Javascript
layui实现checkbox的目录树tree的例子
2019/09/12 Javascript
BootstrapValidator实现表单验证功能
2019/11/08 Javascript
python有证书的加密解密实现方法
2014/11/19 Python
python实现树形打印目录结构
2018/03/29 Python
Python中将dataframe转换为字典的实例
2018/04/13 Python
Python3模拟登录操作实例分析
2019/03/12 Python
python3.7调试的实例方法
2020/07/21 Python
python调用百度AI接口实现人流量统计
2021/02/03 Python
Bootstrap 学习分享
2012/11/12 HTML / CSS
AmazeUI 面板的实现示例
2020/08/17 HTML / CSS
Gap英国官网:Gap UK
2018/07/18 全球购物
adidas爱尔兰官方网站:阿迪达斯运动鞋和运动服
2019/11/01 全球购物
利用异或运算实现两个无符号数的加法运算
2013/12/20 面试题
数据库笔试题
2013/05/09 面试题
财务出纳员岗位职责
2013/11/26 职场文书
大学生职业生涯规划书前言
2014/01/09 职场文书
员工安全责任书范本
2014/07/24 职场文书
2014最新党员批评与自我批评材料
2014/09/24 职场文书
中学生逃课检讨书
2015/02/17 职场文书
幼儿园大班教育随笔
2015/08/14 职场文书
2019最新版火锅店的创业计划书 !
2019/07/12 职场文书