DOM(文檔對象模型)是針對HTML和XML文檔的一個API。DOM描繪了一個層次化的節點樹,允許開發人員添加、移除和修改頁面的某一部分。
節點層次
根節點爲文檔節點(document),下面有各種節點,包括元素節點、特性節點和文檔節點等,共同組成一顆節點樹。
Node類型
JavaScript中所有節點類型都繼承自Node類型,因此也就擁有Node類型的屬性和方法。以下方法和屬性調用者爲someNode。
1、屬性
nodeType:判斷節點類型,爲一個1到12的數字分別代表不同類型,如element類型爲數字1。
nodeName,nodeValue:對於不同類型節點去不同的值。
childNodes:子節點的NodeList對象,NodeList是一種類數組對象,有length屬性,可通過方括號或item()訪問各項。
parentNode:指向父節點
previousSibling:指向前面的兄弟節點
nextSibling:指向後面的兄弟節點
firstChild:指向第一個子節點
lastChild:指向最後一個子節點
ownerDocument:指向整個文檔的文檔節點
2、方法
hasChildNodes():判斷是否有子節點
appendChild():向childNodes列表的末尾增加一個節點 注:任何節點不能同時出現在文檔的多個位置上
insertBefore():向某個位置的前面插入一個節點
replaceChild():替換指定節點
removeChild():移除某個節點
cloneNode():複製節點,如果參數爲true,則深度複製 //除IE9之前的IE瀏覽器外,都會爲空白字符創建節點
normalize():刪除空文本節點,合併相鄰文檔節點
Document類型
Document類型表示文檔。瀏覽器中document對象是window對象的一個屬性,因此可以作爲全局對象來訪問。
1、文檔的子節點
documentElement:指向<html>元素,等同於document.childNodes[0]和document.firstChild
body:指向<body>元素
doctype:大多數情況下會指向一個DocumentType節點
2、文檔信息
title:當前頁面的標題
URL:包含頁面完整的URL,不可設置
domain:只包含頁面的域名,可以設置,但是不能設置爲URL中不包含的域,並且設置過程只能從緊繃到鬆散(p2p.wrox.com——>wrox.com),設置爲相同域,便於通信
referrer:保存着鏈接到當前頁面的那個頁面的URL,不可設置
3、查找元素
getElementById():取得ID名爲參數的元素
getElementByTagName():參數爲要去的元素的標籤名,返回一個NodeList對象,在HTML文檔中,返回一個HTMLCollection對象
namedItem():HTMLCollection對象的一個方法,通過元素的name特性取得集合中的項
getElementsByName():返回帶有給定name特性的所有元素,返回一個HTMLCollection對象,只有HTMLDocument對象才具有此方法
上面這些方法也可用element類型調用,表示在相應的節點下操作。
4、特殊集合
以下幾種屬性都返回HTMLCollection對象
forms:包含文檔中的所有<form>元素,與document.getElementByTagName("form")得到結果相同
images:包含文檔中的所有<fimg>元素,與document.getElementByTagName("img")得到結果相同
anchors:包含文檔中所有帶name屬性的<a>元素
links:包含文檔中所有帶href特性的<a>元素
5、DOM一致性檢測
document.implementation.hasFeature():檢測瀏覽器是否支持給定名稱和版本的功能
6、文檔寫入
write(),writeln():想文檔寫入內容,可以包含html語句,也可以包含文本內容,但在加載結束後調用時重寫整個頁面
Element類型
Element類型是Web編程中比較常用的類型,用於表現XML或HTML元素,提供了對元素標籤名(tagName)、子節點及特性的訪問。
1、HTML元素
id:元素的id特性值
className:元素的class特性值。注意:不是class而是className
2、取得特性
getAttribute():獲取指定特性名的特性值,特性可以是公認的特性或者是自定義的特性(data-前綴)。當時公認的特性時,與使用相對應的屬性訪問效果相同。如div.id等同於div.getAttribute("id"),這裏的div是通過document.getElementById("myDiv")獲取的Element類型對象
3、設置特性
setAttribute():接受兩個參數,設定指定特性的值
4、刪除特性
removeAttribute()
5、attributes屬性
attributes:返回一個NamedNodeMap對象,包含元素的動態特性集合,常用語遍歷元素的所有屬性
6、創建元素
一般流程:創建一個新元素,爲該元素添加特性值,將新元素用appendChild()等方法插入到文檔中。
document.createElement():創建一個新元素
Text類型
可以通過nodeValue屬性或data屬性訪問Text節點包含的文本。操作節點中文本的方法有如下幾種:
appendData(text):將text添加到節點的末尾
deleteData():刪除指定位置的文本
insertData():插入文本
replaceData():替換文本
substringData():提取指定的字符串
1、創建文本節點
document.createTextNode():創建文本節點,一般將其appendChild()到element類型中
2、規範化文本節點
normalize():合併相鄰文本節點(element.normalize())
3、分割文本節點
分割文本節點是從文本節點中獲取數據的一種常用DOM技術。
splitText():將一個文本節點在指定位置分成兩個文本節點
DocumentFragment類型
文檔片段類型雖然不能被直接添加到文檔中,但是它可以作爲一個”倉庫“來使用,可以在裏面保存可能添加到文檔中的節點,然後實現一次添加,而文檔樹不會被添加進去。
看下面這個例子
<ul id="myList"></ul>
假設我們想爲該ul元素添加3個列表項,我們可以用文檔片段來這樣添加:
var fragment=document.createDocumentFragment();
var ul=document.getElementById("myList");
var li=null;
for(var i=0;i<3;i++){
li=document.createElement("li");
li.appendChild(document.createTextNode("Item"+(i+1)));
<strong>fragment.appendChild(li);</strong>
}
<strong>ul.appendChild(fragment);</strong>
通過文檔片段添加的好處是,如果我們逐個添加列表項,那麼每添加一次,瀏覽器就會渲染一次新信息。而利用文檔片段,我們可以實現一次性的添加。
DOM操作技術
通過前面介紹的方法和屬性,我們可以通過動態的創建<script>標籤,<style>標籤併爲他們添加相應的特性,就可以實現創建動態腳本和動態樣式的功能。其中,這些腳本和樣式可以是外部文件,也可以使內嵌代碼。
最後注:前面所提到的NodeList對象,NamedNodeMap對象以及HTMLCollection對象都是”動態的“,也就是說,每當文檔結構發生變化,它們都會動態更新,因此每次訪問這些對象,都會進行一次基於文檔的查詢,所以可以考慮將這些類型的對象取得的值緩存起來。