我一直在寻找有关jQuery性能优化方面的小窍门,能让我那臃肿的动态网页应用变得轻便些。找了很多文章后,我决定将最好最常用的一些优化性能的建议列出来

=================================================================
一、选择器性能优化建议
=================================================================

1. 总是从#id选择器来继承
这是jQuery选择器的一条黄金法则。jQuery选择一个元素最快的方法就是用ID来选择了。

  1. $('#content').hide();

复制代码

或者从ID选择器继承来选择多个元素:

  1. $('#content p').hide();

复制代码

2. 在class前面使用tag
jQuery中第二快的选择器就是tag选择器(如$(‘head’)),因为它和直接来自于原生的Javascript方法getElementByTagName()。所以最好总是用tag来修饰class(并且不要忘了就近的ID)

  1. varreceiveNewsletter = $('#nslForm input.on');

复制代码

jQuery中class选择器是最慢的,因为在IE浏览器下它会遍历所有的DOM节点。尽量避免使用class选择器。也不要用tag来修饰ID。下面的例子会遍历所有的div元素来查找id为’content’的那个节点:

  1. varcontent = $('div#content');// 非常慢,不要使用

复制代码

用ID来修饰ID也是画蛇添足:

  1. vartraffic_light = $('#content #traffic_light');// 非常慢,不要使用

复制代码

3. 使用子查询
将父对象缓存起来以备将来的使用

  1. varheader = $('#header');
  2. varmenu = header.find('.menu');
  3. // 或者
  4. varmenu = $('.menu', header);

复制代码

4. 优化选择器以适用Sizzle的“从右至左”模型
自版本1.3之后,jQuery采用了Sizzle库,与之前的版本在选择器引擎上的表现形式有很大的不同。它用“从左至右”的模型代替了“从右至左”的模型。确保最右的选择器具体些,而左边的选择器选择范围较宽泛些:
var linkContacts = $('.contact-links div.side-wrapper');
而不要使用
var linkContacts = $('a.contact-links .side-wrapper');

5. 采用find(),而不使用上下文查找
.find()函数的确快些。但是如果一个页面有许多DOM节点时,需要来回查找时,可能需要更多时间:

  1. vardivs = $('.testdiv','#pageBody');// 2353 on Firebug 3.6
  2. vardivs = $('#pageBody').find('.testdiv');// 2324 on Firebug 3.6 - The best time
  3. vardivs = $('#pageBody .testdiv');// 2469 on Firebug 3.6

复制代码

6. 利用强大的链式操作
采用jQuery的链式操作比缓存选择器更有效:

  1. $('li.menu-item').click(function() {alert('test click');})
  2. .css('display','block')
  3. .css('color','red')
  4. fadeTo(2, 0.7);

复制代码

记住,永远不要让相同的选择器在你的代码里出现多次:
(1)为了区分普通的JavaScript对象和jQuery对象,可以在变量首字母前加上$符号。

7. 编写属于你的选择器
如果你经常在代码中使用选择器,那么扩展jQuery的$.expr[':']对象吧,编写你自己的选择器。下面的例子中,我创建了一个abovethefold选择器,用来选择不可见的元素:

  1. $.extend($.expr[':'], {
  2. abovethefold:function(el) {
  3. return$(el).offset().top < $(window).scrollTop() + $(window).height();
  4. }
  5. });
  6. varnonVisibleElements = $('div:abovethefold');// 选择元素

复制代码

=================================================================
二、优化DOM操作建议
=================================================================

8. 缓存jQuery对象
将你经常用的元素缓存起来:

  1. varheader = $('#header');
  2. vardivs = header.find('div');
  3. varforms = header.find('form');

复制代码

9. 当要进行DOM插入时,将所有元素封装成一个元素
这里的基本思想是在内存中建立你确实想要的东西,然后更新DOM。这并不是一个jQuery最佳实践,但必须进行有效的JavaScript操作 。直接的DOM操作速度很慢
直接的DOM操作很慢。尽可能少的去更改HTML结构。

  1. varmenu = '<ul id="menu">';
  2. for(vari = 1; i < 100; i++) {
  3. menu += '<li>'+ i + '</li>';
  4. }
  5. menu += '</ul>';
  6. $('#header').prepend(menu);
  7. // 千万不要这样做:
  8. $('#header').prepend('<ul id="menu"></ul>');
  9. for(vari = 1; i < 100; i++) {
  10. $('#menu').append('<li>'+ i + '</li>');
  11. }

复制代码

