jQuery 做好七件事帮你提升jQuery的性能

1. Append Outside of Loops

凡是触及到DOM都是有代价的。如果你向DOM当中附加大量的元素,你会想一次性将它们全部附加进来,而不是分多次进行。当在循环当中附加元素就会产生一个常见的问题。

1 $.each( myArray, function( i, item ) {
2
3     var newListItem = "<li>" + item + "</li>";
4
5     $( "#ballers" ).append( newListItem );
6
7 });

一个常用的技巧是利用文档片段(document fragment)。在循环的每一次迭代当中,将元素附加到片段而不是DOM元素当中。当循环结束后,将片段附加到DOM元素当中即可。

 1 var frag = document.createDocumentFragment();
 2
 3 $.each( myArray, function( i, item ) {
 4
 5     var newListItem = document.createElement( "li" );
 6     var itemText = document.createTextNode( item );
 7
 8     newListItem.appendChild( itemText );
 9
10     frag.appendChild( newListItem );
11
12 });
13
14 $( "#ballers" )[ 0 ].appendChild( frag );

另一个简单的技巧是在循环的每次迭代当中,持续构建一个字符串。当循环结束后,将DOM元素的HTML设置成该字符串。

1 var myHtml = "";
2
3 $.each( myArray, function( i, item ) {
4
5     myHtml += "<li>" + item + "</li>";
6
7 });
8
9 $( "#ballers" ).html( myHtml );

当然还有其它一些技巧可以供你尝试。一个名为 jsperf 的站点为测试这些性能提供了一条好的出路。该网站允许你使用基准测试每一个技巧,并将其跨平台的性能测试结果可视化的展现出来。

2. Cache Length During Loops

在for循环当中,不要每次都访问数组的 length 属性;应当事先将其缓存起来。

1 var myLength = myArray.length;
2
3 for ( var i = 0; i < myLength; i++ ) {
4
5     // do stuff
6
7 }

3. Detach Elements to Work with Them

操作DOM是缓慢的,因此你想尽可能减少对齐进行操作。jQuery在1.4版本当中引入了名为 detach() 的方法来帮助解决这一问题,它允许你在对元素进行操作时,将它们从DOM当中分离出来。

1 var $table = $( "#myTable" );
2 var $parent = $table.parent();
3
4 $table.detach();
5
6 // ... add lots and lots of rows to table
7
8 $parent.append( $table );

4. Don’t Act on Absent Elements

如果你正打算在一个空的选择器上运行大量的代码,jQuery并不会给予任何的提示 -- 它将会继续的执行,就像是没有发生任何的错误。必须由你来验证选择器包含了多少元素。

 1 // Bad: This runs three functions before it
 2 // realizes there‘s nothing in the selection
 3 $( "#nosuchthing" ).slideUp();
 4
 5 // Better:
 6 var $mySelection = $( "#nosuchthing" );
 7
 8 if ( $mySelection.length ) {
 9
10     $mySelection.slideUp();
11
12 }
13
14 // Best: Add a doOnce plugin.
15 jQuery.fn.doOnce = function( func ) {
16
17     this.length && func.apply( this );
18
19     return this;
20
21 }
22
23 $( "li.cartitems" ).doOnce(function() {?
24
25     // make it ajax! \o/?
26
27 });

本指南特别适用于那些当选择器不包含元素时还需要大量的开销的 jQuery UI 部件。

5. Optimize Selectors

选择器的优化和过去比起来并不是那么的重要,因为很多浏览器都实现了 document.querySelectorAll() 方法并且jQuery将选择器的负担转移到了浏览器上面。但是仍然有一些技巧需要铭记在心。

基于ID的选择器

以一个ID作为选择器的开始总是最好的。

1 // Fast:
2 $( "#container div.robotarm" );
3
4 // Super-fast:
5 $( "#container" ).find( "div.robotarm" );

