當我們開發網路富應用(RIA)時,我們經常寫一些javascript腳本來修改或增加頁面元素,這些工作最終是DOM——或者說文檔物件模型——來完成的,而我們的實作方式會影響到應用的響應速度。
DOM操作會導致瀏覽器重解析(reflow),這是瀏覽器的一個決定頁面元素如何展現的計算過程。直接修改DOM,修改元素的CSS樣式,修改瀏覽器的視窗大小,都會觸發重解析。讀取元素的佈局屬性例如offsetHeithe或offsetWidth也會觸發重解析。重解析需要花費計算時間, 因此重解析觸發的越少,應用就會越快。
DOM操作通常要不就是修改已經存在的頁面上的元素,要不就是建立新的頁面元素。下面的4種最佳化方案涵蓋了修改和建立DOM節點兩種方式,幫助你減少觸發瀏覽器重解析的次數。
方案一:透過CSS類別名稱切換來修改DOM
這個方案讓我們可以一次修改一個元素和它的子元素的多個樣式屬性而只觸發一次重解析。
需求:
( emu註:原文作者寫到這裡的時候腦子顯然短路了一下,把後面的Out-of-the-flow DOM Manipulation模式要解決的問題給擺到這裡來了,不過從示範代碼中很容易明白作者真正想描述的問題,因此emu就不照翻原文了)
我們現在需要寫一個函數來修改一個超連結的幾個樣式規則。要實現很簡單,把這幾個規則對應的屬性逐一改了就好了。但帶來的問題是,每修改一個樣式屬性,都會導致一次頁面的重解析。
function selectAnchor(element) {
element.style.fontWeight = 'bold';
element.style.textDecoration = 'none';
element.style.color = '#000';
}
解決方案:
要解決這個問題,我們可以先創建一個樣式名,並且把要修改的樣式規則都放到這個類名上,然後我們給超鏈接添加上這個新類名,就可以實現添加幾個樣式規則而只觸發一次重解析了。這個模式還有個好處是也實現了表現和邏輯分離。
.selectedAnchor {
font-weight: bold;
text-decoration: none;
color: #000;
}
function selectAnchor(element) {
element.className = 'selectedAnchor';
}