JavaScript學習筆記之DOM

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對象都是”動態的“,也就是說,每當文檔結構發生變化,它們都會動態更新,因此每次訪問這些對象,都會進行一次基於文檔的查詢,所以可以考慮將這些類型的對象取得的值緩存起來。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章