讀古今文學網 > 編寫高質量代碼:改善JavaScript程序的188個建議 > 建議180:提高DOM訪問效率 >

建議180:提高DOM訪問效率

一個頁面一般包含1000多個頁面元素,在定位具體元素時,往往需要花費一定的時間。如果用ID或name定位,效率可能比較快,而用元素的一些其他屬性(如className等)定位,效率就不理想了。可能只有通過遍歷所有元素(getElementsByTagName),然後過濾才能找到相應元素,這就更加低效了。為了提高DOM訪問效率,這裡推薦使用XPath查找元素。很多瀏覽器已支持該功能,具體用法如下:


if(document.evaluate){

var tblHeaders=document.evaluate("//body/p/table//th");

var result=tblHeaders.iterateNext;

while(result){

result.style.border="1px dotte"d blue";

result=xpathResult.iterateNext;

}

}else{//getElementsByTagName

//處理瀏覽器不支持XPath的情況

}

}


瀏覽器XPath的搜索引擎會提高搜索效率,大大縮短結果返回時間。

HTMLCollection對象是一類特殊的對象,類似數組,但不完全是數組。下列方法的返回值一般都是HTMLCollection對象。

❑document.images、document.forms

❑getElementsByTagName

❑getElementsByClassName

這些HTMLCollection對象並不是一個固定的值,而是一個動態的結果。它們是一些比較特殊的查詢返回值。在HTMLCollection對像為下面兩種情況時,它們會重新執行之前的查詢而得到新的返回值(查詢結果),不過在多數情況下會和前一次或幾次的返回值一樣。

❑length屬性

❑具體的某個成員

HTMLCollection對像對這些屬性和成員的訪問,比數組要慢很多。當然也有例外,Opera和Safari對這種情況就處理得很好,不會有太大性能問題。例如:


var items=["test1","test2","test3",...,"testn"];

for(var i=0;i<items.length;i++){

}

var items=document.getElementsByTagName("p");

for(var i=0;i<items.length;i++){

}


與上面一段代碼相比較,下面代碼頻繁讀取items的length屬性值,執行效率要低很多,因為每一個循環都會讀取items.length的值,也會導致document.getElementsByTagName方法的再次調用,這便是效率大幅度下降的原因。可以這樣解決:


var items=document.getElementsByTagName("p");

var len=items.length

for(var i=0;i<len;i++){

}


這樣一來,效率基本與普通數組一樣。

加載並執行一段JavaScript腳本是需要一定時間的,有時候JavaScript腳本被加載後基本沒有被使用過,如腳本中的函數從來沒有被調用等。加載這些腳本只會佔用CPU時間和增加內存消耗,降低Web應用的性能,所以推薦動態加載JavaScript腳本文件,尤其是那些內容較多、消耗資源較大的腳本文件。


if(needXHR){

document.write("<script type='test\/Javascript'src='dojo_xhr.js'>");

}

if(dojo.isIE){

document.write("<script type='test\/Javascript'src='vml.js'>");

}