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

1.正确引用jQuery

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

?


1

2

3

4

<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时就应该注意选择器的使用。

?


1

2

3

4

<div id="nav" class="nav">

 <a class="home" href="http://www.jb51.net">脚本之家</a>

 <a class="articles" href="http://www.jb51.net/list/list_172_1.htm">jQuery教程</a>

</div>

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

?


1

2

3

$(‘.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来给元素绑定一个或多个事件的处理函数。

?


1

2

3

4

5

<table id="t">

 <tr>

  <td>我是单元格</td>

 </tr>

</table>

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

?


1

2

3

$(‘#t‘).find(‘td‘).on(‘click‘, function () {

 $(this).css({ ‘color‘: ‘red‘, ‘background‘: ‘yellow‘ });

});

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

?


1

2

3

$(‘#t‘).on(‘click‘, ‘td‘, function () {

 $(this).css({ ‘color‘: ‘red‘, ‘background‘: ‘yellow‘ });

});

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

?


1

2

3

$(‘#t‘).on(‘click‘, ‘td‘, function () {

 $(this).css(‘color‘, ‘red‘).css(‘background‘, ‘yellow‘);

});

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

?


1

2

3

4

var $t = $(‘body‘);

$t.append(‘<table>‘);

$t.append(‘<tr><td>1</td></tr>‘);

$t.append(‘</table>‘);

好的做法:

?


1

$(‘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来实现。

时间: 2024-10-12 13:26:10

如何书写高质量jQuery代码(使用jquery性能问题)的相关文章

如何书写高质量的jQuery代码(转)

想必大家对于jQuery这个最流行的javascript类库都不陌 生,而且只要是前端开发人员肯定或多或少的使用或者接触过,在今天的这篇文章中,参考了一些资料及实际使用效率,将介绍一些书写高质量jQuery代码的 原则,不单单会告诉你如何去书写,也会告诉你为什么这样书写,希望大家会觉得有所帮助. 注意定义jQuery变量的时候添加var关键字 这个不仅仅是jQuery,所有javascript开发过程中,都需要注意,请一定不要定义成如下: $loading = $('#loading'); //

如何书写高质量的jQuery代码

想必大家对于jQuery这个最流行的javascript类库都不陌生,而且只要是前端开发人员肯定或多或少的使用或者接触过,在今天的这篇文章中,我们将介绍一些书写高质量jQuery代码的原则,我们不单单会告诉你如何去书写,也会告诉你为什么这样书写,希望大家会觉得有所帮助. 注意定义jQuery变量的时候添加var关键字 这个不仅仅是jQuery,所有javascript开发过程中,都需要注意,请一定不要定义成如下: 1 $loading = $('#loading'); //这个是全局定义,不知道

怎么书写高质量jQuery代码

众所周知,jQuery现在已经非常流行,百度新首页中也已经开始使用jQuery,今天总结下怎么书写更好的jQuery代码使jQuery代码更好.更快的执行,希望本篇jQuery教程一改大家以前不合理的做法. 1.正确引用jQuery 尽量在body结束前才引入jQuery,而不是在head中. 借助第三方提供的CDN来引入jQuery,同时注意当使用第三方CDN出现问题时,要引入本地的jQuery文件. 如果在</body>前引入script文件的话,就不用写document.ready了,因

iOS书写高质量代码之耦合的处理 干货!

iOS书写高质量代码之耦合的处理 耦合是每个程序员都必须面对的话题,也是容易被忽视的存在,怎么处理耦合关系到我们最后的代码质量.今天Peak君和大家聊聊耦合这个基本功话题,一起捋一捋iOS代码中处理耦合的种种方式及差异. 简化场景 耦合的话题可大可小,但原理都是相通的.为了方便讨论,我们先将场景进行抽象和简化,只讨论两个类之间的耦合. 假设我们有个类Person,需要喝水,根据职责划分,我们需要另一个类Cup来完成喝水的动作,代码如下: 1 2 3 4 5 6 7 8 9 //Person.h

JavaScript手札:《编写高质量JS代码的68个有效方法》(一)(1~5)

编写高质量JS代码的68个有效方法(一) *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* BLOCKS =============================================================================*/ p, blockquote, ul, ol, dl, table, pre { marg

高质量的代码

五一期间,以前的同事在qq上问了一个问题:你认为什么样的代码是高质量的代码? 当时由于在外地游玩,没有及时回复.今天抽出时间,回复了一下他: 这个问题说难不难,说简单也不简单.每个人所处的水平.经验.喜好都会影响对代码质量的理解.以下是我认为的高质量代码:1.可读性.能让大多数的人都看懂.除了变量命名.函数规模及组合方式等基本因素外,所选语言的表达能力,也会影响可读性.Ruby的表达能力就比Java.C#更高级. 除了对模块的整体注释之外,代码中应该尽可能减少注释,除非有产生二义性的部分.因为代

[编写高质量iOS代码的52个有效方法](三)消息和运行期

[编写高质量iOS代码的52个有效方法](三)消息和运行期 参考书籍:<Effective Objective-C 2.0> [英] Matt Galloway 先睹为快 11.理解objc_msgSend的作用 12.理解消息转发机制 13.用"方法调配技术"调试"黑盒方法" 14.理解"类对象"的用意 目录 编写高质量iOS代码的52个有效方法三消息和运行期 先睹为快 目录 第11条理解objc_msgSend的作用 第12条理解

[编写高质量iOS代码的52个有效方法](十)Grand Central Dispatch(GCD)

[编写高质量iOS代码的52个有效方法](十)Grand Central Dispatch(GCD) 参考书籍:<Effective Objective-C 2.0> [英] Matt Galloway 先睹为快 41.多用派发队列,少用同步锁 42.多用GCD,少用performSelector系列方法 43.掌握GCD及操作队列的使用时机 44.通过Dispatch Group机制,根据系统资源状况来执行任务 45.使用dispatch_once来执行只需要运行一次的线程安全代码 46.不

[编写高质量iOS代码的52个有效方法](十一)系统框架

[编写高质量iOS代码的52个有效方法](十一)系统框架 参考书籍:<Effective Objective-C 2.0> [英] Matt Galloway 先睹为快 47.熟悉系统框架 48.多用块枚举,少用for循环 49.对自定义其内存管理语义的容器使用无缝桥接 50.构建缓存时选用NSCache而非NSDictionary 51.精简initialize与load的实现代码 52.别忘了NSTimer会保留其目标对象 目录 编写高质量iOS代码的52个有效方法十一系统框架 先睹为快

追求高质量的代码(转)

如果项目从头开始都是自己开发,或者自己主导开发,那代码洁癖是必然的..所以我一般不喜欢别人参与进我的代码里,因为他的习惯性随意黏贴,会严重让我不爽 ---------------------------------------------------------------- 低质量的特征包括但不限于: 文件关系混乱 注释过期.不明确或者没有 文档过期.不明确或者没有 架构乱设计 过度设计 不检查用户输入的错误情况 不检查API或者函数返回的errorcode或者exception 没有单元测试