av激情亚洲男人的天堂国语,日韩欧美精品一中文字幕,无码av一区二区三区无码,国产又色又爽又刺激的a片,国产又色又爽又刺激的a片

揭露JavaScriptDOM操作基本原則

我們都知道,JavaScript DOM操作的效率是很低的,而且不是一般的慢,而且這也是引發(fā)性能問題的常見問題之一。為什么會慢呢?因?yàn)閷OM的修改為影響網(wǎng)頁的用戶界面,重繪頁面是一項(xiàng)昂貴的操作。

JavaScript DOM操作基本原則

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

◆當(dāng)對DOM節(jié)點(diǎn)執(zhí)行新增或者刪除操作時(shí)。

◆動態(tài)設(shè)置一個樣式時(shí)(比如element.style.width="10px")。

◆當(dāng)獲取一個必須經(jīng)過計(jì)算的尺寸值時(shí),比如訪問offsetWidth、clientHeight或者其他需要經(jīng)過計(jì)算的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í)行的操作,此時(shí)會對用戶界面進(jìn)行更新)

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

 
 
 
  1. for(vari=0;i
  2. varitem=document.createElement("li");
  3. item.appendChild(document.createTextNode("Option"+i);
  4. list.appendChild(item);
  5. }

這段代碼的效率是很低的,因?yàn)樗诿看窝h(huán)中都會修改當(dāng)前DOM結(jié)構(gòu)。為了提高性能,我們需要將這個次數(shù)降到***,對于這個案例來說,***的辦法是建立一個文檔碎片(documentfragment),作為那些已創(chuàng)建元素元素的臨時(shí)容器,***一次將容器的內(nèi)容直接添加到父節(jié)點(diǎn)中:

 
 
 
  1. varfragment=document.createDocumentFragment();
  2. for(vari=0;i
  3. varitem=document.createElement("li");
  4. item.appendChild(document.createTextNode("Option"+i);
  5. fragment.appendChild(item);
  6. }
  7. list.appendChild(fragment);

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

◆通過removeChild()或者replaceChild()實(shí)現(xiàn)真正意義上的刪除。

◆設(shè)置該元素的display樣式為“none”。

而一旦修改操作完成,上面這個過程就需要反轉(zhuǎn)過來,將刪除的元素重新添加到當(dāng)前的DOM結(jié)構(gòu)中,我們還是拿上面的例子來做說明:

 
 
 
  1. list.style.display="none";
  2. for(vari=0;i
  3. varitem=document.createElement("li");
  4. item.appendChild(document.createTextNode("Option"+i);
  5. list.appendChild(item);
  6. }
  7. list.style.display="";

將list的display樣式設(shè)置為“none”后,就將這個元素從當(dāng)前的DOM結(jié)構(gòu)中刪除了,因?yàn)檫@個節(jié)點(diǎn)不再可視。在將display屬性設(shè)置回之前的默認(rèn)值之前,向其下添加子元素是不會觸發(fā)回流操作的。

另外一個經(jīng)常引起回流操作的情況是通過style屬性對元素的外觀進(jìn)行修改。比如下面這個例子:

 
 
 
  1. element.style.backgroundColor="blue";
  2. element.style.color="red";
  3. element.style.fontSize="12em";

當(dāng)前標(biāo)題:揭露JavaScriptDOM操作基本原則
本文URL:http://uogjgqi.cn/article/dpjecph.html
掃二維碼與項(xiàng)目經(jīng)理溝通

我們在微信上24小時(shí)期待你的聲音

解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流