理解DOM
前言
本文試圖弄清楚DOM到底是什么,不會(huì)討論具體DOM節(jié)點(diǎn)的操作。
DOM是什么
DOM全稱為The Document Object Model,應(yīng)該理解為是一個(gè)規(guī)范,定義了HTML和XML文檔的邏輯結(jié)構(gòu)和文檔操作的編程接口。
文檔邏輯結(jié)構(gòu)
DOM實(shí)際上是以面向?qū)ο蠓绞矫枋龅膶?duì)象模型,它將文檔建模為一個(gè)個(gè)對(duì)象,以樹(shù)狀的結(jié)構(gòu)組織(本文稱之為“文檔樹(shù)”,樹(shù)中的對(duì)象稱為“節(jié)點(diǎn)”)。
每個(gè)文檔包含1個(gè)document節(jié)點(diǎn),0個(gè)或1個(gè)doctype節(jié)點(diǎn)以及0個(gè)或多個(gè)元素節(jié)點(diǎn)等。document節(jié)點(diǎn)是文檔樹(shù)的根節(jié)點(diǎn)。
如對(duì)于HTML文檔,DOM 是這樣規(guī)定的:
- 整個(gè)文檔是一個(gè)文檔節(jié)點(diǎn)
- 每個(gè) HTML 標(biāo)簽是一個(gè)元素節(jié)點(diǎn)
- 包含在 HTML 元素中的文本是文本節(jié)點(diǎn)
- 每一個(gè) HTML 屬性是一個(gè)屬性節(jié)點(diǎn)
- 注釋屬于注釋節(jié)點(diǎn)
節(jié)點(diǎn)與文檔內(nèi)容是一一對(duì)應(yīng)的關(guān)系,節(jié)點(diǎn)之間有層次關(guān)系。
例如下面的hmlt文檔:
<!DOCTYPE html>
<html>
<head>
<title>文檔標(biāo)題</title>
</head>
<body>
<a href="">我的鏈接</a>
<h1>我的標(biāo)題</h1>
</body>
</html>
會(huì)被建模為下面的文檔樹(shù):
又如下面的html文檔:
<!DOCTYPE html>
<html class=e>
<head><title>Aliens?</title></head>
<body>Why yes.</body>
</html>
會(huì)被建模為下面的文檔樹(shù):
文檔操作
程序員可以使用DOM定義的接口來(lái)獲得對(duì)文檔中所有元素進(jìn)行訪問(wèn)的入口,創(chuàng)建文檔,瀏覽文檔結(jié)構(gòu),添加、修改或刪除文檔元素和內(nèi)容。
HTML或XML文檔中的所有的內(nèi)容都可以通過(guò)使用DOM定義的接口來(lái)操作。
DOM到底是對(duì)象模型還是編程接口?
總的來(lái)說(shuō),DOM應(yīng)該理解為是1個(gè)規(guī)范。
站在實(shí)現(xiàn)(如瀏覽器)和使用者(如程序員)的角度來(lái)看,DOM就是一套文檔節(jié)點(diǎn)的編程接口,只要實(shí)現(xiàn)了接口,就可以使用接口成員來(lái)操作文檔;站在設(shè)計(jì)和制定的角度來(lái)看,DOM是一個(gè)對(duì)象模型,它將文檔內(nèi)容建模為對(duì)象并組織為樹(shù)狀結(jié)構(gòu),定義了這些對(duì)象的行為和屬性以及這些對(duì)象之間的關(guān)系。
DOM不是什么
- DOM不是一個(gè)數(shù)據(jù)結(jié)構(gòu)集,并沒(méi)有定義數(shù)據(jù)結(jié)構(gòu)。
- DOM沒(méi)有定義文檔中什么信息是相關(guān)的或者文檔中的信息是如何組織的。
如對(duì)于XML,這些是在XML Information Set中指定的。DOM只是這些信息集的API。
鑒于水平有限,w3c資料中我沒(méi)有理解的部分此處沒(méi)有給出,詳細(xì)內(nèi)容可參考What is the Document Object Model -> What the Document Object Model is not
DOM的分級(jí)
上面討論的DOM是1級(jí)DOM,具體就是 DOM CORE和DOM HTML,它將HTML和XML文檔映射為對(duì)由層次對(duì)象(節(jié)點(diǎn))組成的樹(shù)。
根據(jù)W3C DOM規(guī)范,DOM有1級(jí)、2級(jí)、3級(jí)以及最新的4級(jí),本文只討論前3級(jí)DOM。
1級(jí)DOM
1級(jí)DOM在1998年10月份成為W3C的提議,由DOM CORE與DOM HTML兩個(gè)模塊組成。DOM CORE能映射以XML為基礎(chǔ)的文檔結(jié)構(gòu),允許獲取和操作文檔的任意部分。DOM HTML通過(guò)添加HTML專用的對(duì)象與函數(shù)對(duì)DOM核心進(jìn)行了擴(kuò)展。
2級(jí)DOM
鑒于1級(jí)DOM僅以映射文檔結(jié)構(gòu)為目標(biāo),DOM 2級(jí)面向更為寬廣。通過(guò)對(duì)原有DOM的擴(kuò)展,2級(jí)DOM通過(guò)對(duì)象接口增加了對(duì)鼠標(biāo)和用戶界面事件(DHTML長(zhǎng)期支持鼠標(biāo)與用戶界面事件)、范圍、遍歷(重復(fù)執(zhí)行DOM文檔)和層疊樣式表(CSS)的支持。同時(shí)也對(duì)DOM 1的核心進(jìn)行了擴(kuò)展,從而可支持XML命名空間。
2級(jí)DOM引進(jìn)了幾個(gè)新DOM模塊來(lái)處理新的接口類型:
DOM視圖:描述跟蹤一個(gè)文檔的各種視圖(使用CSS樣式設(shè)計(jì)文檔前后)的接口;
DOM事件:描述事件接口;
DOM樣式:描述處理基于CSS樣式的接口;
DOM遍歷與范圍:描述遍歷和操作文檔樹(shù)的接口;
3級(jí)DOM
3級(jí)DOM通過(guò)引入統(tǒng)一方式載入和保存文檔和文檔驗(yàn)證方法對(duì)DOM進(jìn)行進(jìn)一步擴(kuò)展,DOM3包含一個(gè)名為“DOM載入與保存”的新模塊,DOM核心擴(kuò)展后可支持XML1.0的所有內(nèi)容,包擴(kuò)XML Infoset、 XPath、和XML Base。
"0級(jí)"DOM
當(dāng)閱讀與DOM有關(guān)的材料時(shí),可能會(huì)遇到參考0級(jí)DOM的情況。需要注意的是并沒(méi)有標(biāo)準(zhǔn)被稱為0級(jí)DOM,它僅是DOM歷史上一個(gè)參考點(diǎn)(0級(jí)DOM被認(rèn)為是在Internet Explorer 4.0 與Netscape Navigator4.0支持的最早的DHTML)。
浙公網(wǎng)安備 33010602011771號(hào)