众所周知,jQuery现在已经非常流行,百度新首页中也已经开始使用jQuery,今天总结下怎么书写更好的jQuery代码使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="http://www.lovean.com">爱安网</a> <a class="articles" href="http://www.lovean.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来实现。

最新资讯
AMD第三季度营收28亿美元,同比增长56%

AMD第三季度营收28亿

据报道,AMD今日发布了2020年第三季度财报,营收为28亿美
立讯精密:2020年前三季度实现营收595.28亿元,同比增长57.33%

立讯精密:2020年前三季

立讯精密披露三季报。报告显示,公司2020年前三季度实现
汽车之家对天天拍车投资1.68亿美元 打造最大二手车平台

汽车之家对天天拍车投

北京时间10月27日消息,汽车之家宣布,已与中国领先的二手
AMD宣布以350亿美元的全股票交易收购赛灵思

AMD宣布以350亿美元的

据报道,AMD今日宣布,已同意以350亿美元的股票收购半导体
蚂蚁上市,除了马云,还有哪些有钱人会更有钱?

蚂蚁上市,除了马云,还有

蚂蚁集团上市,买了配售基金或能中签的人,会欢欣鼓舞。比
划重点!蚂蚁集团网上路演,对数字货币、竞争对手等做出回应

划重点!蚂蚁集团网上路

10月27日,蚂蚁集团举行网上路演,回应投资者关切,对蚂蚁集
最新文章
详解Vue的ref特性的使用

详解Vue的ref特性的使

这篇文章主要介绍了详解Vue的ref特性的使用,文中通过
vue学习笔记之slot插槽基本用法实例分析

vue学习笔记之slot插

这篇文章主要介绍了vue学习笔记之slot插槽基本用法,结
vue跳转方式(打开新页面)及传参操作示例

vue跳转方式(打开新页

这篇文章主要介绍了vue跳转方式(打开新页面)及传参操作,
vue学习笔记之过滤器的基本使用方法实例分析

vue学习笔记之过滤器

这篇文章主要介绍了vue学习笔记之过滤器的基本使用方
js获取本日、本周、本月的时间代码

js获取本日、本周、本

本篇文章给大家分享的内容是利用js如何获取本日、本周
node crawler如何添加promise支持

node crawler如何添加

这篇文章主要介绍了node crawler如何添加promise支持,