js dom 介紹

作爲一個js-DOM開發者,你必須知道的一些DOM方法:
1, 創建節點。
createElement():
var a = document.createElement(“p”);
它創建的是一個元素節點,所以 nodeType 等於 1 。
a.nodeName 將返回 p ;
注意;createElement()方法創建出來的新元素節點不會被自動添加到文檔裏,既然沒添加到文檔裏,說明它還是一個遊離的狀態。所以它也沒有nodeParent屬性。
如果想把它添加到文檔裏,可以使用 appendChild()或者insertBefore()方法或者replaceChild()方法。當然我們在前面的例子中,自己寫了一個insertAfter()方法;
比如:
var a = document.createElement(“p”);
document.body.appendChild(a);
注意: appendChild()默認是添加到文檔的最後。也就是lastChild子節點。
如果想添加到某個地方,可以使用insertBefore()。
如果想在元素插入之前給元素添加屬性。可以這麼做:
var a = document.createElement(“p”);
a.setAttribute(“title”,”my demo”);
document.body.appendChild(a);

createTextNode():
var b = document.createTextNode(“my demo”);
它創建的是一個文本節點,所以nodeType等於 3 。
b.nodeName 將返回 #text ;
跟createElement()一樣,用createTextNode()創建的節點也不會自動添加到文檔裏。需要使用appendChild()或者insertBefore()方法或者replaceChild()方法。
他經常與createElement()配合使用,知道爲什麼嗎?(一個元素節點,一個文本節點。)
var mes = document.createTextNode(“hello world”);
var container = document.createElement(“p”);
container.appendChild(mes);
document.body.appendChild(container);


2, 複製節點。
cloneNode(boolean) :
它有一個參數。
var mes = document.createTextNode("hello world");
var container = document.createElement("p");
container.appendChild(mes);
document.body.appendChild(container);
var newpara = container.cloneNode(true);//true和false的區別
document.body.appendChild(newpara );
注意:
true的話:是<p>aaaa</p> 克隆。
false: 只克隆 <p></p> ,裏面的文本不克隆。
可以自己寫個例子,然後用 firebug 看看。

克隆後的新節點,和createTextNode()一樣 不會被自動插入到文檔 。需要appendChild();
另外還有一個注意: 如果克隆後,id一樣,不要忘記用 setAttribute(“id” , “ another_id “);
改變新的節點的ID。


3, 插入節點。
appendChild() :
給元素追加一個子節點, 新的節點 插入到 最後。
var container = document.createElement("p");
var t = document.createTextNode("cssrain");
container.appendChild(t);
document.body.appendChild(container);
他經常跟createElement()和createTextNode(),cloneNode()配合使用。
另外 appendChild()不僅可以用來追加新的元素,也可以你 挪動 文檔中現有的元素。
看下面的例子:
<p id="msg">msg</p>
<p id="content">content</p>
<p id="aaa">aaaaaaaa</p>
<script>
var mes = document.getElementById("msg");
var container = document.getElementById("content");
container.appendChild(mes);
</script>
//發現msg放到 content 後面去了 。
Js內部處理方式:
先把ID爲msg的從文檔中刪除,然後再插入到content 後,作爲content的最後一個節點。
結果爲:
<p id="content">
content
<p id="msg">msg</p>
</p>
<p id="aaa">aaaaaaaa</p>

insertBefore() :
顧名思義,就是把一個新的節點插入到目標節點的前面。
Element.insertBefore( newNode , targerNode );

第二個參數是可選,如果第二個參數不寫,將默認添加到文檔的最後,相當於appendChild();
我們看看insertBefore()怎麼使用:
<div id="cssrian">
<p id="content">1111</p>
<div id="msg">msg<div>test</div></div>
<p id="content">222</p>
<p id="aaa">aaaaaaaa</p>
</div>
<script>
var msg = document.getElementById("msg");
var aaa = document.getElementById("aaa");
var test = document.getElementById("cssrian");
test.insertBefore( msg , aaa );
</script>
// 我們發現ID爲msg的 插入到了 aaa的前面。
Js內部處理方式跟 appendChild()相似。