采用 .find() 方法的方式将更加的快速,因为第一个选择器已经过处理,而无需通过嘈杂的选择器引擎 -- ID-Only的选择器已使用 document.getElementById() 方法进行处理,之所以快速,是因为它是浏览器的原生方法。

特异性

尽量详细的描述选择器的右侧,对于左侧则应反其道而行之。

1 // Unoptimized:
2 $( "div.data .gonzalez" );
3
4 // Optimized:
5 $( ".data td.gonzalez" );

尽量在选择器的最右侧使用 tag.class 的形式来描述选择器,而在左侧则尽量只使用 tag 或者 .class 。

避免过度使用特异性

1 $( ".data table.attendees td.gonzalez" );
2
3 // Better: Drop the middle if possible.
4 $( ".data td.gonzalez" );

去讨好“DOM”总是有利于提升选择器的性能,因为选择器引擎在搜寻元素时无需进行太多的遍历。

避免使用通用选择器

如果一个选择器明确或暗示它能在不确定的范围内进行匹配将会大大影响性能。

1 $( ".buttons > *" ); // Extremely expensive.
2 $( ".buttons" ).children(); // Much better.
3
4 $( ".category :radio" ); // Implied universal selection.
5 $( ".category *:radio" ); // Same thing, explicit now.
6 $( ".category input:radio" ); // Much better.

6. Use Stylesheets for Changing CSS on Many Elements

假如你使用 .css() 方法来改变超过20个元素的CSS,应当考虑为页面添加一个样式标签作为替代,这样做可以提升将近60%的速度。

1 // Fine for up to 20 elements, slow after that:
2 $( "a.swedberg" ).css( "color", "#0769ad" );
3
4 // Much faster:
5 $( "<style type=\"text/css\">a.swedberg { color: #0769ad }</style>")
6     .appendTo( "head" );

7. Don’t Treat jQuery as a Black Box

