新聞中心
我們都知道,DOM操作的效率是很低的,而且不是一般的慢,而且這也是引發(fā)性能問(wèn)題的常見(jiàn)問(wèn)題之一。為什么會(huì)慢呢?因?yàn)閷?duì)DOM的修改為影響網(wǎng)頁(yè)的用戶(hù)界面,重繪頁(yè)面是一項(xiàng)昂貴的操作。太多的DOM操作會(huì)導(dǎo)致一系列的重繪操作,為了確保執(zhí)行結(jié)果的準(zhǔn)確性,所有的修改操作是按順序同步執(zhí)行的。我們稱(chēng)這個(gè)過(guò)程叫做回流(reflow),同時(shí)這也是最昂貴的瀏覽器操作之一。回流操作主要會(huì)發(fā)生在幾種情況下:

創(chuàng)新互聯(lián)公司專(zhuān)注為客戶(hù)提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、靈川網(wǎng)絡(luò)推廣、小程序制作、靈川網(wǎng)絡(luò)營(yíng)銷(xiāo)、靈川企業(yè)策劃、靈川品牌公關(guān)、搜索引擎seo、人物專(zhuān)訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供靈川建站搭建服務(wù),24小時(shí)服務(wù)熱線(xiàn):18980820575,官方網(wǎng)址:www.cdcxhl.com
◆當(dāng)對(duì)DOM節(jié)點(diǎn)執(zhí)行新增或者刪除操作時(shí)。
◆動(dòng)態(tài)設(shè)置一個(gè)樣式時(shí)(比如element.style.width="10px")。
◆當(dāng)獲取一個(gè)必須經(jīng)過(guò)計(jì)算的尺寸值時(shí),比如訪問(wèn)offsetWidth、clientHeight或者其他需要經(jīng)過(guò)計(jì)算的CSS值(在兼容DOM的瀏覽器中,可以通過(guò)getComputedStyle函數(shù)獲?。辉贗E中,可以通過(guò)currentStyle屬性獲?。?。
解決問(wèn)題的關(guān)鍵,就是限制通過(guò)DOM操作所引發(fā)回流的次數(shù)。大部分瀏覽器都不會(huì)在JavaScript的執(zhí)行過(guò)程中更新DOM。相應(yīng)的,這些瀏覽器將對(duì)對(duì)DOM的操作放進(jìn)一個(gè)隊(duì)列,并在JavaScript腳本執(zhí)行完畢以后按順序一次執(zhí)行完畢。也就是說(shuō),在JavaScript執(zhí)行的過(guò)程中,用戶(hù)不能和瀏覽器進(jìn)行互動(dòng),直到一個(gè)回流操作被執(zhí)行。( 失控腳本對(duì)話(huà)框 會(huì)觸發(fā)回流操作,因?yàn)樗麍?zhí)行了一個(gè)中止JavaScript執(zhí)行的操作,此時(shí)會(huì)對(duì)用戶(hù)界面進(jìn)行更新)
如果要減少由于DOM修改帶來(lái)的回流操作,有兩個(gè)基本的方法。***個(gè)就是在對(duì)當(dāng)前DOM進(jìn)行操作之前,盡可能多的做一些準(zhǔn)備工作。一個(gè)經(jīng)典的例子就是向document對(duì)象中添加很多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)中都會(huì)修改當(dāng)前DOM結(jié)構(gòu)。為了提高性能,我們需要將這個(gè)次數(shù)降到***,對(duì)于這個(gè)案例來(lái)說(shuō),***的辦法是建立一個(gè)文檔碎片(document fragment),作為那些已創(chuàng)建元素元素的臨時(shí)容器,***一次將容器的內(nèi)容直接添加到父節(jié)點(diǎn)中:
- var fragment = document.createDocumentFragment();
- for (var i=0; i < items.length; i++){
- var item = document.createElement("li");
- item.appendChild(document.createTextNode("Option " + i);
- fragment.appendChild(item);
- }
- list.appendChild(fragment);
經(jīng)過(guò)調(diào)整的代碼,只會(huì)修改一次當(dāng)前DOM的結(jié)構(gòu),就在***一行,而在這之前,我們用文檔碎片來(lái)保存那些中間結(jié)果。因?yàn)槲臋n碎片沒(méi)有任何可見(jiàn)內(nèi)容,所以這類(lèi)修改不會(huì)觸發(fā)回流操作。實(shí)際上,文檔碎片也不能被添加到DOM中,我們需要將它作為參數(shù)傳給appendChild函數(shù),而實(shí)際上添加的不是文檔碎片本身,而是它下面的所有子元素。
文章名稱(chēng):淺談如何提升JavaScript中DOM的運(yùn)行速度
標(biāo)題來(lái)源:http://m.5511xx.com/article/cdioics.html


咨詢(xún)
建站咨詢(xún)