4, 刪除節點。
removeChild() :
<body>
<div id="cssrain">
<div id="a">a </div>
<div id="b">b </div>
<div id="c">c </div>
</div>
</body>
<script>
var msg = document.getElementById("cssrain");
var b = document.getElementById("b");
msg.removeChild(b);
</script>
如果不知道要刪除的節點的父節點是什麼?可以使用parentNode屬性。
比如:
<body>
<div id="cssrain">
<div id="a">a </div>
<div id="b">b </div>
<div id="c">c </div>
</div>
</body>
<script>
var b = document.getElementById("b");
var c = b.parentNode;
c.removeChild(b);
</script>

注意: 你如果想把某個節點從一處移動到另一個地方,不必使用removeChild()。
可以使用前面的 appendChild()和insertBefore(),他們都會自動先刪除節點,然後移動到你指定的地方。、


5, 替換節點。
Element.repalceChild( newNode , oldNode );
OldNode必須是Element的一個子節點。
<body>
<div id="cssrain">
<div id="a">a </div>
<div id="b">b </div>
<div id="c">c </div>
</div>
</body>
<script>
var cssrain = document.getElementById("cssrain");
var msg = document.getElementById("b");
var para = document.createElement("p");
cssrain.replaceChild( para , msg );
</script>


6, 設置/獲取屬性節點。
setAttribute();//設置
例子:
var a = document.createElement(“p”);
a.setAttribute(“title”,”my demo”);
不管以前有沒有title屬性,以後的值是 my demo。

getAttribute();//獲取
例子:
var a =document.getElementById(“cssrain”);
var b = a.getAttribute(“title”);
獲取的時候,如果屬性不存在,則返回空,注意ie和ff返回不同,可以看我以前的例子。
返回雖然不同,但是可以用一個方法來判斷。
if(a.getAttribute(“title”) ){ }


7, 查找節點。
getElementById();
返回一個對象, 對象擁有 nodeName , nodeType , parentNode , ChildNodes 等屬性。

getElementsByTagName() 查找標籤名的所有元素。
返回一個集合,可以用循環取出每個對象,對象擁有 nodeName , nodeType , parentNode , ChildNodes 等屬性。
例子:
var ps = document.getElementsByTagName(“p”);
for(var i=0 ; i< ps.length ; i++){
ps[i].setAttribute(“title”,”hello”);
//也可以使用: ps.item(i).setAttribute("title","hello");
}


hasChildNodes:
由名字就可以知道,是判斷元素是否有子節點。
返回boolean類型。
文本節點和屬性節點不可能有子節點,所以他們的hasChildNodes 永遠返回false;
hasChildNodes經常跟 childNodes 一起使用。
比如:
<body>
<div id="cssrain">
<div id="a">a </div>
<div id="b">b </div>
<div id="c">c </div>
</div>
</body>
<script>
var ps = document.getElementById("cssrain")
if(ps.hasChildNodes){
alert( ps.childNodes.length );
}
</script>

8, DOM屬性:
nodeName屬性 : 節點的名字。
如果節點是元素節點,那麼返回這個元素的名字。此時,相當於tagName屬性。
比如:
<p>aaaa</p> : 則返回 p ;
如果是屬性節點,nodeName將返回這個屬性的名字。
如果是文本節點,nodeName將返回一個#text的字符串。

另外我要說的是: nodeName屬性是一個只讀屬性,不能進行設置.(寫)

nodeType屬性 : 返回一個整數,代表這個節點的類型。
我們常用的3中類型:
nodeType == 1 : 元素節點
nodeType == 2 : 屬性節點
nodeType == 3 : 文本節點
如果想記住的話,上面的順序我們可以看做是從 前到後。
比如: <p title="cssrain" >test</p> 從前往後讀: 你會發現 先是元素節點,然後是屬性節點,最後是文本節點,這樣你就很容易記住了 nodeType分別代表什麼類型了。

