JavaScript DOM(一)
文件夾:
- DOM家譜樹
- 節點的基本屬性和方法
- document與getElement方法
DOM家譜樹
DOM能夠將不論什麽HTML或XML文檔描繪成一個由多層次節點構成的結構。當中節點被分為幾種不同的類型。每種類型表示文檔中不同的信息或標記。每個節點又擁有各自的屬性和方法,同一時候和其它節點存在著某種關系。
DOM將文檔描寫敘述的層次結構能夠表示為一種”樹型”模型,更確切地說,是一種家譜樹。
它使用parent,child,sibling等稱號來表明家族成員之間的關系。
為了理解DOM描寫敘述的層次結構我們最好還是舉例來說明:
<!DOCTYPE html>
<html>
<head>
<meta charset="gb2312" />
<title>Fruit</title>
</head>
<body>
<h2>Nice Fruit</h2>
<p title="A list of fruit">Eat them usually.</p>
<ul id="list1">
<li class="fruit" >Apple</li>
<li class="fruit">Watermelon</li>
<li class="fruit">Pear</li>
<li class="fruit">Orange</li>
</ul>
</body>
</html>
以上的文檔模型就能夠用下面的家譜樹來表示:
顯然在這個家譜樹中html是根元素。
html有2個child,各自是head和body。它們二者都是根元素的子節點。同一時候又互為兄弟節點。html就是它們的父節點。
繼續向下,我們能夠看到body有3個子節點。分別為h2。p。ul,這三者互為兄弟節點,它們有共同的父節點body。同一時候ul又是4個li節點的父節點。
body的兄弟節點head擁有2個子節點:meta和title。
節點的基本屬性和方法
JavaScript中,節點有12中類型:
- Node.ELEMENT_NODE
- Node.ATTRIBUTE_NODE
- Node.TEXT_NODE
- Node.CDATA_SECTION_NODE
- Node.ENTITY_REFERENCE_NODE
- Node.ENTITY_NODE
- Node.PROCESSING_INSTRUCTION_NODE
- Node.COMMENT_NODE
- Node.DOCUMENT_NODE
- Node.DOCUMENT_TYPE_NODE
- Node.DOCUMENT_FRAGMENT_NODE
- Node.NOTATION_NODE
以上12中類型。分別相應1~12數值常量。不論什麽節點,必屬當中之中的一個。
其實。全部類型的節點都實現了Node接口。
在JavaScript中,也就是繼承了Node類型。因此全部節點都有擁有共同的基本屬性和方法。
節點的基本屬性
節點操作的基本方法
節點的基本屬性
1、nodeType、nodeName及nodeValue屬性
全部的節點類型都屬於以上12種類型之中的一個。節點中的nodeType屬性就存儲著節點的類型值。
比方html,body,p等元素類型的節點,他們的類型都屬於Node.ELEMENT_NODE。相應著數值1。
nodeName以及nodeValue中包括著很多其它有關節點的信息,它們取決於詳細的節點類型。比方對於元素類型(Node.ELEMENT_NODE)的節點,nodeName表示元素的標簽名(如:body,ul,p),nodeValue為null。對於文檔類型(Node.DOCUMENT_NODE),nodeName為”#document”。nodeValue為null。
2、childNodes屬性
文檔中的節點之間通過parent,child,sibling等來描寫敘述彼此之間的關系。每個節點都擁有一個childNodes屬性,該屬性中存放著一個NodeList對象。
NodeList是一種相似數組的對象,專門用於保存一組有序的節點。我們能夠通過下面方式來訪問當中的節點:
方括號:someNode.childNodes[i]
item():someNode.childNodes.item(i)
NodeList對象是具有length屬性的,該屬性值表示當中保存的節點數量:
someNode.childNodes.length
須要強調的是,NodeList對象是基於Dom結構動態查詢的結果,因此。當Dom結構發生變化時。該對象會隨之變化。
因此下面代碼會產生死循環:
var divs = document.getElementsByTagName("div"), i, div;
for (i = 0; i < divs.length; i ++) {
div = document.createElement("div");
document.body.appendChild(div);
}
3、parentNode屬性
每個節點都擁有一個parentNode屬性,該屬性指向該節點的父節點。
假設該節點沒有父節點,這個值為null。
4、firstChild和lastChild屬性
顧名思義。對於一個父節點。這兩個屬性分別指向第一個子節點和最後一個子節點。假設該節點沒有子節點,那麽這兩個值均為null。假設僅僅有一個子節點,這兩個值相等。
5、previousSibling和nextSibling屬性
父節點的childNodes屬性指向一個NodeList對象,當中保存著一組有序節點。
這些節點互為兄弟節點。他們之間能夠通過previousSibling和nextSibling屬性來互相訪問。
previousSibling屬性指向本節點的前一個節點,假設該節點本身為第一個節點。那麽這個值為null。nextSibling屬性相似,它指向本節點的下一個相鄰節點,假設該節點為最後一個節點,那麽這個值為null。
6、ownerDocument
該屬性相同為全部節點共同擁有,指向表示整個文檔的文檔節點。該屬性同一時候也表示了不論什麽節點都必定屬於其所在的文檔。同一時候也唯一屬於該文檔。這個屬性給我們帶來了回溯的便利。我們能夠直接跳到文檔的頂部而不須要在結構層中層層回溯。
對於以上幾種表示節點關系的屬性,我們能夠用下面圖片來表示:
節點操作的基本方法
1、appendChild()
該方法用於向childNodes列表的末尾加入一個節點,並返回這個節點。
註意每次。加入完畢,DOM結構都會動態更新。
var node1 = someNode.appendChild(newNode);
alert(node1 == newNode); //true
alert(someNode.lastChild == node1) //true
2、insertBefore()
該方法會將節點插入到指定節點的前面。
該方法接收2個參數:要插入的節點,參照節點。
比如:
var node = someNode.insertBefore(newNode, someNode.firstChild); //插入到第一個節點之前
var node = someNode.insertBefore(newNode, someNode.lastChild); //插入到最後一個節點之前
var len = someNode.childNodes.length;
var node = someNode.insertBefore(newNode, someNode.childNodes[len - 2]); //插入到倒數第二個節點之前
3、replaceChild()
該方法用於替換某子節點。
該方法相同接收2個參數:要插入的節點。被替換的節點。
比如:
var len = someNode.childNodes.length;
var node = someNode.replaceChild(newNode, someNode.childNodes[len - 4]); //替換倒數第四個節點
4、removeChild()
該方法用於從DOM結構中移出某子節點,該方法僅僅接受一個參數:須要被移出的節點。須要註意的是。調用該方法移出的節點會依舊存在於文檔之中,僅僅只是已經不存在於文檔的層次結構中了。
5、cloneNode()
該方法存在於全部的節點中。接受一個布爾型參數。用於對本節點進行克隆。克隆分為2種:深復制、淺復制。
深復制返回的結果為本節點以及本節點包括的全部子節點樹。
淺復制返回的結果僅僅為當前節點的一個副本。不論深復制還是淺復制。復制後返回的副本同被removeChild()方法移出的節點一樣。存在於文檔中,可是在DOM樹中沒有它的位置。我們能夠通過上面的節點操作方法將其加入到節點樹中。
var nodeTree = someNode.cloneNode(true); //參數為true時表示深復制
var node = someNode.cloneNode(false); //參數為false時表示淺復制
6、hasChildNodes()
該方法會去檢測節點是否包括子節點,包括時返回true,否則返回false。因為NodeList的動態性,我們在訪問childNodes的length屬性的時候,會運行一次對其全部元素的查詢,從這個意義上說。使用hasChildNodes()方法來確認某節點是否包括子節點是一個更簡單的方法。
document與getElement方法
在JavaScript中,document對象表示整個html頁面。同一時候也是window對象的一個屬性,因此我們能夠通過全局對象來訪問它。
有關document對象。最經常使用的莫過於其通過getElement方法來獲取元素引用的方法了。
我們還是以開頭描寫敘述家譜樹的代碼為例:
<!DOCTYPE html>
<html>
<head>
<meta charset="gb2312" />
<title>Fruit</title>
</head>
<body>
<h2>Nice Fruit</h2>
<p title="A list of fruit">Eat them usually.</p>
<ul id="list1">
<li class="fruit" name="li1">Apple</li>
<li class="fruit" name="li2">Watermelon</li>
<li class="fruit" name="li3">Pear</li>
<li class="fruit" name="li4">Orange</li>
</ul>
</body>
</html>
- getElemetById
- getElementsByTagName
- getElementsByName
- getElementsByClassName
getElemetById
該方法同意我們通過元素的id來獲取該元素的引用。該方法接受一個參數:要獲取元素的ID值,若不存在該ID相應的元素。返回null。
比如我們要獲取以上代碼中ul元素的引用。能夠使用下面的方法:
var ulList = document.getElementById("list1");
在文檔中每個元素都是一個對象類型的引用。因此對於以上代碼我們用typeof來檢測的時候會得到object:
alert(typeof ulList); //object
getElementsByTagName
非常多時候我們並不會為文檔中每個元素都定義一個獨一無二的ID,為了獲得元素的引用。我們還能夠使用getElementsByTagName()方法。
該方法接收一個參數:要獲取元素的標簽名。該方法會返回一個包括指定標簽名的元素的集合。
如:
var myLi = document.getElementsByTagName("li");
這樣我們會獲得一個全部li元素的引用。在HTML中。該引用是一個HTMLCollection對象的引用,其與NodeList相似,能夠通過方括號[]和item()來訪問當中的元素,同一時候其自身也擁有length屬性。
alert(myLi.length); //4
alert(myLi[1].name); //li2
alert(mtLi.item(0).name); //li1
同一時候,HTMLCollection對象另一個namedItem()方法,能夠使我們通過元素名更加方便地訪問當中的元素:
myLi.namedItem("li2")
當我們使用通配符”*”作為參數的時候,我們將獲得整個頁面全部元素的引用,在HTMLCollection中,它們依照出現的先後順序排列。
比如獲取以上頁面的全部元素的引用:
var all = document.getElementsByTagName("*");
alert(all.length); //12
alert(all[0]); //html
alert(all[1]); //head
alert(all[2]); //meta
getElementsByName
該方法會返回帶有給定name特性的全部元素,該方法接受一個參數,要獲取元素的name。
要獲取指定name的元素的使用方法十分簡單:
var fruit1 = document.getElementsByName("li0");
這裏,我們另外舉一個十分經常使用的樣例——用於取得單選button:
<ul>
<li><input type="radio" value="red" name="color" id="red"><label for="red">Red<lable></li>
<li><input type="radio" value="white" name="color" id="white"><label for="white">White<lable></li>
<li><input type="radio" value="black" name="color" id="black"><label for="black">Black<lable></li>
</ui>
<script>
var radios = document.getElemtnByName("color");
</script>
以上代碼獲得了全部單選button的HTMLCollection對象。須要註意的是,因為該radios中全部元素的name均為color。我們通過namedItem(“color”)方法僅僅會獲得當中的第一項。
getElementsByClassName
在HTML5 DOM中新增了getElementsByClassName()方法,該方法接受一個參數,即要獲取的元素的類名。
該方法會獲得包括指定類名的元素的集合。
如:
var myFruit = document.getElementsByClassName("fruit");
對於某些沒有提供對該方法支持的瀏覽器。我們也能夠通過遍歷的方法比較easy地給出跨瀏覽器解決方式:
function getElementByClass(node, className) {
if(node.getElementsByClassName) {
return node.getElementsByClassName(className);
} else {
var rets = new Array();
var eles = node.getElementByTagName("*");
for(var i = 0; i < eles.length; i ++) {
if(eles[i].calssName.indexOf(className) != -1) { rets[rets.length] = eles[i]; }
}
return rets;
}
}
JavaScript DOM(一)