成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Web最佳實踐:JQuery高性能優(yōu)化

開發(fā) 前端
使用JQuery時,你可以使用多種選擇器,選擇同一個元素,各種方法之間的性能是不一樣的,有時候差異會特別大。 通常比較常用的選擇器有以下幾個……

使用***選擇器

使用JQuery時,你可以使用多種選擇器,選擇同一個元素,各種方法之間的性能是不一樣的,有時候差異會特別大。 通常比較常用的選擇器有以下幾個:

  1. ID選擇器 $("#id")

  2. 標(biāo)簽選擇器 $("td")

  3. 類選擇器 $(".target")

  4. 屬性選擇器 $("td[target='target']")

  5. 偽類選擇器 $("td:hidden")

根據(jù)經(jīng)驗,我們應(yīng)該知道這5種選擇器的性能是依次下降的,我們不妨來做個測試,看看他們的性能到底有多大差異:

  • 測試html片段:

  1. <table width="98%" cellspacing="1" cellpadding="0" border="0" style="table-layout:fixed" id="mytable"> 
  2.   <tr> 
  3.     <td bgcolor="#aaaaaa" align="center" class="target" target="target" style="display:none;" id="target-td">e</td> 
  4.   </tr> 
  5. </table> 

測試結(jié)果

  • 測試方案:對每個腳本執(zhí)行1w次,統(tǒng)計3次運行結(jié)果的平均值

方案 IE6 IE7 IE8 IE9 chrome firefox opera safari
$("#mytable td.target") 5150 5630 780 293 69 148 31 102
$("#mytable .target") 5320 5780 940 297 61 141 32 101
$("#mytable").find("td.target") 4840 5000 1250 387 95 205 73 157
$("#mytable").find(".target") 5000 5150 1400 226 49 130 60 64
$("#mytable td[target=target]") 16410 17660 940 406 89 166 35 120
$("#mytable td:hidden") 25000 26720 23750 3638 632 1123 3434 569
$("#target-td") 630 620 310 62 9 28 12 18
$(".target") 10310 10790 940 207 36 181 47 44
document.getElementById("target-td") 150 150 160 6 1 1 5 2

結(jié)論

  1. 原生方法是最快的方法,如果可能,盡量選擇用原生

  2. 性能順序:ID選擇器 > 標(biāo)簽選擇器 > 類選擇器 > 屬性選擇器 > 偽類選擇器

  3. ID(getElementById)、標(biāo)簽選擇器(getElementsByTagName)都有原生的方法對應(yīng),所以很快;類選擇器在除了IE5-IE8之外的主流瀏覽器幾乎都有原生方法(getElementsByClassName)

  4. 為了兼顧IE6、7、8的性能,避免使用全局的類選擇器;

  5. 屬性和偽類選擇器非常慢,如非必要,盡量少使用偽類選擇器和屬性選擇器

***實踐

  1. 為模塊中操作最頻繁的元素和根元素設(shè)置id,然后緩存;

  2. 對沒有id的元素檢索,盡量采用路徑最短的祖先元素id作為默認的搜索范圍,并采用純類選擇器或者標(biāo)簽選擇器;

  3. 盡量避免復(fù)雜的選擇器

避免執(zhí)行全局查找

  1. $("div.bizHelp"); 

=>

  1. $("#container").find(".bizHelp"); 

保證查詢的路徑最短,性能***,參照***條;

避免對空結(jié)果進行操作

對于數(shù)量為0的選擇結(jié)果,JQuery會執(zhí)行默認動作,并且不會報錯,這會影響程序的性能。

  1. var blank=$(".blank");//length=0 

A :

  1. blank.slideUp(); 

B:

  1. blank.length && blank.slideUp(); 

測試結(jié)果

  • 測試說明:1w次執(zhí)行耗時,單位毫秒/ms,統(tǒng)計三次運行的平均值

方案 IE6 IE7 IE8 IE9 chrome firefox opera safari
A 6110 5610 1344 488 103 194 108 155
B 0 0 0 0 0 0 0 0

結(jié)論

應(yīng)該避免對空對象進行操作; 

采用樣式表,避免多次調(diào)整樣式