把jQuery的源码当成文档,可以把它(http://bit.ly/jqsource)保存在你的收藏夹内,经常的查阅参考。

时间: 2024-12-25 00:06:18

jQuery 做好七件事帮你提升jQuery的性能的相关文章

想提升工作效率,就別再做这七件事

试想一位小公司老板每日孜孜不倦地工作,为何不能从为数众多的竞争者脱颖而出? 一位创业家可以不眠不休一天工作24 小时,整整一周不休假. 然而,时间有限,且竞争者却永远可以投入更多钱与心力,让竞争更剧烈.那么,为什么某些小型新创公司可以完成许多大型企业无法完成的事情呢? ●Instagram──只有13 名员工却被Facebook 用几十亿买下的公司. ●Snapchat──只有30 名员工却拒绝科技巨人Facebook.Google 的并购交易. 它们的成功部分来自于幸运──其余则是因为效率 .

新手学习SEO要做的七件事是什么?

学习SEO可能不那么先进的编程,学习SEO不可能掌握网页设计,学习SEO不需要学习SEO DIV + CSS;不是一个困难的任务,但是在学习过程中,如果你想掌握SEO,那么我们要做的几件事. 1.学习SEO需要持之以恒的精神.为什么 ?学习SEO要有持之以恒的精神?SEO是一个长期的工作,因为它是与搜索引擎这个工作密切相关,搜索引擎收录站点,将继续增加网站的权重,可以提高网站关键词的排名,这是一个不变的算法.所以即使我们有一个强大的SEO技巧,我们仍然需要更新网站内容,不断优化网站的布局,继续发

创业的时候只能专心致志做好一件事。什么叫“一件事”?只能开发一个游戏,只能做一个产品

著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:王统伟链接:http://www.zhihu.com/question/19550531/answer/15183706来源:知乎 这是我在商界招商网看到天使投资人曾李青(原腾讯公司五位创始人之一)对早期创业公司的看法 ,觉得对你蛮有帮助的,你可以参考下!曾李青:早期创业公司九种死法第一,跨行业创业 比如原来做游戏的人要做电商,原来做互联网社区的要做游戏.现在的互联网环境下,这种跨行业创业失败概率都会比较高. 在演讲中,他

绿色呼吸——把它当成生命的一部分,才能做好这件事

绿色呼吸,这是一首歌,这不仅仅是一首歌,是我们梦寐以求的家园梦,面对现如今环境的窘境,我们又该怎么做?pm2.5的来势凶猛,土壤的破坏,等等一系列的环境问题,科技显得尤为重要,太原罗克佳华董事长李玮曾说过这样一句话:“年轻人做事情,要想法简单一些.专注做一件事儿,总能够做好.人最怕的是有激情没有坚持,坚持的没有形成习惯,只有形成习惯,把它当成生命的一部分,才能做好这件事.”这不正是所有人都应该有的一种态度吗?不能像李玮一样将互联网与环保结合深入基层,但渺小的我们至少可以乘着歌词的美好意境,借着高

做好一件事的三要素

做一件事很难,要做好一件事就更难了,影响的因素太多了.今天就谈一谈我认为要做好一件事情的三个基本要素,供大家参考. 1.心态 能否做好一件事,心态有着决定性作用. 在做事的时候,必须切实行动,不能抱着试一试的心态,如果是这种心态,那么最终都会以失败而告终. 试一试的心态更多的是一种借口,在还没有做之前,我们就给自己找好了退路,因为失败了,我只是试一试而已.所以做事情只有两个选择:做或者不做,并不存在试一试这种中间态. 科比曾经说过:"总有人成功,为什么那个人不是我?",因为这种心态,科

安装 CentOS 7 后必做的七件事

原文 安装 CentOS 7 后必做的七件事 CentOS 是最多人用来运行服务器的 Linux 版本,最新版本是 CentOS 7.当你兴趣勃勃地在一台主机或 VPS 上安装 CentOS 7 后,首要的工作肯定是加强它的安全性,以下列出的七件事,是你进一步配置系统和安装其他软件前必须做的. 1. 更改 root 密码 若果你是自行安装 CentOS 7 的话,安装程序会让你自行设定 root 的密码.不过很多 VPS 服务商只会提供预先安装好的 CentOS 7 映像档,这种情况下他们会透过

安装完CentOS 7 后必做的七件事

CentOS是最多人用来运行服务器的 Linux 版本,最新版本是 CentOS 7.当你兴趣勃勃地在一台主机或 VPS 上安装 CentOS 7 后,首要的工作肯定是加强它的安全性,以下列出的七件事,是你进一步配置系统和安装其他软件前必须做的. 1. 更改 root 密码 若果你是自行安装 CentOS 7 的话,安装程序会让你自行设定 root 的密码.不过很多 VPS 服务商只会提供预先安装好的 CentOS 7 映像档,这种情况下他们会透过主控界面告诉你 root 的密码,这个密码的安全

javascript你应该知道的七件事

Javascript发展到今天,很高兴看到她的成功.曾经好多人都这么说:写程序这么多年,现在最看不懂的程序是javascript!javascript虽然是一种弱类型语言,但是她却有着"高贵"的理论.下面是学习javascript过程中的一些小激动时刻,记录下来,大家可以跟我一起感受. 缩略标记 在创建对象和数组的过程中可以使用缩略标记.过去,我们需要创建一个对象时,我们会这样写: var car =new Object(); car.colour ='red'; car.wheels

安裝 CentOS 7 後必做的七件事

CentOS 是最多人用來運行伺服器的 Linux 版本,最新版本是 CentOS 7.當你興趣勃勃地在一台主機或 VPS 上安裝 CentOS 7 後,首要的工作肯定是加強它的安全性,以下列出的七件事,是你進一步配置系統和安裝其他軟件前必須做的. 1. 更改 root 密碼 若果你是自行安裝 CentOS 7 的話,安裝程序會讓你自行設定 root 的密碼.不過很多 VPS 服務商只會提供預先安裝好的 CentOS 7 映像檔,這種情況下他們會透過主控界面告訴你 root 的密碼,這個密碼的安