精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

美女被爆操网站| 中文字幕日韩精品久久| 国产伦精品一区二区三区视频我| 精品少妇av| 日韩一级二级三级精品视频| ww国产内射精品后入国产| 国产福利在线看| 国产成人av一区二区| 日韩av电影手机在线| 印度午夜性春猛xxx交| 亚洲三级网页| 精品久久久久久久久久久久久久久久久 | 欧美怡红院视频一区二区三区 | 欧美日韩老妇| 日韩免费一区二区| 欧美大尺度做爰床戏| 92久久精品| 国产精品你懂的在线| 国产一区在线免费| av中文字幕免费| 视频在线观看国产精品| 久久人人爽国产| 欧美肥妇bbwbbw| 免费欧美视频| 亚洲变态欧美另类捆绑| 在线免费观看av的网站| 伊人久久视频| 亚州成人在线电影| 欧美少妇在线观看| eeuss影院www在线播放| 久久婷婷久久一区二区三区| http;//www.99re视频| 亚洲在线视频播放| 老司机免费视频久久| 午夜免费日韩视频| 久草免费在线观看视频| 91tv官网精品成人亚洲| 中文字幕久久精品| 永久免费成人代码| 亚洲系列另类av| 亚洲国产精品久久| 少妇伦子伦精品无吗| crdy在线观看欧美| 911精品国产一区二区在线| 久久久国产欧美| 性欧美1819sex性高清| 欧美日韩激情美女| 欧美网站免费观看| 色综合桃花网| 日韩欧美亚洲综合| 各处沟厕大尺度偷拍女厕嘘嘘| 91九色porn在线资源| 亚洲一区二区在线免费观看视频| 中文精品无码中文字幕无码专区 | 国内外成人免费激情在线视频网站| 精品无码一区二区三区蜜臀| 91综合在线| 久久久97精品| 日本妇女毛茸茸| 韩国久久久久| 91精品国产高清自在线| 三级视频在线观看| 日本亚洲视频在线| 国产在线久久久| 国产欧美综合视频| 国产a级毛片一区| 国产精品久久一区二区三区| 天堂成人在线| 亚洲国产电影在线观看| 宅男在线精品国产免费观看| 国产一二区在线观看| 一区二区三区精品| 成人在线观看你懂的| 吞精囗交69激情欧美| 欧美偷拍一区二区| 亚欧美一区二区三区| 97品白浆高清久久久久久| 欧美一区二区免费观在线| 韩国av中国字幕| 亚洲人和日本人hd| 久久精品视频播放| 免费中文字幕在线观看| 久久av一区二区三区| 国产精品美腿一区在线看| 免费黄色av片| 国产精品女主播一区二区三区| 午夜精品久久久99热福利| 依依成人综合网| 青娱乐精品视频在线| 92看片淫黄大片欧美看国产片| 亚洲国产视频一区二区三区| 2022国产精品视频| 中国成人在线视频| sm捆绑调教国产免费网站在线观看| 色婷婷国产精品| 天堂在线一区二区三区| 激情小说亚洲色图| 丝袜亚洲欧美日韩综合| 久久久久国产精品夜夜夜夜夜| 国产精品日韩| 99精品国产一区二区| 日本中文字幕一区二区有码在线| 中文字幕中文字幕一区| 一二三四视频社区在线| 国内自拍亚洲| 亚洲精品久久视频| 午夜激情福利网| 免费一区视频| av成人观看| 91在线网址| 欧美视频在线观看免费| 在线观看av免费观看| 久操国产精品| 久久久亚洲天堂| 一级片在线观看视频| 91婷婷韩国欧美一区二区| 91社在线播放| 日本h片久久| 亚洲精品美女久久久久| 欧美激情精品久久| 国内精品久久久久影院薰衣草| 久久精品中文字幕一区二区三区| 成人福利网站| 欧美色偷偷大香| 欧美老熟妇乱大交xxxxx| 国产精品mm| 91影视免费在线观看| 91官网在线| 日本丰满少妇一区二区三区| 亚洲午夜久久久久久久久| 天天做综合网| 国产精品一区二区三区久久久| 日本人妖在线| 欧美日韩国产中字| 亚洲熟女一区二区| 激情欧美日韩一区| 岛国一区二区三区高清视频| 国产在线高清视频| 欧美二区三区的天堂| 国产女主播喷水高潮网红在线| www.国产视频| 亚洲最大黄网| 川上优av一区二区线观看| 好男人免费精品视频| 色综合中文综合网| 欧洲女同同性吃奶| 久久精品1区| 日本午夜精品电影| 久久天堂av| 亚洲摸下面视频| 久久久精品福利| 久久天天做天天爱综合色| 日韩a∨精品日韩在线观看| 国产精品毛片久久久| 久久久中文字幕| 天堂在线免费av| 色8久久人人97超碰香蕉987| 欧洲美熟女乱又伦| 秋霞午夜鲁丝一区二区老狼| 色狠狠久久av五月综合| 国产在视频一区二区三区吞精| 日韩视频免费中文字幕| 国产一区二区网站| 尤物av一区二区| 北京富婆泄欲对白| 久久久久国产精品一区三寸| 日韩欧美亚洲日产国| 国产麻豆久久| 蜜臀久久99精品久久久无需会员| 99在线精品视频免费观看20| 亚洲精品v日韩精品| 黄色在线免费播放| 亚洲欧美卡通另类91av| 天堂√在线观看一区二区| 伊人亚洲精品| 欧美日韩福利视频| 人妻91麻豆一区二区三区| 精品福利一区二区| 一二三四国产精品| 国产99精品国产| 日韩视频第二页| 欧美成人激情| 国产欧美在线一区二区| 亚洲天堂一区二区| 草民午夜欧美限制a级福利片| 免费看国产片在线观看| 色婷婷国产精品| 伊人在线视频观看| 26uuu色噜噜精品一区| 欧美成人黄色网址| 国产精品www994| 日韩欧美一区二区三区四区| 欧美.com| 国产精品久久久久久久久久三级| 成人短视频在线| 亚洲欧洲日产国产网站| 国产精品久久久久久久久毛片 | 九九久久国产精品| 男女网站在线观看| 日韩女优电影在线观看| 久久久黄色大片| 亚洲毛片av在线| 成人影视免费观看| 国产成人在线看| 亚洲福利精品视频| 亚洲国产专区校园欧美| 新呦u视频一区二区| 精品淫伦v久久水蜜桃| 成人免费在线视频网站| 天堂电影一区| 九九综合九九综合| 黄色片在线免费观看| 欧美伊人精品成人久久综合97| 欧美日韩国产精品综合| thepron国产精品| 91精品视频国产| 秋霞av亚洲一区二区三| 无遮挡又爽又刺激的视频| 欧美成人日韩| 在线播放 亚洲| 激情综合网五月| 国产伦精品一区二区三区视频免费 | 日韩欧美中文视频| 日本三级亚洲精品| 97在线免费公开视频| 亚洲高清av| 日本精品福利视频| 天天综合一区| 成人手机视频在线| 久久视频在线| 亚洲午夜在线观看| 国产成人ay| 欧美午夜欧美| 米奇777超碰欧美日韩亚洲| 国产日韩欧美亚洲一区| av综合网址| 国产精品国产亚洲精品看不卡15| 精品久久亚洲| 亚洲xxx大片| 日韩视频在线直播| 成人久久一区二区三区| 最新亚洲国产| 91日本视频在线| 国产aⅴ精品一区二区四区| 97精品国产97久久久久久免费| h片精品在线观看| 久久久久久久97| 黄色视屏在线免费观看| 97不卡在线视频| 91精品论坛| 国产精品爱久久久久久久| 欧洲成人一区| 国产一区二区香蕉| 精品国产麻豆| 国产美女精品久久久| 国产精品视屏| 欧美极品一区二区| 波多野结衣在线播放一区| 一区二区精品免费视频| **女人18毛片一区二区| 国产自产在线视频| 亚洲中字黄色| 久久99999| 国产成人精品免费网站| 欧美无人区码suv| 久久久久九九视频| 国产一二三av| 亚洲理论在线观看| 中日韩黄色大片| 在线国产电影不卡| 91午夜交换视频| 精品久久久久久最新网址| 天天射天天色天天干| 亚洲视频视频在线| 国产在线二区| 91av国产在线| 久久久久久一区二区三区四区别墅| 亚洲自拍偷拍福利| 窝窝社区一区二区| 亚洲精品9999| 黄色免费成人| 国产xxxxx视频| 国产精品一区二区久久精品爱涩| 欧产日产国产精品98| 欧美高清在线视频| 劲爆欧美第一页| 在线看日本不卡| 亚洲免费一级片| 在线性视频日韩欧美| 国产精品186在线观看在线播放| 国产97色在线| y111111国产精品久久久| 好吊一区二区三区| 国产香蕉一区二区三区| 免费欧美在线| 国产精品欧美性爱| 国产拍揄自揄精品视频麻豆| 在线观看成人毛片| 欧美性欧美巨大黑白大战| 亚洲av无码一区二区三区性色| 精品亚洲一区二区三区四区五区| 在线观看免费网站黄| 97成人超碰免| 亚洲成人黄色| 久久精品国产第一区二区三区最新章节| 四季av一区二区凹凸精品| 99精品人妻少妇一区二区| 老色鬼精品视频在线观看播放| 中文字幕在线观看网址| 亚洲男人的天堂在线观看| 精品久久久久久久久久久国产字幕| 欧美一级久久久久久久大片| 国产一级片在线| 51午夜精品视频| 亚洲第一二区| 26uuu成人| 麻豆国产精品一区二区三区| 国产成人无码一区二区在线观看| 亚洲欧美欧美一区二区三区| 一级久久久久久| 亚洲精品一区中文字幕乱码| 91福利区在线观看| 97人人香蕉| 68国产成人综合久久精品| 怡红院亚洲色图| 国产午夜精品福利| 四虎影院在线免费播放| 日韩精品免费综合视频在线播放| 免费不卡av| 高清国产在线一区| 欧美视频一区| 在线观看一区二区三区视频| 亚洲欧美自拍偷拍| 91成人国产综合久久精品| 亚洲天堂男人天堂女人天堂| 亚洲一二三四| 欧美一级片免费观看| 性高湖久久久久久久久| 污污网站免费看| 亚洲国产成人一区二区三区| 国产在线观看第一页| 亚洲午夜精品久久久久久久久久久久| 欧美freesex黑人又粗又大| 激情久久av| 午夜亚洲福利在线老司机| 无码人妻精品一区二区三区温州| 精品久久久一区| 精品视频三区| 国产精品一久久香蕉国产线看观看| 青青草成人影院| 午夜免费福利视频在线观看| 综合在线观看色| 性一交一乱一色一视频麻豆| 欧美多人乱p欧美4p久久| 国产一区二区在线视频你懂的| 国产男女免费视频| 久久蜜桃av一区精品变态类天堂 | 在线精品亚洲一区二区不卡| 成人高清免费观看mv| 国产欧美在线看| 国产精品hd| 日本黄色网址大全| 欧美视频在线观看一区| 久草中文在线观看| 成人免费看片网站| 欧美亚洲视频| 日本成人免费在线观看| 欧美高清你懂得| segui88久久综合9999| 午夜天堂影视香蕉久久| xxx在线播放| 欧美无砖砖区免费| 亚洲婷婷噜噜| 久久久久高清| 另类人妖一区二区av| 九九热精彩视频| 亚洲久久久久久久久久久| 国产成人亚洲一区二区三区| 日韩video| 久久人人97超碰com| 一级片一区二区三区| 97免费在线视频| 成人羞羞动漫| 深夜视频在线观看| 在线观看视频一区二区欧美日韩| 成人影院在线看| 久久免费一区| 国产麻豆日韩欧美久久| 色av性av丰满av| 欧美成人剧情片在线观看| 最新国产一区| 美女日批在线观看| 欧美影视一区在线| av资源在线看片| 只有这里有精品| 久久噜噜亚洲综合| 午夜精品久久久久久久第一页按摩| 欧美在线视频一区| 激情欧美一区二区三区| 美女av免费看|