精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

精益求精 jQuery代碼的分析與優化

開發 前端
,QQ群里就看到有人求助優化一段jQuery代碼,簡單看了一下,發現如果對jQuery這東西只停留在用的層面,而不知其具體實現的話,真的很容易用出問題來。這也是為什么近期我一直不怎么推崇用jQuery,這框架的API設定就有誤導人們走上歧途之嫌。

今天剛回家,QQ群里就看到有人求助優化一段jQuery代碼,簡單看了一下,發現如果對jQuery這東西只停留在用的層面,而不知其具體實現的話,真的很容易用出問題來。這也是為什么近期我一直不怎么推崇用jQuery,這框架的API設定就有誤導人們走上歧途之嫌。

需要優化的代碼大致是這樣的,也不方便直接把人家的代碼復制過來,就大概地表達下意思:

  1. $.fn.beautifyTable = function(options) {  
  2. //定義默認配置項,再用options覆蓋  
  3. return this.each(function() {  
  4. var table = $(this),  
  5. tbody = table.children('tbody'),  
  6. tr = tbody.children('tr'),  
  7. th = tbody.children('th'),  
  8. td = tbody.children('td');  
  9. //單獨內容的class  
  10. table.addClass(option.tableClass);  
  11. th.addClass(options.headerClass); //1  
  12. td.addClass(options.cellClass); //2  
  13. //奇偶行的class  
  14. tbody.children('tr:even').addClass(options.evenRowClass); //3  
  15. tbody.children('tr:odd').addClass(options.oddRowClass); //4  
  16. //對齊方式  
  17. tr.children('th,td').css('text-align', options.align); //5  
  18. //添加鼠標懸浮  
  19. tr.bind('mouseover', addActiveClass); //6  
  20. tr.bind('mouseout', removeActiveClass); //7  
  21. //點擊變色  
  22. tr.bind('click', toggleClickClass); //8  
  23. });  
  24. }; 

總的來說,這段代碼不錯,思路清晰,邏輯明確,想要做什么也通過注釋說得很明白了。但是按作者的說法,當表格中有120行時,IE已經反映腳本運行時間過長了。顯然從表現來看,這個函數的效率不高,甚至說極其低下。

尋找原因

于是,開始從代碼層面進行分析,這是一個標準的jQuery插件式的函數,有個典型的return this.each(function() { ... };);形式的代碼,如果作者寫下這段代碼的時候,不是照本宣科不經思考的話,就應該意識到jQuery的一個函數干了什么事。

簡單來說,jQuery.fn下的函數,絕大部分是一個each的調用,所謂each,自然是對選擇出來的元素進行了遍歷,并對某個元素進行了指定的操作。那么看看上面一段代碼,進行了多少的遍歷,在此就假設只選擇了120行,每一行有6列,另加上1行的表頭吧:

  • ·  遍歷th,添加headerClass,元素數為6。
  • ·  遍歷td,添加cellClass,元素數為6*120=720。
  • ·  從所有tr中找出奇數的,需要對所有tr進行一次遍歷,元素數為120。
  • ·  遍歷奇數的tr,添加evenRowClass,元素數為120/2=60。
  • ·  從所有tr中找出偶數的,需要對所有tr進行一次遍歷,元素數為120。
  • ·  遍歷偶數的tr,添加oddRowClass,元素數為120/2=60。
  • ·  遍歷所有th和td,添加text-align,元素數為120*6+6=726。
  • ·  遍歷所有tr,添加mouseover事件,元素數為120。
  • ·  遍歷所有tr,添加mouseout事件,元素數為120。
  • ·  遍歷所有tr,添加click事件,元素數為120。

為了方便,我們簡單地假設,在遍歷中訪問一個元素耗時為10ms,那么這個函數一共用了多少時間呢?這個函數共遇上了2172個元素,耗時21720ms,即21秒,顯然IE確實應該報腳本執行過久了。

基本優化