冒泡事件:除非在特殊情况下, 否则每一个js事件(例如:click, mouseover等.)都会冒泡到父级节点。当我们需要给多个元素调用同个函数时这点会很有用。代替这种效率很差的多元素事件监听的方法就是, 你只需向它们的父节点绑定一次。 比如, 我们要为一个拥有很多输入框的表单绑定这样的行为: 当输入框被选中时为它添加一个class传统的做法是,直接选中input,然后绑定focus等,如下所示:

  1. $("#entryform input").bind("focus",function(){
  2. $(this).addClass("selected");
  3. }).bind("blur",function(){
  4. $(this).removeClass("selected");
  5. });

复制代码

当然上面代码能帮我们完成相应的任务,但如果你要寻求更高效的方法,请使用如下代码:

  1. $("#entryform").bind("focus",function(e){
  2. var$cell = $(e.target); // e.target 捕捉到触发的目标元素
  3. $cell.addClass("selected");
  4. }).bind("blur",function(e){
  5. var$cell = $(e.target);
  6. $cell.removeClass("selected");
  7. });

复制代码

通过在父级监听获取焦点和失去焦点的事件,对目标元素进行操作。在上面代码中,父级元素扮演了一个调度员的角色, 它可以基于目标元素绑定事件。如果你发现你给很多元素绑定了同一个事件监听, 那么现在的你肯定知道哪里做错了。同理,在Table操作时,我们也可以使用这种方式加以改进代码:普通的方式

  1. $('#myTable td').click(function(){
  2. $(this).css('background','red');
  3. });
  4. 改进方式:
  5. $('#myTable').click(function(e) {
  6. var$clicked = $(e.target);
  7. $clicked.css('background','red');
  8. });

复制代码

假设有100个td,在使用普通的方式的时候,你绑定了100个事件。在改进方式中,你只为一个元素绑定了1个事件,至于是100个事件的效率高,还是1个事件的效率高,相信你也能自行分辨了。

10. 尽管jQuery不会抛出异常,但开发者也应该检查对象
尽管jQuery不会抛出大量的异常给用户,但是开发者也不要依赖于此。jQuery通常会执行了一大堆没用的函数之后才确定一个对象是否存在。所以在对一个作一系列引用之前,应先检查一下这个对象存不存在。

11. 使用直接函数,而不要使用与与之等同的函数
为了获得更好的性能,你应该使用直接函数如$.ajax(),而不要使用$.get(),$.getJSON(),$.post(),因为后面的几个将会调用$.ajax()。

12. 缓存jQuery结果,以备后来使用
你经常会获得一个javasript应用对象——你可以用App.来保存你经常选择的对象,以备将来使用:

  1. App.hiddenDivs = $('div.hidden');
  2. // 之后在你的应用中调用:
  3. App.hiddenDivs.find('span');

复制代码

13. 采用jQuery的内部函数data()来存储状态
不要忘了采用.data()函数来存储信息:

  1. $('#head').data('name','value');
  2. // 之后在你的应用中调用:
  3. $('#head').data('name');

复制代码

14. 使用jQuery utility函数
不要忘了简单实用的jQuery的utility函数。我最喜欢的是$.isFunction(), $isArray()和$.each()。

15. 为HTML块添加“JS”的class
当jQuery载入之后,首先给HTML添加一个叫”JS”的class
$('HTML').addClass('JS');
只有当用户启用JavaScript的时候,你才能添加CSS样式。例如
/* 在css中 */
.JS #myDiv{display:none;}
所以当JavaScript启用的时候,你可以将整个HTML内容隐藏起来,用jQuery来实现你想实现的(譬如:收起某些面板或当用户点击它们时展开)。而当Javascript没有启用的时候,浏览器呈现所有的内容,搜索引擎爬虫也会勾去所有内容。我将来会更多的使用这个技巧。

=================================================================
三、关于优化事件性能的建议
=================================================================

16. 推迟到$(window).load
有时候采用$(window).load()比$(document).ready()更快,因为后者不等所有的DOM元素都下载完之前执行。你应该在使用它之前测试它。

17. 使用Event Delegation
当你在一个容器中有许多节点,你想对所有的节点都绑定一个事件,delegation很适合这样的应用场景。使用Delegation,我们仅需要在父级绑定事件,然后查看哪个子节点(目标节点)触发了事件。当你有一个很多数据的table的时候,你想对td节点设置事件,这就变得很方便。先获得 table,然后为所有的td节点设置delegation事件:

  1. $("table").delegate("td","hover",function(){
  2. $(this).toggleClass("hover");
  3. });

复制代码

