成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

兩種方式實現加速Javascript DOM操作優化

開發 前端
這里向大家描述一下如何加速Javascript DOM操作優化,Javascript DOM操作會導致瀏覽器重解析(reflow),這是瀏覽器的一個決定頁面元素如何展現的計算過程。

你對加速Javascript DOM操作優化的方法是否熟悉,在我們開發互聯網富應用(RIA)時,我們經常寫一些javascript腳本來修改或者增加頁面元素,這些工作最終是DOM——或者說文檔對象模型——來完成的,而我們的實現方式會影響到應用的響應速度。

加速Javascript DOM操作優化

在我們開發互聯網富應用(RIA)時,我們經常寫一些javascript腳本來修改或者增加頁面元素,這些工作最終是DOM——或者說文檔對象模型——來完成的,而我們的實現方式會影響到應用的響應速度。

Javascript DOM操作會導致瀏覽器重解析(reflow),這是瀏覽器的一個決定頁面元素如何展現的計算過程。直接修改DOM,修改元素的CSS樣式,修改瀏覽器的窗口大小,都會觸發重解析。讀取元素的布局屬性比如offsetHeithe或者offsetWidth也會觸發重解析。重解析需要花費計算時間,因此重解析觸發的越少,應用就會越快。

Javascript DOM操作通常要不就是修改已經存在的頁面上的元素,要不就是創建新的頁面元素。下面有兩種優化方案,大致覆蓋了修改和創建DOM節點兩種方式,幫助你減少觸發瀏覽器重解析的次數。

方案一:通過CSS類名切換來修改DOM

這個方案讓我們可以一次性修改一個元素和它的子元素的多個樣式屬性而只觸發一次重解析。

需求:

(emu注:原文作者寫到這里的時候腦子顯然短路了一下,把后面的Out-of-the-flowDOMManipulation模式要解決的問題給擺到這里來了,不過從示范代碼中很容易明白作者真正想描述的問題,因此emu就不照翻原文了)