知道了效率低下的原因,要從根本上進行解決,自然要想方設法來合并循環,初略一看,按照上邊代碼中注釋里的數字,至少以下幾點是可以合并的:

  • ·  3和4可以合并為一次循環,從120+60+120+60變為120,減少了240。
  • ·  1、2和5可以合并為一次循環,從6+720+726變為726,減少了726。
  • ·  6、7、8可以合并為一次循環,從120+120+120變為120,減少了240。
  • ·  進一步的,3、4和6、7、8一樣可以合并為一次循環,繼續減少了120。

累加一下,我們一共減少了240+726+240+120=1326次元素操作,總計13260ms。在優化之后,我們的函數耗時變為21720-13260=8460ms,即8s。

注意選擇器

到這里可能會有一個疑問,從表格的結構上來說,所有的th和td元素肯定都在tr之內,那么為什么不將1、2、5這三步的循環同樣放到對tr的循環中,形成一個嵌套的循環,這樣不是更加快速嗎?

這里之所以沒有這么做,主要有2個原因:

其一,無論將1、2、5這三者放在哪里,都不會減少對所有th和td元素的一次訪問。

另一方面,$('th,td')這個選擇器,在sizzle中會被翻譯成2次getElementsByTagName函數的調用,***次獲取所有th,第二次獲取所有td,然后進行集合的歸并。由于getElementsByTagName是內置函數,在此可以認為該函數是不帶循環的,即復雜度為O(1),同樣集合的歸并使用Array的相關函數,是對內存的操作,復雜度同樣為O(1)。

反之,如果在對tr元素的循環中再采用$('th,'td)這個選擇器,則是在tr元素上調用2次getElementsByTagName,由于無論在哪個元素上調用該函數,函數執行的時間是相同的,因此在循環tr時使用,反而多出了119*2次的函數調用,效率不升反降。

可見,對sizzle選擇器的基本知識,也是幫助優化jQuery代碼的很重要的一方面。

不要啥都讓JavaScript來做

根據前面的基本的優化,已經將時間從21秒降到了8秒,但是8秒這個數字顯然是無法接受的。

再進一步分析我們的代碼,事實上,循環遍歷是語言層面上的內容,其速度應該是相當快的。而針對每個元素所做的操作,是jQuery提供的函數,相比遍歷來說,才是占去大部分資源的主子。如果說遍歷中訪問元素用時是10ms的話,不客氣地說執行一個addClass至少是100ms級別的消耗。

因此,為了進一步地優化效率,就不得不從減少對元素的操作入手。再仔細地回審代碼,發現這個函數有著非常多的對樣式的修改,其中至少包括了:

  • ·  給所有th加上class。
  • ·  給所有td加上class。
  • ·  給tr分奇偶行加上class。
  • ·  給所有th和td加上一個text-align樣式。

而事實上我們知道,CSS本身就擁有子代選擇器,而瀏覽器原生對CSS的解析,效率遠遠高于讓javascript去給元素一一加上class。

所以,如果對CSS是可控的,那么這個函數就不應該擁有headerClass、cellClass這兩個配置項,而是盡可能地在CSS中進行配置:

  1. .beautiful-table th { /* headerClass的內容 */ }  
  2. .beautiful-table td { /* cellClass的內容 */ } 

再者,對于tr的奇偶行樣式,在部分瀏覽器下可以使用:nth-child偽類來實現,這方面可以利用特性探測,僅在不支持該偽類的瀏覽器中使用addClass添加樣式。當然如果你僅僅想對IE系列進行優化的話,這一條可以忽略了。

對于:nth-child偽類的探測,可以用以下的思路來進行:

  • ·  創建一個stylesheet,再創建一條規則,如#test span:nth-child(odd) { display: block; }。
  • ·  創建相應的HTML結構,一個id為test的div,內部放置3個span。
  • ·  將stylesheet和div一同加入的DOM樹中。
  • ·  查看第1和第3個span的運行期display樣式,如果是block,則表明支持該偽類。
  • ·  刪除創建的stylesheet和div,別忘了緩存探測的結果。