nodeType屬性經常跟 if 配合使用,以確保不會在錯誤的節點類型上 執行錯誤的操作。
比如:
function cs_demo(mynode){
if(mynode.nodeType == 1){
mynode.setAttribute("title","demo");
}
}
代碼解釋: 先檢查mynode的nodeType屬性,以確保它所代表的節點確實是 一個元素節點。
和nodeName屬性一樣,他也是隻讀屬性,不能進行設置.(寫)。


nodeValue屬性 : 返回一個字符串,這個節點的值。
如果節點是元素節點,那麼返回null;(注意下)
如果是屬性節點,nodeValue將返回這個屬性的值。
如果是文本節點,nodeValue將返回這個文本節點的內容。
比如:
<div id="c">aaaaaaaaaaaaaaaa</div>
<SCRIPT LANGUAGE="JavaScript">
var c= document.getElementById("c");
alert( c.nodeValue );//返回null
</SCRIPT>
nodeValue是一個可以讀、寫的屬性。 但它不能設置元素節點的值。
看下面的例子:
<div id="c">aaaaaaaaaaaaaaaa</div>
<SCRIPT LANGUAGE="JavaScript">
var c= document.getElementById("c");
c.nodeValue =" dddddddddddd"; //不能設置
//alert( c.firstChild.nodeValue ) //元素節點 包括屬性節點和文本節點。
c.firstChild.nodeValue = "test"//能設置
</SCRIPT>
當然我們爲了確保能正確運行:可以加一段代碼:
<div id="c">aaaaaaaaaaaaaaaa</div>
<SCRIPT LANGUAGE="JavaScript">
var c= document.getElementById("c");
c.nodeValue =" dddddddddddd"; //不能設置
//alert( c.firstChild.nodeValue )
if( c.firstChild.nodeType==3 ){ //判斷是不是 文本節點
c.firstChild.nodeValue = "test"//能設置
}
</SCRIPT>
//可以看出,如果要設置元素節點,不能直接設置,而必須先使用firstChild或者lastChild等 然後設置nodeValue.
nodeValue一般只用來設置 文本節點的值。如果要刷新屬性節點的值,一般使用setAttribute().


childNodes屬性 : 返回一個數組,數組由元素節點的子節點構成。
由於文本節點和屬性節點都不可能再包含任何子節點,
所以他們的childNodes屬性永遠返回一個空數組。


可以使用hasChildNodes方法,它用來判斷某個元素有沒有子節點。
或者 if (container.childNodes.length < 1) ;

childNodes也是一個只讀屬性。如果要增加節點,可以使用appendChild()或者insertBefore() ,
刪除節點可以使用removeChild(); 操作後,childNodes屬性會自動刷新。

firstChild屬性 :
由於文本節點和屬性節點都不可能再包含任何子節點,
所以他們的firstChild屬性永遠返回一個空數組。 如果沒有子節點,將返回null;
node.firstChild 等價於 node.childNodes[0] ;
firstChild屬性是一個只讀屬性。


lastChild屬性 :
由於文本節點和屬性節點都不可能再包含任何子節點,
所以他們的lastChild屬性永遠返回一個空數組。 如果沒有子節點,將返回null;
node.lastChild 等價於 node.childNodes[ node.childNodes.length - 1 ] ;
lastChild屬性是一個只讀屬性。

nextSibling 屬性 :
返回目標節點的下一個兄弟節點。
如果目標節點後面沒有同屬於一個父節點的節點,nextSibling 將返回null ;
nextSibling 屬性是一個只讀屬性。

previousSibling屬性 :
返回目標節點的前一個兄弟節點。
如果目標節點前面沒有同屬於一個父節點的節點,previousSibling 將返回null ;
previousSibling 屬性是一個只讀屬性。

parentNode 屬性 :
注:parentNode屬性返回的節點永遠是一個元素節點,因爲只有元素節點纔有可能有子節點。
當然有個例外:
document節點,他沒有父節點。所以document節點的parentNode屬性將返回null;
parentNode 屬性是一個只讀屬性。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章