我們現在需要寫一個函數來修改一個超鏈接的幾個樣式規則。要實現很簡單,把這幾個規則對應的屬性逐一改了就好了。但是帶來的問題是,每修改一個樣式屬性,都會導致一次頁面的重解析。

  1. functionselectAnchor(element){  
  2. element.style.fontWeight='bold';  
  3. element.style.textDecoration='none';  
  4. element.style.color='#000';  

解決方案:

要解決這個問題,我們可以先創建一個樣式名,并且把要修改的樣式規則都放到這個類名上,然后我們給超鏈接添加上這個新類名,就可以實現添加幾個樣式規則而只觸發一次重解析了。這個模式還有個好處是也實現了表現和邏輯相分離。

  1. .selectedAnchor{  
  2. font-weight:bold;  
  3. text-decoration:none;  
  4. color:#000;  
  5. }  
  6.  
  7. functionselectAnchor(element){  
  8. element.className='selectedAnchor';  
  9. }  
  10.  

 介紹了加速Javascript DOM操作優化的方案一,下面來看一下方案二。#p#

方案二:在非渲染區修改DOM

(emu注:作者在這里再次腦子短路,把DocumentFragmentDOMGeneration模式的介紹提前到這里來了,emu只好再次發揮一下)
上一個方案解決的是修改一個超鏈接的問題,當一次需要對很多個超鏈接進行相同修改的時候,這個方案就可以大顯身手了。

需求:

需求是這樣的,我們要寫一個函數來修改一個指定元素的子元素中所有的超鏈接的樣式名(className)屬性。要實現很簡單,我們可以通過遍歷每個超鏈接并且修改它們的樣式名來完成任務。但是帶來的問題就是,每修改一個超鏈接都會導致一次重解析。

  1. functionupdateAllAnchors(element,anchorClass){  
  2. varanchors=element.getElementsByTagName('a');  
  3. for(vari=0,length=anchors.length;i<length;i++){  
  4. anchors[i].className=anchorClass;  
  5. }  

解決方案:

要解決這個問題,我們可以把被修改的指定元素從DOM里面移除,再修改所有的超鏈接,然后在把這個元素插入回到它原來的位置上。為了完成這個復雜的操作,我們可以先寫一個可重用的函數,它不但移除了這個DOM節點,還返回了一個把元素插回到原來的位置的函數。

  1. /**  
  2. *Removeanelementandprovideafunction  
  3. thatinsertsitintoitsoriginalposition  
  4. *@paramelement{Element}Theelementtobetemporarilyremoved  
  5. *@return{Function}Afunctionthatinsertstheelementintoitsoriginalposition  
  6. **/  
  7. functionremoveToInsertLater(element){  
  8. varparentNode=element.parentNode;  
  9. varnextSibling=element.nextSibling;  
  10. parentNode.removeChild(element);  
  11. returnfunction(){  
  12. if(nextSibling){  
  13. parentNode.insertBefore(element,nextSibling);  
  14. }else{  
  15. parentNode.appendChild(element);  
  16. }  
  17. };  

有了上面這個函數,現在我們就可以在一個不需要解析渲染的元素上面修改那些超鏈接了。這樣只在移除和插入元素的時候各觸發一次重解析。 

  1. functionupdateAllAnchors(element,anchorClass){  
  2. varinsertFunction=removeToInsertLater(element);  
  3. varanchors=element.getElementsByTagName('a');  
  4. for(vari=0,length=anchors.length;i<length;i++){  
  5. anchors[i].className=anchorClass;  
  6. }  
  7. insertFunction();  
  8. }  
  9.  

【編輯推薦】

  1. 揭露JavaScript DOM操作基本原則
  2. 減少瀏覽器重解析 JavaScript DOM操作優化方案
  3. JavaScript獲取HTML DOM節點元素詳解
  4. JavaScript和DOM輕松實現數據訪問
  5. HTML DOM與XML DOM的區別與聯系探究

 

責任編輯:佚名 來源: blogjava.net
相關推薦

2011-03-03 10:26:04

Pureftpd

2010-07-14 10:30:26

Perl多線程

2021-12-08 10:47:35

RabbitMQ 實現延遲

2022-06-08 15:12:34

前端前端截圖

2015-10-09 09:51:29

Web API認證

2009-06-15 15:02:48

Spring定時器

2010-09-07 11:09:59

2015-04-30 08:00:05

數據中心多種操作系統

2020-05-11 13:03:03

SR-TEIP路由器

2023-05-31 19:10:31

2010-07-13 14:54:15

Perl面向對象編程

2010-02-02 14:32:32

Python線程編程

2009-06-25 13:43:00

Buffalo AJA

2010-10-21 16:24:18

sql server升

2021-05-27 10:57:01

TCP定時器網絡協議

2010-08-06 09:38:11

Flex讀取XML

2023-03-29 13:06:36

2009-06-23 18:18:13

SpringHibernate

2010-04-20 15:32:20

主控負載均衡

2013-06-27 09:26:50

Android界面刷新
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产欧美日韩一区二区三区在线观看 | 亚洲免费视频网址 | 羞羞午夜| 中文字幕在线网 | 国产欧美在线视频 | 精品国产精品国产偷麻豆 | 麻豆av在线| 欧美日韩中文字幕 | 毛片网在线观看 | 毛片网站在线观看视频 | 日本福利片 | 欧美性视频在线播放 | 欧美精品一区二区免费 | 国产一级在线视频 | 香蕉av免费 | 日韩免费1区二区电影 | 欧美一区二区三区视频在线播放 | 欧美精品福利视频 | 亚洲成av| 一区二区不卡视频 | 亚洲久久久 | 中文字幕日本一区二区 | 日本亚洲一区 | 国产精品午夜电影 | 亚洲精品888| 精品av久久久久电影 | 亚洲一区久久 | 国产日韩欧美精品一区二区 | 亚洲天堂久久新 | 欧美午夜视频 | 久久精品国产99国产精品 | 午夜一区二区三区在线观看 | 欧美一区二区三区在线看 | 久久国产精品-国产精品 | 在线观看精品视频网站 | 久久久精品 | 青青草免费在线视频 | 99热最新网址 | 青青久草 | 精品久久久久久久 | 成人国产精品久久 |