***,對于給所有th和td元素添加text-align樣式,也是可以通過css進行優化的。既然不知道添加的是哪個align,那么就多寫幾個樣式:

  1. /* CSS樣式 */ 
  2. .beautiful-table-center th,.beautiful-table-center td { text-align: center !important; }  
  3. .beautiful-table-right th,.beautiful-table-right td { text-align: right !important; }  
  4. .beautiful-table-left th,.beautiful-table-left td { text-align: left !important; }  
  5. /* javascript */ 
  6. table.addClass('beautiful-table-' + options.align);  

當然,上面所說的優化,是建立在對CSS有控制權的情況下的,如果本身無法接觸到CSS樣式,比如這是一個通用的插件函數,會被完全無法控制的第三方使用,那么怎么辦呢?也不是完全沒有辦法:

  • ·   去找頁面里的所有CSS規則,比如document.styleSheets。
  • ·   遍歷所有規則,把配置項中的headerClass、cellClass等拿出來。
  • ·   提取需要的幾個class中的所有樣式,再自己組裝成新的選擇器,如beautiful-table th。
  • ·   使用創建出來的選擇器,生成新的stylesheet,加入到DOM樹中。
  • ·   那么只給table加上beautiful-table這個class就搞定了。

當然上面的做法其實也蠻消耗時間的,畢竟又要遍歷stylesheet,又要創建stylesheet。具體是不是對效率提升有很大的幫助,則依據頁面的規模會有不同的效果,是否使用就要看函數設計人員的具體需求了,這里也就是提一種策略。

總的來說,通過盡可能少地執行javascript,將更多的樣式化的任務交給CSS,則瀏覽器的渲染引擎來完成,又可以進一步地優化該函數,假設對addClass、css的調用需要100ms的話,此次優化直接消滅了原有120+726=846次的操作,節約了84600ms的時間(當然有夸張的成分,但是對整個函數的消耗來說,這個確實是很大的一塊)。

***的補充

這篇文章,僅僅是想在jQuery的各個實現的層面上來進行優化,只涉及到了對jQuery整個運行過程的分析、細節介紹和優化方向,并沒有提到一些基本之基本的優化方法,比如:

先將整個table從DOM樹中移除,完成所有的操作之后再放回DOM,減少repaint。

將mouseover和mouseout改為mouseenter和mouseleave,減少因為下正確的事件冒泡模型導致的重復的事件函數的執行。

對于th、td之類單純元素的選擇,優先考慮使用原生的getElementsByTagName,消滅sizzle分析選擇器的時間。

***,這篇文章只是想說明,對于前端開發人員,雖然瀏覽器可能是個黑盒,但是很多框架、工具、庫都是開放的,在使用之前如果可以進行一定程度的了解,必然有助于個人的技術提升和最終產品的質量優化,“知其然而不知其所以然”是非常忌諱的情況。

原文地址:http://www.otakustay.com/jquery-code-optimization-1/

【編輯推薦】

  1. jQuery1.5的六大細節改進:DOM操作更簡單
  2. jQuery入門:數組的三種類型三種操作
  3. JavaScript內存回收機制深入解讀
責任編輯:陳貽新 來源: Gray Zhang的博客
相關推薦

2011-11-02 17:17:06

jQuery

2013-05-23 11:37:07

Windows SerWindows Ser

2012-04-26 13:12:09

jQuery代碼優化

2016-11-04 20:12:23

代碼應用程序漏洞

2022-07-14 14:46:51

數據庫SQL系統設計

2011-10-31 13:31:03

jQuery

2016-03-31 14:40:13

多云戰略多云計劃云模式

2012-07-02 14:47:38

HTML5

2010-10-17 14:30:20

業務分析與優化云計算物聯網

2024-12-17 07:41:34

Java逃逸分析

2025-08-19 08:58:17

2011-08-02 10:13:30

Java工具

2011-05-05 09:54:05

靜態代碼

2010-03-30 14:17:30

CentOS操作系統

2014-04-23 16:43:05

Linux服務器性能分析

2021-09-03 23:01:58

CSS 技巧代碼重構

2013-06-09 15:31:35

jQueryjQuery優化性能優化

2011-08-03 16:51:01

jQuery

2025-04-11 03:00:55

2010-10-17 02:16:20

業務分析與優化IBM
點贊
收藏

51CTO技術棧公眾號

