您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關哪些方式可以實現加速Javascript DOM操作優化,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
你對加速Javascript DOM操作優化的方法是否熟悉,在我們開發互聯網富應用(RIA)時,我們經常寫一些javascript腳本來修改或者增加頁面元素,這些工作最終是DOM——或者說文檔對象模型——來完成的,而我們的實現方式會影響到應用的響應速度。
加速Javascript DOM操作優化
在我們開發互聯網富應用(RIA)時,我們經常寫一些javascript腳本來修改或者增加頁面元素,這些工作最終是DOM——或者說文檔對象模型——來完成的,而我們的實現方式會影響到應用的響應速度。
Javascript DOM操作會導致瀏覽器重解析(reflow),這是瀏覽器的一個決定頁面元素如何展現的計算過程。直接修改DOM,修改元素的CSS樣式,修改瀏覽器的窗口大小,都會觸發重解析。讀取元素的布局屬性比如offsetHeithe或者offsetWidth也會觸發重解析。重解析需要花費計算時間,因此重解析觸發的越少,應用就會越快。
Javascript DOM操作通常要不就是修改已經存在的頁面上的元素,要不就是創建新的頁面元素。下面有兩種優化方案,大致覆蓋了修改和創建DOM節點兩種方式,幫助你減少觸發瀏覽器重解析的次數。
方案一:通過CSS類名切換來修改DOM
這個方案讓我們可以一次性修改一個元素和它的子元素的多個樣式屬性而只觸發一次重解析。
需求:
(emu注:原文作者寫到這里的時候腦子顯然短路了一下,把后面的Out-of-the-flowDOMManipulation模式要解決的問題給擺到這里來了,不過從示范代碼中很容易明白作者真正想描述的問題,因此emu就不照翻原文了)
我們現在需要寫一個函數來修改一個超鏈接的幾個樣式規則。要實現很簡單,把這幾個規則對應的屬性逐一改了就好了。但是帶來的問題是,每修改一個樣式屬性,都會導致一次頁面的重解析。
functionselectAnchor(element){ element.style.fontWeight='bold'; element.style.textDecoration='none'; element.style.color='#000'; }
解決方案:
要解決這個問題,我們可以先創建一個樣式名,并且把要修改的樣式規則都放到這個類名上,然后我們給超鏈接添加上這個新類名,就可以實現添加幾個樣式規則而只觸發一次重解析了。這個模式還有個好處是也實現了表現和邏輯相分離。
.selectedAnchor{ font-weight:bold; text-decoration:none; color:#000; } functionselectAnchor(element){ element.className='selectedAnchor'; }
介紹了加速Javascript DOM操作優化的方案一,下面來看一下方案二。
方案二:在非渲染區修改DOM
(emu注:作者在這里再次腦子短路,把DocumentFragmentDOMGeneration模式的介紹提前到這里來了,emu只好再次發揮一下)
上一個方案解決的是修改一個超鏈接的問題,當一次需要對很多個超鏈接進行相同修改的時候,這個方案就可以大顯身手了。
需求:
需求是這樣的,我們要寫一個函數來修改一個指定元素的子元素中所有的超鏈接的樣式名(className)屬性。要實現很簡單,我們可以通過遍歷每個超鏈接并且修改它們的樣式名來完成任務。但是帶來的問題就是,每修改一個超鏈接都會導致一次重解析。
functionupdateAllAnchors(element,anchorClass){ varanchors=element.getElementsByTagName('a'); for(vari=0,length=anchors.length;i<length;i++){ anchors[i].className=anchorClass; } }
解決方案:
要解決這個問題,我們可以把被修改的指定元素從DOM里面移除,再修改所有的超鏈接,然后在把這個元素插入回到它原來的位置上。為了完成這個復雜的操作,我們可以先寫一個可重用的函數,它不但移除了這個DOM節點,還返回了一個把元素插回到原來的位置的函數。
/** *Removeanelementandprovideafunction thatinsertsitintoitsoriginalposition *@paramelement{Element}Theelementtobetemporarilyremoved *@return{Function}Afunctionthatinsertstheelementintoitsoriginalposition **/ functionremoveToInsertLater(element){ varparentNode=element.parentNode; varnextSibling=element.nextSibling; parentNode.removeChild(element); returnfunction(){ if(nextSibling){ parentNode.insertBefore(element,nextSibling); }else{ parentNode.appendChild(element); } }; }
有了上面這個函數,現在我們就可以在一個不需要解析渲染的元素上面修改那些超鏈接了。這樣只在移除和插入元素的時候各觸發一次重解析。
functionupdateAllAnchors(element,anchorClass){ varinsertFunction=removeToInsertLater(element); varanchors=element.getElementsByTagName('a'); for(vari=0,length=anchors.length;i<length;i++){ anchors[i].className=anchorClass; } insertFunction(); }
以上就是哪些方式可以實現加速Javascript DOM操作優化,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。