讀古今文學網 > 編寫高質量代碼:改善JavaScript程序的188個建議 > 第5章 DOM編程 >

第5章 DOM編程

DOM(文檔對像模型)是一個獨立於JavaScript語言的,使用XML和HTML文檔操作的應用程序接口(API)。在瀏覽器中,DOM主要與HTML文檔打交道,因此在網頁應用中檢索XML文檔也很常見。雖然DOM是與語言無關的API,但是瀏覽器中的接口卻是以JavaScript實現的。客戶端大多數腳本程序與文檔打交道,因此DOM就成為JavaScript代碼日常行為中重要的組成部分。瀏覽器通常要求DOM實現和JavaScript實現保持相互獨立。例如,在IE中,被稱為JScript的JavaScript實現位於庫文件jscript.dll中,而DOM實現位於另一個庫文件mshtml.dll中。

這種分離技術為其他技術和語言提供了准入接口。Safari使用WebKit的WebCore處理DOM和渲染,具有一個分離的JavascriptCore引擎(最新版本的綽號是SquirrelFish)。Google Chrome也使用WebKit的WebCore庫渲染頁面,卻實現了自己的JavaScript引擎V8。在Firefox中,JavaScript實現採用Spider-Monkey(最新版是TraceMonkey),與其Gecko渲染引擎相分離。

對DOM操作代價很高,在富網頁應用中通常是一個性能瓶頸。兩個獨立的部分以功能接口連接就會帶來性能損耗。我們可以把DOM看成一個島嶼,把JavaScript(ECMAScript)看成另一個島嶼,兩者之間通過一座橋連接。每次ECMAScript需要過橋訪問DOM時,都會帶來一定的性能損耗。操作DOM次數越多,損耗越大。一般的建議是盡量減少這種過橋操作次數,努力停留在ECMAScript島上。

建議106:建議先檢測瀏覽器對DOM支持程度

W3C制定的DOM規範包括多個版本,不同版本(或稱級別)又包含不同的子規範和模塊,不同瀏覽器對DOM支持是千差萬別的。另外,DOM不同版本之間可能會存在個別不兼容的規定,這一點需要特別留意。

(1)DOM 0級

在W3C推出DOM標準之前,市場已經流行了幾個版本不太一致的DHTML規範,主要包括IE和Netscape兩個不同版本。這組DHTML規範規定了一套文檔對像、集合、方法和屬性,雖然不同版本DHTML規範的特性存在很大差異,但是一些基本思路和用法還是有章可循的,如事件處理函數、腳本化樣式、文檔基本結構對像等。

(2)DOM 1級

1998年10月,W3C推出了DOM 1.0版本規範(http://www.w3.org/DOM/DOMTR.html#dom1),主要包括兩個子規範。

❑DOM Core(核心部分):把XML文檔設計為樹形節點結構,並為這種結構的運行機制制定了一套規範化標準,同時定義了創建、編輯、操縱這些文檔結構的基本屬性和方法。

❑DOM HTML:針對HTML文檔、標籤集合,以及與個別HTML標籤相關的元素定義了對象、屬性和方法。

(3)DOM 2級

2000年11月,W3C正式發佈了更新後的DOM核心部分,並在這次發佈中添加了一些新規範,這次發佈的DOM稱為2級規範。

2003年1月,W3C又正式發佈了對DOM HTML子規範的修訂,添加了針對HTML 4.01和XHTML 1.0版本文檔中的很多對像、屬性和方法。W3C把新修訂的DOM規範統稱為DOM 2.0推薦版本(http://www.w3.org/DOM/DOMTR.html#dom2),該版本主要包括6個推薦子規範。

❑DOM2 Core:繼承於DOM Core子規範,系統規定了DOM文檔結構模型,添加了更多的特性,如針對命名空間的方法等(參閱http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/changes.html)。

❑DOM2 HTML:繼承於DOM HTML,系統規定了針對HTML的文檔結構模型,並添加了一些屬性(參閱http://www.w3.org/TR/2003/REC-DOM-Level-2-HTML-20030109/changes.html)。

❑DOM2 Events:規定了與鼠標相關的事件(包括目標、捕獲、冒泡和取消)的控制機制,但不包含與鍵盤相關事件的處理部分。

❑DOM2 Style(或DOM2 CSS):提供了訪問和操縱所有與CSS相關的樣式及規則的能力。

❑DOM2 Traversal和DOM2 Range:這兩個規範允許開發人員通過迭代方式訪問DOM,以便根據需要對文檔進行遍歷或其他操作。

❑DOM2 Views:提供了訪問和更新文檔表現的能力。

DOM 2級規範已經成為目前各大瀏覽器支持的主流標準,但IE對於該規範的支持不盡完善,特別是在對DOM2 Traversal和DOM2 Range的支持上。

(4)DOM 3級

2004年4月,W3C發佈了DOM 3.0版本(http://www.w3.org/DOM/DOMTR.html#dom3)。DOM 3級版本主要包括以下3個推薦子規範。

❑DOM3 Core:繼承於DOM2 Core,並添加了更多的新方法和新屬性,同時也修改了已有的一些方法(參閱http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/changes.html)。

❑DOM3 Load and Save:提供將XML文檔的內容加載到DOM文檔中和將DOM文檔序列化為XML文檔的能力。

❑DOM3 Validation:提供了確保動態生成的文檔的有效性的能力,即如何符合文檔類型聲明。

為了能夠檢測不同類型瀏覽器及各個版本對DOM規範的支持程度,可以調用DOMImplementation對象,該對像被DOM核心規範規定,通過document對象的implementation屬性來調用。如果瀏覽器支持DOM某個特性,那麼可以通過implementation對象的hasFeature方法來檢測。檢測代碼如下:


var dom=\"HTML\";//指定DOM模塊

var ver=\"1.0\";//指定DOM級別

if(document.implementation){//如果瀏覽器支持implementation對象,則進行測試

if(document.implementation.hasFeature(dom,ver)){//檢測對指定DOM模塊及版本的支持情況

alert(\"支持:n\"+dom+\"\"+ver);

}

else{

alert(\"不支持:n\"+dom+\"\"+ver);

}

}

else{

alert(\"不支持:n DOMImplementation對像\");

}


如果瀏覽器中不存在document.implementation對象,那麼基本可以確定它不支持DOM,不過也可能部分支持,如IE 6.0支持HTML,而不支持Core,但為了支持HTML,自然會支持DOM核心的某些部分,因為HTML需要核心方法。

hasFeature方法包含兩個參數,第一個參數用來指定DOM模塊的名稱,第二個參數指定模塊的級別,包括1、2、3,所有參數都以字符串的形式進行傳遞。

訪問http://www.w3.org/2003/02/06-dom-support.html,頁面會自動顯示當前瀏覽器版本所支持的模塊。其中「N/A」表示某個模塊在某個級別下是不適用的,即還沒有開發或推薦標準。如果顯示白色背景,提示信息為「supported」,則表示支持這個級別的模塊。如果顯示紅色背景,提示這個級別版本的發佈時間,則說明當前瀏覽器版本不支持這個模塊。

訪問http://www.w3.org/DOM/Test/,對DOM規範中每一個模塊的個別部分進行更具體的測試。這種測試的時間稍長,但會檢測每個對象的每個方法,因而可以檢測出哪些方法符合規範。