91天堂在线视频| 韩日一区二区三区| 在线一区免费观看| 91超碰这里只有精品国产| **亚洲第一综合导航网站| 91国模少妇一区二区三区| 黄色一级a毛片| 国产韩日影视精品| 欧美视频三区在线播放| 91精品综合久久久久久五月天| 黄色香蕉视频在线观看| 91精品国产66| 国产亚洲精品久| 欧美一级电影久久| 亚洲天堂资源在线| 成人在线高清免费| 永久亚洲成a人片777777| 欧美日韩一区二区电影| 日本五级黄色片| www黄色在线观看| 综合一区av| 亚洲欧美国产另类| 伊人成色综合网| 空姐吹箫视频大全| 青娱乐精品在线视频| 国产亚洲精品一区二555| 日日摸日日碰夜夜爽av| 四虎影院在线播放| 一本久道久久久| 日韩在线高清视频| 在线视频观看91| 国产超级va在线视频| 国产一区二区三区在线观看免费| 北条麻妃久久精品| 国产美女精品久久| 欧美久久亚洲| 午夜精品成人在线视频| 精品无人区一区二区三区| 久久精品免费av| 日韩高清成人在线| 欧美午夜视频在线观看| 欧美专区一二三| 在线观看黄色网| 欧美激情第8页| 精品国产1区二区| 日韩avxxx| 精精国产xxxx视频在线播放| 久久久欧美精品sm网站| 国产精品视频专区| 午夜精品福利在线视频| 国产精品22p| 日韩欧美一区视频| 日本xxxxxxxxxx75| 高清av在线| 国精产品一区一区三区mba桃花| 欧美区二区三区| www.色多多| 伊人久久大香伊蕉在人线观看热v 伊人久久大香线蕉综合影院首页 伊人久久大香 | 91精品久久久久久久久中文字幕| 日韩黄色中文字幕| 亚洲在线资源| 欧美精品在线观看一区二区| 岛国大片在线播放 | 亚洲片国产一区一级在线观看| 999精品视频在线| av片在线观看免费| 97se亚洲国产综合自在线不卡| 国产精品美女在线观看| 久草视频在线免费看| 你懂的一区二区三区| 91精品国产综合久久久久久| 欧美 国产 日本| 高清不卡av| 一区二区高清在线| 日韩欧美亚洲日产国| 亚洲黄色在线播放| 美女国产一区二区| 午夜免费久久久久| 美女视频久久久| 啄木系列成人av电影| 日韩一区二区三区四区| 日韩精品免费播放| 欧美xxxx免费虐| 一区二区中文字幕在线| 久久青青草综合| 丁香花免费高清完整在线播放| 成人h版在线观看| 成人日韩av在线| 精品人妻伦一二三区久久| 不卡的av电影| 亚洲精品免费在线看| 天堂资源中文在线| 亚洲国产精品99久久久久久久久 | 91在线视频国产| 亚欧成人精品| 午夜精品久久久久久久久久久久| 国产免费av一区二区| 欧美福利影院| 欧美一区二区视频97| 亚洲怡红院av| 成人av网站免费| 亚洲国产精品综合| 岛国毛片av在线| 欧美三级午夜理伦三级中视频| 黄色一级片免费播放| 欧美爱爱视频| 欧美三级中文字幕| 中国免费黄色片| 日韩中文字幕一区二区高清99| 欧美精品自拍偷拍动漫精品| 漂亮人妻被黑人久久精品| 国产成人澳门| 中文综合在线观看| 日本女人性生活视频| heyzo久久| 在线日韩av观看| 国产馆在线观看| 97偷自拍亚洲综合二区| 视频在线观看99| 手机看片国产日韩| 亚洲麻豆视频| 欧洲成人免费视频| 国产免费一区二区三区四区五区| 99pao成人国产永久免费视频| 国产主播在线一区| 97精品人妻一区二区三区香蕉| 99视频热这里只有精品免费| 美女黄毛**国产精品啪啪| 美女毛片在线看| 中文字幕欧美激情| 精品中文字幕av| 北条麻妃一区二区三区在线观看| 亚洲第一精品夜夜躁人人躁| 中文乱码人妻一区二区三区视频| 亚洲精品久久| 久久久最新网址| 国产成人无码精品久在线观看| 亚洲少妇在线| 国产成人精品视频在线观看| 在线播放国产一区| 久久先锋影音av鲁色资源网| 日韩影片在线播放| 交100部在线观看| 亚洲第一黄色网| 久久免费在线观看视频| 久久精品成人| 国产精品自拍偷拍| 国外av在线| 亚洲欧美乱综合| 免费看一级大黄情大片| 136导航精品福利| 亚洲全黄一级网站| 国产精品男女视频| 麻豆久久久久久久| 色综合视频二区偷拍在线| 在线观看av免费| 欧美一区二区精美| 2021亚洲天堂| 蜜桃久久av| 欧美性xxxx69| 波多野结衣乳巨码无在线观看| 精品国产免费人成电影在线观看四季| 欧美日韩中文字幕在线观看| 国产高清不卡二三区| 日本成人黄色免费看| 欧美人与性动交xxⅹxx| 欧美一级片免费看| 久久免费在线观看视频| av激情亚洲男人天堂| 97在线播放视频| aaa国产精品视频| 久久久免费精品| 日韩有码电影| 亚洲精品久久嫩草网站秘色| 久久黄色免费看| 成人亚洲一区二区| 欧美亚洲伦理www| 精品视频二区| 在线电影院国产精品| 久久99久久久| 26uuu国产在线精品一区二区| 精品日韩在线播放| 国产精品亚洲一区二区三区在线观看 | 日本人妻伦在线中文字幕| 久久久久影视| 欧美成人午夜激情视频| 中文文字幕一区二区三三| 91一区二区三区在线观看| 热久久精品国产| 女人抽搐喷水高潮国产精品| 欧美精品制服第一页| 丁香花免费高清完整在线播放| 欧美午夜xxx| 美女视频久久久| 91在线码无精品| 成人性生交免费看| 欧美亚洲精品在线| 99r国产精品视频| 国产日产一区二区| 欧美美女直播网站| 国产午夜免费视频| 国内精品久久久久影院薰衣草| 欧美亚洲黄色片| 成人vr资源| 国产一区二区免费电影| 大桥未久在线播放| 中文字幕少妇一区二区三区| 亚洲av无码一区二区三区dv | 欧美污视频网站| 欧美成人一区二免费视频软件| 青娱乐一区二区| 国内精品麻豆美女在线播放视频 | 国产精品美女一区二区三区| 十八禁视频网站在线观看| 亚洲91视频| 欧美伦理一区二区| 91麻豆精品激情在线观看最新 | 日本综合精品一区| 日本视频久久久| 九一国产在线| 精品国产91久久久久久久妲己| 国产一区二区三区四区视频 | 一本色道久久综合熟妇| 偷窥少妇高潮呻吟av久久免费| 欧美日韩一区二区区| 欧美aa国产视频| 神马影院一区二区三区| 欧美三级午夜理伦三级小说| 97超碰人人模人人爽人人看| 欧美视频在线视频精品| 国产成人亚洲综合91精品| 成人影音在线| 久久久久久18| 色网站在线免费观看| 日韩欧美国产三级电影视频| 国产无码精品在线播放| 亚洲美女视频在线| 亚洲熟女少妇一区二区| 亚洲国产激情av| a天堂中文字幕| 久久国产婷婷国产香蕉| 免费午夜视频在线观看| 国产精品一区毛片| 亚洲国产成人精品无码区99| 国产精品xvideos88| 免费高清完整在线观看| 日韩一区欧美一区| 我和岳m愉情xxxⅹ视频| 不卡av在线免费观看| wwwxxxx在线观看| 国产在线不卡一区| caoporm在线视频| 麻豆国产欧美一区二区三区| www.激情小说.com| 色喇叭免费久久综合网| 亚洲精品日韩av| 少妇视频在线观看| 精品久久久av| 青青草免费在线| 日韩电影第一页| 91在线观看喷潮| 欧美高清视频一二三区| 国产又黄又爽视频| 五月婷婷综合在线| 国产精品一区二区6| 欧美日韩美女在线观看| 午夜成人亚洲理伦片在线观看| 国产精品久久777777| 超碰caoprom| 成人av手机在线观看| 玖草视频在线观看| 国产精品一级二级三级| 精品一区二区中文字幕| 狂野欧美一区| 欧美日本视频在线观看| 久久成人国产| jizzzz日本| 国产精品99久| 国产精品伦子伦| 欧美国产1区2区| av成人免费网站| 精品久久久久久电影| 五月激情丁香网| 黑人极品videos精品欧美裸| 无码人妻一区二区三区免费| 欧美日韩午夜在线视频| 亚洲成人77777| 日韩黄在线观看| 免费在线看a| 国模叶桐国产精品一区| 日韩精品第一| 国产成一区二区| 国产精品日本一区二区不卡视频| 国产精品va在线| 成人欧美大片| 成人亚洲综合色就1024| 黄色欧美网站| 一本一生久久a久久精品综合蜜| 亚洲精品推荐| 五月天男人天堂| 99精品视频在线| 国产乱子伦农村叉叉叉| 极品少妇一区二区| 黄色a一级视频| 亚洲久草在线视频| 欧美brazzers| 精品三级在线看| 亚洲AV无码精品国产| 亚洲欧美另类国产| 青春草免费在线视频| 国产精品久久久久福利| 久久精品福利| 日日噜噜夜夜狠狠久久丁香五月| 亚洲欧美视频| 极品白嫩的小少妇| k8久久久一区二区三区| 性色国产成人久久久精品| 黄色精品在线看| 国产视频在线一区| 日韩欧美国产一区二区三区| 邻居大乳一区二区三区| 欧美激情第三页| 爱啪啪综合导航| 91久久极品少妇xxxxⅹ软件| 精品国产91乱码一区二区三区四区| 免费网站在线观看视频| 裸体一区二区三区| 人妻aⅴ无码一区二区三区| 99视频精品全部免费在线| 免费三级在线观看| 欧美视频你懂的| 久久国产精品高清一区二区三区| 欧美精品xxx| 久久wwww| 玖玖精品在线视频| 久久国产福利国产秒拍| 久久久久亚洲av片无码v| 日本一区二区不卡视频| 亚洲精品成人在线视频| 欧美三级日韩在线| 久草福利在线视频| 日韩免费观看高清| 日韩一级电影| 欧洲黄色一级视频| 波波电影院一区二区三区| 久久综合色综合| 亚洲白拍色综合图区| av丝袜在线| 国产精品久久久亚洲| 国产成人精品一区二区免费看京| 午夜精品久久久久久久无码| 不卡的看片网站| 国产福利拍拍拍| 日韩精品中文字幕视频在线| av在线三区| 欧美福利视频在线| 日韩精品一级| 久操手机在线视频| 成人在线综合网| 美国黄色特级片| 欧美色综合影院| 日本三级视频在线播放| 性色av一区二区咪爱| 乱亲女h秽乱长久久久| 少妇高潮喷水在线观看| 久久99精品久久久久久国产越南 | 久久久一区二区| 亚洲av无码不卡| 日韩欧美国产综合一区 | 丰满人妻一区二区| 韩国一区二区电影| 亚洲精品国产setv| 99热手机在线| 亚洲男同1069视频| 免费av一级片| 久久伊人精品天天| 欧美电影网址| 午夜一区二区三视频在线观看| 美国欧美日韩国产在线播放| 日韩欧美中文字幕视频| 亚洲国产精品免费| 成人黄色在线电影| 国产v亚洲v天堂无码| 亚洲九九在线| 最新版天堂资源在线| 欧美性xxxxhd| 欧美尤物美女在线| 国产 高清 精品 在线 a| 亚洲一区日韩| 亚洲综合久久av一区二区三区| 欧美一级黄色片| 北岛玲heyzo一区二区| 一区二区三区观看| 成人福利视频在线| 嫩草影院一区二区三区| 欧美人在线观看| 欧美美乳视频| gogo亚洲国模私拍人体| 欧美性高潮在线| 污视频网站免费在线观看|