18.使用ready事件的简写
如果你想压缩js插件,节约每一个字节,你应该避免使用$(document).onready()

  1. / 也不要使用
  2. $(document).ready(function(){
  3. // 代码
  4. });
  5. // 你可以如此简写:
  6. $(function(){
  7. // 代码
  8. });

复制代码

=================================================================
四、测试jQuery
=================================================================

19. jQuery单元测试
测试JavaSript代码最好的方法就是人来测试。但你可以使用一些自动化的工具如SeleniumFuncunitQUitQMock来测试你的代码(尤其是插件)。我想在另外一个专题来讨论这个话题因为实在有太多要说的了。

20. 标准化你的jQuery代码
经常标准化你的代码,看看哪个查询比较慢,然后替换它。你可以用Firebug控制台。你也可以使用jQuery的快捷函数来使测试变得更容易些:

  1. // 在Firebug控制台记录数据的快捷方式
  2. $.l($('div'));
  3. // 获取UNIX时间戳
  4. $.time();
  5. // 在Firebug记录执行代码时间
  6. $.lt();
  7. $('div');
  8. $.lt();
  9. // 将代码块放在一个for循环中测试执行时间
  10. $.bm("var divs = $('.testdiv', '#pageBody');");// 2353 on Firebug 3.6

复制代码

=================================================================
五、其他常用jQuery性能优化建议
=================================================================

21. 使用最新版本的jQuery
最新的版本往往是最好的。更换了版本后,不要忘记测试你的代码。有时候也不是完全向后兼容的。

22. 使用HMTL5
新的HTML5标准带来的是更轻巧的DOM结构。更轻巧的结构意味着使用jQuery需要更少的遍历,以及更优良的载入性能。所以如果可能的话请使用HTML5。

23. 如果给15个以上的元素加样式时,直接给DOM元素添加style标签
要给少数的元素加样式,最好的方法就是使用jQuey的css()函数。然而更15个以上的较多的元素添加样式时,直接给DOM添加style 标签更有效些。这个方法可以避免在代码中使用硬编码(hard code)。

  1. $('<style type="text/css"> div.class { color: red; } </style>')
  2. .appendTo('head');

复制代码

24. 避免载入多余的代码
将Javascript代码放在不同的文件中是个好的方法,仅在需要的时候载入它们。这样你不会载入不必要的代码和选择器。也便于管理代码。

25. 压缩成一个主JS文件,将下载次数保持到最少
当你已经确定了哪些文件是应该被载入的,那么将它们打包成一个文件。用一些开源的工具可以自动帮你完成,如使用Minify(和你的后端代码集成)或者使用JSCompressorYUI Compressor 或 Dean Edwards JS packer等在线工具可以为你压缩文件。我最喜欢的是JSCompressor

26. 需要的时候使用原生的Javasript
使用jQuery是个很棒的事情,但是不要忘了它也是Javascript的一个框架。所以你可以在jQuery代码有必要的时候也使用原生的Javascript函数,这样能获得更好的性能。

27. 从Google载入jQuery框架
当你的应用正式上线的时候,请从Google CDN载入jQuery,因为用户可以从最近的地方获取代码。这样你可以减少服务器请求,而用户如果浏览其他网站,而它也使用Google CDN的jQuery时,浏览器就会立即从缓存中调出jQuery代码。

  1. // 链接特定版本的压缩代码
  2. <script type="text/javascript"src="[color=blue !important][url=https://ajax.googleapis.com/ajax/libs/jquery/1.5.0/jquery.min.js]https://ajax.googleapis.com/ajax/libs/jquery/1.5.0/jquery.min.js[/url]"></script>

复制代码

28. 缓慢载入内容不仅能提高载入速度,也能提高SEO优化 (Lazy load content for speed and SEO benefits)
使用Ajax来载入你的网站吧,这样可以节约服务器端载入时间。你可以从一个常见的侧边栏widget开始。

此文从CSDN-yangzhihello 那转载而来,很全面很给力,非常感谢,留作珍藏。啊哈哈~~~

