为什么操作dom会消耗性能
因?yàn)閷OM的修改為影響網(wǎng)頁的用戶界面,重繪頁面是一項(xiàng)昂貴的操作。太多的JavaScript DOM操作會導(dǎo)致一系列的重繪操作,為了確保執(zhí)行結(jié)果的準(zhǔn)確性,所有的修改操作是按順序同步執(zhí)行的。我們稱這個過程叫做回流(reflow),同時這也是最昂貴的瀏覽器操作之一, 回流操作主要會發(fā)生在幾種情況下: 當(dāng)對DOM節(jié)點(diǎn)執(zhí)行新增或者刪除操作時。 動態(tài)設(shè)置一個樣式時(比如element.style.width=”10px”)。 當(dāng)獲取一個必須經(jīng)過計算的尺寸值時,比如訪問offsetWidth、clientHeight或者其他需要經(jīng)過計算的CSS值(在兼容DOM的瀏覽器中,可以通過getComputedStyle函數(shù)獲取;在IE中,可以通過currentStyle屬性獲取)。
解決問題的關(guān)鍵,就是限制通過JavaScript DOM操作所引發(fā)回流的次數(shù)。大部分瀏覽器都不會在JavaScript的執(zhí)行過程中更新DOM。相應(yīng)的,這些瀏覽器將對對DOM的操作放進(jìn)一個隊(duì)列,并在JavaScript腳本執(zhí)行完畢以后按順序一次執(zhí)行完畢。也就是說,在JavaScript執(zhí)行的過程中,用戶不能和瀏覽器進(jìn)行互動,直到一個回流操作被執(zhí)行。(失控腳本對話框會觸發(fā)回流操作,因?yàn)樗麍?zhí)行了一個中止JavaScript執(zhí)行的操作,此時會對用戶界面進(jìn)行更新) 如果要減少由于DOM修改帶來的回流操作,有兩個基本的方法。第一個就是在對當(dāng)前DOM進(jìn)行操作之前,盡可能多的做一些準(zhǔn)備工作。一個經(jīng)典的例子就是向document對象中添加很多DOM節(jié)點(diǎn):
for(var i = 0;i < items.length;i++){ var item=document.createElement("li"); item.appendChild(document.createTextNode("Option"+i); list.appendChild(item); }這段代碼的效率是很低的,因?yàn)樗诿看窝h(huán)中都會修改當(dāng)前DOM結(jié)構(gòu)。為了提高性能,我們需要將這個次數(shù)降到最低,對于這個案例來說,最好的辦法是建立一個文檔碎片(documentfragment),作為那些已創(chuàng)建元素元素的臨時容器,最后一次將容器的內(nèi)容直接添加到父節(jié)點(diǎn)中:
var fragment = document.createDocumentFragment(); for(vari=0;i < items.length;i++){ var item=document.createElement("li"); item.appendChild(document.createTextNode("Option"+i); fragment.appendChild(item); } list.appendChild(fragment);?
轉(zhuǎn)載于:https://www.cnblogs.com/jiahuasir/p/10266932.html
總結(jié)
以上是生活随笔為你收集整理的为什么操作dom会消耗性能的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mysql Explain的简单使用
- 下一篇: ajax传递数组,后台接收为null解决