上面的這篇博文講了HTML、XML和Javascript之間的基本關(guān)系。而Javascript是利用DOM(包括HTMLDOM和XML DOM)來(lái)操作HTML和XML中的內容。本篇博文則對這兩種相似的DOM接口做一下分析。
**************************************************************************************************
先看看這篇文章:
大話(huà)HTMLDOM和XML DOM的區別與聯(lián)系
簡(jiǎn)單地總結一下
聯(lián)系:
HTML與XML共用了Core API(即DOM)。
因此HTML DOM和XML DOM中所指的節點(diǎn)(node)、節點(diǎn)列表(nodeList)等所指的是同一對象。
區別:
只不過(guò)為了方便,HTMLDOM的特性和方法并不是標準的DOM實(shí)現,而是專(zhuān)門(mén)針對HTML的同時(shí)也讓一些DOM操作變得更加簡(jiǎn)便。
HTMLDOM是基于元素的實(shí)現(Element-Based),而不是基于節點(diǎn)(Node-Based)的。
比如在XMLDOM中,元素節點(diǎn)的屬性是一個(gè)以當前元素節點(diǎn)為父節點(diǎn)的屬性節點(diǎn)(元素節點(diǎn)和屬性節點(diǎn)可以利用節點(diǎn)的nodeType屬性值區別,元素節點(diǎn)的nodeType值為1,屬性節點(diǎn)的nodeType值為2)。
而在HTML DOM中,元素節點(diǎn)的屬性則就是屬性,并不作為單獨的節點(diǎn)來(lái)看待。
例如:獲取某個(gè)元素節點(diǎn)的某個(gè)屬性(比如 id)值
XML DOM中: x= myelement.getAttribute(id)
HTML DOM中: x = myelement.id
上面說(shuō)的是最主要的區別,下面來(lái)看幾個(gè)比較特殊的區別:
1. DOM搜索節點(diǎn)的方法getElementsByTagName_r()、getElementByID()
前者即可以用于HTML DOM,也可以用于XML DOM;而后者只能用于HTML DOM。
注:一個(gè)細節,getElementsByTagName_r()方法中element是復數,而getElementByID()方法中的element則是單數。這是因為nodeName相同的節點(diǎn)可以有多個(gè),而一個(gè)id(HTML中的節點(diǎn)屬性)只能對應一個(gè)元素節點(diǎn)。
2. 有兩種特殊的節點(diǎn)屬性來(lái)訪(fǎng)問(wèn)文檔的根節點(diǎn):
- document.documentElement
- document.body
前者即可以用于HTML DOM,也可以用于XML DOM;而后者只能用于HTML DOM。
后者是對HTML頁(yè)面的特殊擴展,提供了對<body>標簽的直接訪(fǎng)問(wèn)。
**************************************************************************************************
最后說(shuō)一下,討論這個(gè)問(wèn)題的本源。
改變HTML的內容:
1. document.write()
括號中的參數是要寫(xiě)入的字符串。根據自己實(shí)驗的結果,我總結的經(jīng)驗是只能在<body>內部使用,且要將代碼包含在<scripttype="text/javascript">...</script>中。
且寫(xiě)入的內容對HTML其余部分沒(méi)有影響,比如:
<head>
<body>
<h1>thisis a heading</h1>
<scripttype="text/javascript">
document.write("helloworld")
</script>
</body>
</head>
這時(shí)候<script>標簽內的操作相當于直接在頁(yè)面中js代碼的位置上增加了一句話(huà)。
2. innerHTML屬性。幾乎所有的HTMLDOM中的元素都有該屬性。它實(shí)際上是一個(gè)字符串,用來(lái)設置或獲取位于對象起始和結束標簽之間的HTML。
通常在<head>中的javascript代碼中,和getElementById()方法結合使用。先使用getElementById()方法獲得目標節點(diǎn),然后使用innerHTML屬性來(lái)獲取或設置節點(diǎn)起始和結束標簽之間的內容。
例如:
document.getElementByIdx_x_x('A1').innerHTML=xmlhttp.status;
其中,A1是HTML中一個(gè)標簽的id,該語(yǔ)句將該標簽的內容設置為讀取XML文件的狀態(tài)。
**************************************************************************************************
最后講一下DOM在不同瀏覽器中的差別。
所有現代瀏覽器都支持W3C DOM規范,但是它們之間是有差異的,主要表現在以下兩點(diǎn):
第一點(diǎn)之前已經(jīng)講過(guò)了,下面來(lái)看第二點(diǎn)。
為了閱讀方便,XML文件經(jīng)常在節點(diǎn)之間含有換行或空格,下例:
<book>
<title>HarryPotter</title>
<author>J K.Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
每行之間都有換行,每個(gè)子節點(diǎn)之間都有兩個(gè)空格。
Firefox及其他瀏覽器會(huì )把空格和換行作為文本節點(diǎn)來(lái)處理,而IE則會(huì )忽略這些換行和空格。
比如,要是想得到第一個(gè)<book>元素的第一個(gè)子節點(diǎn)<title>的內容
在IE中:
txt =xmlDoc.documentElement.getElementsByTagName_r("book")[0].firstChild.firstChild.nodeValue;
在Firefox等其他瀏覽器中
x =xmlDoc.documentElement.getElementsByTagName_r("book")[0];
y =x.firstChild;
while(y.nodeType!=1) // 檢查節點(diǎn)類(lèi)型是否為1,即是否為元素節點(diǎn)
{
y=y.nextSibling; //不是元素節點(diǎn),則往后移一個(gè)同級節點(diǎn)
}
txt =y.firstChild.nodeValue;