<转载> Jquery的性能优化-实用!的更多相关文章

  1. 【转载】Spark性能优化指南——高级篇

    前言 数据倾斜调优 调优概述 数据倾斜发生时的现象 数据倾斜发生的原理 如何定位导致数据倾斜的代码 查看导致数据倾斜的key的数据分布情况 数据倾斜的解决方案 解决方案一:使用Hive ETL预处理数 ...

  2. 【转载】 Spark性能优化指南——基础篇

    转自:http://tech.meituan.com/spark-tuning-basic.html?from=timeline 前言 开发调优 调优概述 原则一:避免创建重复的RDD 原则二:尽可能 ...

  3. 【转载】Java性能优化之JVM GC(垃圾回收机制)

    文章来源:https://zhuanlan.zhihu.com/p/25539690 Java的性能优化,整理出一篇文章,供以后温故知新. JVM GC(垃圾回收机制) 在学习Java GC 之前,我 ...

  4. 【转载】PHP性能优化干货

    PHP优化对于PHP的优化主要是对php.ini中的相关主要参数进行合理调整和设置,以下我们就来看看php.ini中的一些对性能影响较大的参数应该如何设置. # vi /etc/php.ini (1) ...

  5. jQuery高级技巧——性能优化篇

      通过CDN(Content Delivery Network)引入jQuery库 要提升网站中javascript的性能的最简单的一步就是引入最新版本的jQuery库,新发布的版本通常在性能上会有 ...

  6. [转载]U3d常规性能优化技巧

    以下技巧并不是必须的,但是对于想要提升游戏性能的人来说应该还是很不错的. 优化的常规技巧 n 剖析你的游戏. 不要花费时间来优化那些晦涩的代码或者缩减图形文件的大小,除非这是你游戏的瓶颈.第一次剖析你 ...

  7. jquery前端性能优化(持续添加。。。)

    1.选择器的使用 (1)$('#id')   使用id来定位dom元素是性能最高的方法.jQuery底层将直接调用本地方法document.getElementById().如果id直接可以找到所要对 ...

  8. 【转载】 Spark性能优化:资源调优篇

    在开发完Spark作业之后,就该为作业配置合适的资源了.Spark的资源参数,基本都可以在spark-submit命令中作为参数设置.很多Spark初学者,通常不知道该设置哪些必要的参数,以及如何设置 ...

  9. jQuery代码性能优化

    代码优化是一个很重要的开发态度,一点点的优化对于程序来讲可能是微乎其微的,但是把所有的一点都加起来就能够达到水滴石穿的效果,所以要在平时的开发过程中养成优化代码的好习惯. 1. 检测元素是否存在 避免 ...

随机推荐

  1. Yii添加验证码

    添加带验证码的登陆: 1.先在模型modules下的LoginForm.php定义一个存储验证码的变量:public $verfyCode: 2.然后在rules()方法里定义:array('veri ...

  2. 万字总结:学习MySQL优化原理(转)

    本文转自:https://www.tuicool.com/wx/2eMBfmq 前言 说起MySQL的查询优化,相信大家收藏了一堆奇技淫巧:不能使用SELECT *.不使用NULL字段.合理创建索引. ...

  3. java 发送html邮件,苹果或者某些邮件客户端收到的内容为空白解决方案

    需要把网页标签中的双引号替换为  "  或者  \\\" 例如 <div id=\\\"container\\\" style=\\\"widt ...

  4. SDWebImage源代码解析(一)

    一.概念 SDWebImage是一个开源的第三方库,它提供了UIImageView的一个分类.以支持从远程server下载并缓存图片的功能. 二.优势 自从iOS5.0開始.NSURLCache也能够 ...

  5. CSS之Position全面认识

    CSS的很多其他属性大多容易理解,比如字体,文本,背景等.有些CSS书籍也会对这些简单的属性进行大张旗鼓的介绍,而偏偏忽略了对一些难缠的属 性讲解,有避重就轻的嫌疑.CSS中主要难以理解的属性包括盒型 ...

  6. 【精】iOS GCD 具体解释

    一.介绍 1.什么是GCD? Grand Central Dispatch.是苹果公司开发的一套多核编程的底层API. GCD首次公布在Mac OS X 10.6,iOS4及以上也可用.GCD存在于l ...

  7. nginx php 使用unix socket 还是tcp?

    两种通信方式的分析和总结 从原理上来说,unix socket方式肯定要比tcp的方式快而且消耗资源少,因为socket之间在nginx和php-fpm的进程之间通信,而tcp需要经过本地回环驱动,还 ...

  8. SpringCloud系列六:Eureka的自我保护模式、IP选择、健康检查

    1. 回顾 前面讲了很多Eureka的用法,比如Eureka Server.Eureka Server的高可用.Eureka Server的用户认证(虽然未完全实现).元数据等, 这章将讲解剩下的自我 ...

  9. html5在移动端的屏幕适应性问题

    html5在移动端的屏幕适应性问题 Html5 以前是最最炙手可热的技术.移动端也由于html5技术的增加变得更加变通一些.人人都喜欢"Write once.run more",但 ...

  10. 448. Find All Numbers Disappeared in an Array【easy】

    448. Find All Numbers Disappeared in an Array[easy] Given an array of integers where 1 ≤ a[i] ≤ n (n ...