自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

淺談如何提升JavaScript中DOM的運(yùn)行速度

開發(fā) 后端
在Web開發(fā)中,JavaScript的一個(gè)很重要的作用就是對(duì)DOM進(jìn)行操作,可你知道么?對(duì)DOM的操作是非常昂貴的,因?yàn)檫@會(huì)導(dǎo)致瀏覽器執(zhí)行回流操作,而執(zhí)行了過(guò)多的回流操作,你就會(huì)發(fā)現(xiàn)自己的網(wǎng)站變得越來(lái)越慢了,我們應(yīng)該盡可能的減少DOM操作。本文將給出了一些指導(dǎo)性原則,比如在什么時(shí)候應(yīng)該對(duì)DOM可以進(jìn)行什么樣的操作等。

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

◆當(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í),比如訪問offsetWidth、clientHeight或者其他需要經(jīng)過(guò)計(jì)算的CSS值(在兼容DOM的瀏覽器中,可以通過(guò)getComputedStyle函數(shù)獲取;在IE中,可以通過(guò)currentStyle屬性獲?。?。
解決問題的關(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ò)程中,用戶不能和瀏覽器進(jìn)行互動(dòng),直到一個(gè)回流操作被執(zhí)行。( 失控腳本對(duì)話框 會(huì)觸發(fā)回流操作,因?yàn)樗麍?zhí)行了一個(gè)中止JavaScript執(zhí)行的操作,此時(shí)會(huì)對(duì)用戶界面進(jìn)行更新)

如果要減少由于DOM修改帶來(lái)的回流操作,有兩個(gè)基本的方法。***個(gè)就是在對(duì)當(dāng)前DOM進(jìn)行操作之前,盡可能多的做一些準(zhǔn)備工作。一個(gè)經(jīng)典的例子就是向document對(duì)象中添加很多DOM節(jié)點(diǎn):

  1. for (var i=0; i < items.length; i++){  
  2.     var item = document.createElement("li");  
  3.     item.appendChild(document.createTextNode("Option " + i);  
  4.     list.appendChild(item);  
  5. }  

這段代碼的效率是很低的,因?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)中:

  1. var fragment = document.createDocumentFragment();  
  2. for (var i=0; i < items.length; i++){  
  3.     var item = document.createElement("li");  
  4.     item.appendChild(document.createTextNode("Option " + i);  
  5.     fragment.appendChild(item);  
  6. }  
  7. list.appendChild(fragment); 

經(jīng)過(guò)調(diào)整的代碼,只會(huì)修改一次當(dāng)前DOM的結(jié)構(gòu),就在***一行,而在這之前,我們用文檔碎片來(lái)保存那些中間結(jié)果。因?yàn)槲臋n碎片沒有任何可見內(nèi)容,所以這類修改不會(huì)觸發(fā)回流操作。實(shí)際上,文檔碎片也不能被添加到DOM中,我們需要將它作為參數(shù)傳給appendChild函數(shù),而實(shí)際上添加的不是文檔碎片本身,而是它下面的所有子元素。

【編輯推薦】

  1. JavaScript中關(guān)于 Cookie的詳細(xì)介紹
  2. JavaScript中 confirm,alert,prompt的用法
  3. 基于JavaScript的REST 客戶端框架
  4. 如何優(yōu)化JavaScript腳 本的性能
  5. 用Javascript連接 Access數(shù)據(jù)庫(kù)的方法
責(zé)任編輯:張燕妮 來(lái)源: blueidea
相關(guān)推薦

2024-09-27 08:35:33

數(shù)組JavaScript性能

2011-01-12 11:22:24

微軟認(rèn)證

2021-11-03 06:28:21

Python運(yùn)行速度開發(fā)

2009-08-11 09:10:26

Windows 7系統(tǒng)提速

2018-08-02 16:17:34

Python 開發(fā)編程語(yǔ)言

2022-02-23 10:54:37

電腦卡頓硬件

2018-06-27 09:00:00

Linux運(yùn)行速度CPU信息

2020-12-15 06:44:14

程序運(yùn)行速度

2010-04-12 10:01:43

Windows 7運(yùn)行速度

2016-02-22 09:27:18

2012-10-24 09:40:46

網(wǎng)絡(luò)優(yōu)化系統(tǒng)優(yōu)化

2010-09-08 16:50:11

JavaScriptDOM操作

2020-05-21 16:19:43

iOS 13.5蘋果運(yùn)行速度

2009-09-12 09:43:29

Windows 7系統(tǒng)優(yōu)化

2013-07-08 11:16:05

Windows 7

2024-02-22 08:37:28

NodejsJavaScript運(yùn)行

2009-03-29 09:47:24

蘋果Iphone移動(dòng)OS

2011-05-30 13:28:00

PHP

2010-01-20 13:19:01

VB.NET錯(cuò)誤處理

2010-05-10 13:21:16

Windows 7系統(tǒng)日志
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)