對一個對象應(yīng)用多個樣式,***采用樣式表的方式,避免多次應(yīng)用。

  1. var obj=$("#obj"); 
  • A:

  1. obj.css("width",200);  
  2. obj.css("height",200);  
  3. obj.css("background":"#eee"); 
  • B:

  1. obj.attr("style","width:200px;height:200px;background:#eee;");  
  • C:

  1. .css-operation{width:200px;height:200px;background:#eee;}  
  2. obj.addClass("css-operation"

測試結(jié)果

  • 測試說明:1w次執(zhí)行耗時,單位毫秒/ms,統(tǒng)計三次運行的平均值

方案 IE6 IE7 IE8 IE9 chrome firefox opera safari
A 2594 2486 1500 501 163 222 190 191
B 1000 953 547 190 79 28 15 86
C 843 672 407 111 21 17 16 31

結(jié)論

  1. 性能排序:C>B>A

  2. 樣式和JS分離的方案性能***,適用于要同時設(shè)置多個樣式的場景;

  3. 如果只應(yīng)用單個樣式,簡單起見可以考慮采用方案A

  4. 如果應(yīng)多若干個樣式,而且不愿意新建一個css class,可以采用B;

#p#

避免使用匿名函數(shù)

大量的使用匿名函數(shù)會對程序的調(diào)試、維護以及通過第三方軟件來做性能測試增加難度,因此應(yīng)該盡量避免大量的使用匿名函數(shù)

  1. obj.click(function(){  
  2.   //do something...  
  3. })  

=>>

  1. var clickHandler=function(){  
  2.   //do something...  
  3. }  
  4. obj.click(clickHandler)  

大循環(huán)采用更高效的遍歷方式

JQuery提供了$.fn.each()和$.each()兩個方法來實現(xiàn)對集合的遍歷,除此之外,還可以采用JS原生的for循環(huán)、while等來實現(xiàn)迭代,應(yīng)該了解一下他們之間的性能差異:

  1. var list=ul.find("li"),e;  
  • A:

  1. var i=list.length;  
  2. while(i--){  
  3.     e=$(list[i])  
  4. }  
  • B:

  1. list.each(function(){  
  2.   e=$(this);  
  3. });  
  • C:

  1. $.each(list,function(){  
  2.   e=$(this);  
  3. });  

測試結(jié)果

  • 測試說明:1w次執(zhí)行耗時,單位毫秒/ms,統(tǒng)計三次運行的平均值

方案 IE6 IE7 IE8 IE9 chrome firefox opera safari
A 172 219 157 30 3 5 4 6
B 219 234 203 41 4 6 5 8
C 219 234 187 52 3 4 5 7

結(jié)論

  1. 總體上來說A>C>B

  2. 方案A有大約25%的性能提升,但是不穩(wěn)定;

  3. 在IE瀏覽器下B方案和C方案性能相當(dāng),A方案有比較絕對的優(yōu)勢;

  4. Chrome、firefox下A方案的性能不穩(wěn)定;

***實踐

  1. 追求***性能,用方案A;

  2. 循環(huán)數(shù)量少的話,建議使用方案C,比較穩(wěn)定;

優(yōu)先使用原生屬性

很多常用的屬性,比如id、name等都被瀏覽器原生實現(xiàn),在JQuery中我們有時會用$(this).attr("id")的方式來獲取id,這種方法的效率相比原生屬性的獲取效率而言,非常慢。

  1. $.each(list,function(){  
  2.   //A  
  3.   var id=$(this).attr("id");  
  1.   //B  
  2.   var id=this.id;  
  3. })  

測試結(jié)果

  • 測試說明:10w次執(zhí)行耗時,單位毫秒/ms,統(tǒng)計三次運行的平均值

方案 IE6 IE7 IE8 IE9 chrome firefox opera safari
A 6880 7030 4220 1188 157 244 133 135
B 310 310 150 27 4 5 17 3

結(jié)論

  1. 使用原生的API,可以極大的提高性能

***實踐

  1. 對于id等常用的屬性,用原生的屬性,不要通過attr去獲取;

使用事件委托

經(jīng)常會遇到給一個列表中所有元素添加點擊事件的業(yè)務(wù)場景,傳統(tǒng)的做法是得到這個列表的JQuery對象:$("li"),然后添加click事件:

  1. $("li").click(function(){})  

這種方法的在列表數(shù)量比較大的時候會有嚴(yán)重的性能問題,應(yīng)該值得關(guān)注。JQuery在很早的版本中已經(jīng)引入了事件委托機制,可以很大程度的降低添加事件監(jiān)聽的消耗和內(nèi)存的消耗。

對1w條記錄的列表進行測試:

  • A:

  1. var list=$("li");//length>1  
  2.   list.click(function(){  
  3. })  
  • B:

  1. $("ul").delegate("li","click",function(){})  

測試結(jié)果

  • 測試說明:對1w個<li>標(biāo)簽進行click事件添加的耗時,單位毫秒/ms,統(tǒng)計三次運行的平均值

方案 IE6 IE7 IE8 IE9 chrome firefox opera safari
A 2156 2172 1922 312 103 173 141 117
B 0 0 0 0 0 0 0 0

結(jié)論

  1. 委托的性能優(yōu)勢是非常絕對的;

***實踐

  1. 對于需要同時給兩個以上的同類型元素添加事件時,用方案B來代替A

#p#

緩存查找的中間結(jié)果

  1. $(".list-item").show();  
  2. $(".list-item").hide();  

=>

  1. var listItem=$(".list-item");  
  2. listItem.show();  
  3. listItem.hide();  

減少DOM操作,盡量批量更新

Dom操作是瀏覽器操作中最為耗時的操作之一,JQuery中提供了append、appendTo、prepend、prependTo、after、before、insertAfter、wrap等操作dom的實用方法,頻繁使用這些方法可能會引起性能問題,一個提高性能的實踐原則就是“盡可能少的使用它們”。 如果一定要用到,也盡可能的采用合并、批量操作來減少dom的操作消耗。

使用$.data 而不是$.fn.data

  1. $(elem).data(key,value);  
  2. $.data(elem,key,value);  

后者比前者快近10倍

可能的話,使用***版本的JQuery

新版本總會對性能進行改進,還會提供一些非常好用的工具,如果可以的話,應(yīng)該盡量選用***的版本;

jQuery html性能大坑

jQuery的html方法的作用是為dom元素設(shè)置innerHTML,分析html的源代碼(1.8.3)

  1. if ( elem.nodeType === 1 ) {  
  2.     jQuery.cleanData( elem.getElementsByTagName( "*" ) );  
  3.     elem.innerHTML = value;  
  4. }  

在設(shè)置dom的innerHTML之前,會執(zhí)行jQuery.cleanData,這個方法會對dom元素做一些clean的處理,如removeEvent,刪除緩存等。

以兩百行的列表為例,在ff瀏覽器中,該方法會執(zhí)行大約5ms到8ms。即當(dāng)dom元素為空時和dom元素中有兩百行數(shù)據(jù)時,執(zhí)行html方法,后者會比前者多運行5ms到8ms。

坑點

cleanData方法在jQueryUI中也會定義,且會重寫$.cleanData,增加一些額外的操作,性能會受到影響。

還是以兩百行的列表為例,在ff瀏覽器中,該方法會執(zhí)行大約60ms到70ms。即當(dāng)dom元素為空時和dom元素中有兩百行數(shù)據(jù)時,執(zhí)行html方法,后者會比前者多運行60ms到70ms。

解決方案

1. 采用原生的dom.innerHTML

2.在執(zhí)行html()方法之前,先執(zhí)行remove()方法

原文鏈接:http://andashu.blog.51cto.com/8673810/1375329

責(zé)任編輯:林師授 來源: 51CTO博客
相關(guān)推薦

2010-07-06 09:07:09

2018-01-12 14:37:34

Java代碼實踐

2017-03-01 20:53:56

HBase實踐

2016-11-17 09:00:46

HBase優(yōu)化策略

2019-05-21 09:40:47

Elasticsear高性能 API

2011-08-18 11:05:21

jQuery

2019-03-14 15:38:19

ReactJavascript前端

2011-08-11 09:45:25

2012-12-24 09:55:15

JavaJava WebJava優(yōu)化

2020-07-16 08:06:53

網(wǎng)關(guān)高性能

2011-09-20 10:41:45

Web

2013-07-31 10:17:44

備份災(zāi)備

2013-07-31 09:55:51

高性能備份災(zāi)備

2025-04-11 03:00:55

2014-12-17 09:46:30

AndroidListView最佳實踐

2019-03-01 11:03:22

Lustre高性能計算

2010-04-20 09:14:33

Struts

2023-09-13 08:00:00

JavaScript循環(huán)語句

2014-12-10 10:12:02

Web

2013-06-09 15:31:35

jQueryjQuery優(yōu)化性能優(yōu)化
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 久久丁香 | 黄一区二区三区 | 无码国模国产在线观看 | 日韩一区二区三区在线观看视频 | 欧美性生活一区二区三区 | 婷婷丁香在线视频 | 成人视屏在线观看 | 国产免费一区二区三区免费视频 | 日本精品一区二区三区四区 | 国产极品91 | 成人在线中文 | 久久中文字幕一区 | 99久久精品一区二区成人 | 亚洲一二三区精品 | 国产精品高潮呻吟久久aⅴ码 | 日本特黄a级高清免费大片 国产精品久久性 | 在线观看成人精品 | 亚洲免费观看视频网站 | 伦理午夜电影免费观看 | 国产精品视频一区二区三区, | 天天视频成人 | 蜜桃av鲁一鲁一鲁一鲁 | 日美女逼逼 | 日本一区二区三区四区 | 日韩蜜桃视频 | 国产成人综合一区二区三区 | 成人在线免费 | 成人欧美一区二区三区黑人孕妇 | 国产精品久久久久久久午夜 | 欧美视频网 | 国产一区三区在线 | 久久成人精品一区二区三区 | 国产精品三级 | 91av在线视频观看 | 91免费小视频 | 国产在线不卡视频 | 成人精品国产一区二区4080 | 日本不卡在线观看 | 亚洲精品免费在线观看 | 狠狠影院 | 成人影院网站ww555久久精品 |