欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript中對DOM節(jié)點的訪問、創(chuàng)建、修改、刪除

 更新時間:2015年11月16日 14:35:40   作者:風(fēng)雪漣漪  
這篇文章主要介紹了JavaScript中對DOM節(jié)點的訪問、創(chuàng)建、修改、刪除,是JavaScript入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下

DOM
DOM就是Document object Model的縮寫。文檔對象模型是把XML或HTML以樹節(jié)點為表現(xiàn)形式的文檔。用DOM方法和屬性,你可以訪問,修改,刪除頁面上任意一個元素,也是可以添加一個元素。DOM是獨立于語言的API,可以被任意語言所實現(xiàn),當(dāng)然也包括了Javascript
看看下面的一個文本。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html> 
 <head> 
  <title>My page</title> 
 </head> 
 <body> 
  <p class="opener">first paragraph</p> 
  <p><em>second</em> paragraph</p> 
  <p id="closer">final</p> 
 </body> 
</html> 

 
我們來看看第二段

<p><em>second</em> paragraph</p> 

可以看到這是個p標(biāo)簽。它被包含在body標(biāo)簽中。所以說body是p的父節(jié)點,p是子節(jié)點。第一段和第三段也是body的子節(jié)點。它們都是第二段的兄弟節(jié)點。這個em標(biāo)簽是第二段p的子節(jié)點。因此p就是它的父節(jié)點。父子節(jié)點關(guān)系能描繪出像樹一樣的關(guān)系。所以叫做DOM結(jié)構(gòu)樹(DOM tree).
 
Core DOM 和 HTML DOM
我們已經(jīng)知道DOM可以描繪出HTML和XML文檔。事實上HTML文檔就是XML文檔,只不過更為規(guī)范些。因此作為DOM Level 1的一部分,Core DOM規(guī)范適用于所有XML文檔以及HTML DOM規(guī)范擴展了Core DOM.當(dāng)然HTML DOM不能適用于所有的XML文檔,僅僅適用于HTML文檔。讓我們來看看Core DOM和HTML DOM的構(gòu)造器。
 
構(gòu)造器關(guān)系

20151116142938841.png (639×572)

訪問DOM節(jié)點
當(dāng)要驗證表單或者更換圖片之前,我們要知道怎么樣訪問元素(element.)。有很多方法獲取元素。
 
Document節(jié)點
通過document我們可以訪問當(dāng)前的文檔。我們可以通過firebugs(火狐插件),來查看document的屬性和方法。
 
所有的節(jié)點都有nodeType,nodeName,nodeValue的屬性。我們來看看document的nodeType是什么

document.nodeType;//9 

 一共有12節(jié)點類型。document是9。常用的是元素(element:1),屬性(attribute:2),文本(text:3)。
節(jié)點還有名稱。對于HTML標(biāo)簽。節(jié)點名稱就是標(biāo)簽名稱。文本節(jié)點(text)的名字是#text.文檔節(jié)點(document)的名字是#document.
 
節(jié)點也有值。對于文本節(jié)點,值就是文本。document的值為null
 
documentElement
XML都會有個ROOT節(jié)點來包文檔包含起來。對于HTML文檔。ROOT節(jié)點就是html標(biāo)簽。訪問root節(jié)點??梢杂胐ocumentElement的屬性。

document.documentElement;//<html> 
document.documentElement.nodeType;//1 
document.documentElement.nodeName;//HTML 
document.documentElement.tagName;//對于element,nodeName和tagName相同 

 
 Child Nodes
為了確定是否包含子節(jié)點我們可以用如下方法

document.documentElement.hasChildNodes();//true 

 HTML有兩個子節(jié)點。

document.documentElement.childNodes.length;//2 
 
document.documentElement.childNodes[0];//<head> 
 
document.documentElement.childNodes[1];//<body> 

  也可以通過子節(jié)點訪問父節(jié)點

document.documentElement.childNodes[1].parentNode;//<html> 

 我們把body的引用賦值變量

var bd = document.documentElement.childNodes[1]; 
bd.childNodes.length;//9 

 讓我們看看body的結(jié)構(gòu)

<body> 
 <p class="opener">first paragraph</p> 
 <p><em>second</em> paragraph</p> 
 <p id="closer">final</p> 
 <!-- and that's about it --> 
</body>

  
 為什么子節(jié)點個數(shù)為9個呢。
 首先是4個P還有一個注釋一共4個。
 4個節(jié)點包含了3個空白的節(jié)點。這就7個。
 第8個在body和第一個p之間的空白節(jié)點。
 第9個就是在注釋與</body>之間的空白節(jié)點。
 一共9個節(jié)點。
 
屬性
因為第一節(jié)點是空白節(jié)點,所以第二個節(jié)點才是第一個p標(biāo)簽。

bd.childNodes[1];//  <p class="opener"> 

可以查看它是否有屬性

bd.childNodes[1].hasAttributes();//true 

也可以查看attributes的個數(shù)

bd.childNodes[1].attributes.length;//1 
 
//可以用index和名字來訪問屬性,也可以用getAttribute方法。 
bd.childNodes[1].attributes[0].nodeName;//class 
 
bd.childNodes[1].attributes[0].nodeValue;//opener 
 
bd.childNodes[1].attributes['class'].nodeValue;//opener 
 
bd.childNodes[1].getAttribute('class');//opener 

 訪問標(biāo)簽里的內(nèi)容
讓我們看看第一個標(biāo)簽p
你可以用textContent屬性來訪問。要注意的是,在IE瀏覽器中并不存在textContent,請用innerText來替換,結(jié)果都是一樣的。

bg.childNodes[1].textContent;// "first paragraph" 

還有一個屬性是innerHTML.這并不是DOM的規(guī)范。但是主流瀏覽器都支持這個屬性。它返回的是HTML代碼。
 

bg.childNodes[1].innerHTML;// "first paragraph" 

第一段沒有html代碼,所以結(jié)果和textContent(IE里是innerText)是一樣的。來看下第二段包含HTML代碼的標(biāo)簽

bd.childNodes[3].innerHTML;//"<em>second</em> paragraph" 
 
bd.childNodes[3].textContent;//second paragraph 

 
另一種方法可以獲取文本節(jié)點,然后再取nodeValue屬性,代碼如下

bd.childNodes[1].childNodes.length;//1 子節(jié)點個數(shù) 
 
bd.childNodes[1].childNodes[0].nodeName;// 節(jié)點名稱 #text 
 
bd.childNodes[1].childNodes[0].nodeValue;//節(jié)點值 first paragraph 

 
快速訪問DOM
通過childNodes,parentNode,nodeName,nodeValue以及attributes,可以訪問文檔任意的節(jié)點了。但是在實際運用過程中,文本節(jié)點是比較討厭的。如果文本改變了,有可能就影響腳本了。還有如果DOM樹足夠的深入,那么訪問起來的確有些不方便。幸好我們可以用更為方便的方法來訪問節(jié)點。這些方法是

getElementsByTagName()
getElementsByName()
getElementById()

首先說下getElementsByTagName()
通過一個標(biāo)簽名稱(tag name)來獲取一個html元素的集合。例子如下

document.getElementsByTagName('p').length;//3 

因為返回的是個集合,我們可以用過數(shù)組下標(biāo)的形式來訪問或者通過item方法。比較一下還是推薦用數(shù)組的訪問方法。更簡單一些。

document.getElementsByTagName('p')[0];// <p class="opener"> 
document.getElementsByTagName('p').item(0);//和上面的結(jié)果一樣 
 
document.getElementsByTagName('p')[0].innerHTML;//first paragraph 

 
訪問元素的屬性,可以用attributes集合。但是更簡單的方法是直接作為一個屬性來訪問就行??磦€例子

document.getElementsByTagName('p')[2].id;//closer 

要注意的是,class屬性不能正常的使用。。要用className。因為class在javascript規(guī)范中是保留字。

document.getElementsByTagName('p')[0].className;//opener 

我們可以用如下方法訪問頁面所有元素

<span style="color: #ff0000;">document.getElementsByTagName('*').length;//9</span> 

注意:在IE早期的版本不支持上述方法??梢杂胐ocument.all來取代。IE7已經(jīng)支持了,但是返回的是所有節(jié)點(node),而不僅僅是元素節(jié)點(element nodes)。
 
 
Siblings, Body, First, Last Child
nextSibling和previousSibling是兩個比較方便訪問DOM的方法。用來訪問相鄰的節(jié)點的。例子如下

var para = document.getElementById('closer') 
para.nextSibling;//"\n" 
para.previousSibling;//"\n" 
para.previousSibling.previousSibling;//<p> 
para.previousSibling.previousSibling.previousSibling;//"\n" 
para.previousSibling.previousSibling.nextSibling.nextSibling;// <p id="closer"> 

 
body 用來訪問body元素的。

document.body;//<body> 

firstChild 和lastChild 。firstChild是和childNodes[0]一樣.lastChild和 childNodes[childNodes.length - 1]一樣。
 
遍歷DOM
通過以上的學(xué)習(xí),我們可以寫個函數(shù),用來遍歷DOM

function walkDOM(n) { 
 do { 
  alert(n); 
  if (n.hasChildNodes()) { 
   walkDOM(n.firstChild) 
  }   
 } while (n = n.nextSibling) 
} 
 
walkDOM(document.body);//測試 

修改節(jié)點
下面來看看DOM節(jié)點的修改。
先獲取要改變的節(jié)點。

var my = document.getElementById('closer'); 

非常容易更改這個元素的屬性。我們可以更改innerHTML.

my.innerHTML = 'final';//final 

因為innerHTML可以寫入html,所以我們來修改html。

my.innerHTML = '<em>my</em> final';//<em>my</em> fnal 

em標(biāo)簽已經(jīng)成為dom樹的一部分了。我們可以測試一下

my.firstChild;//<em> 
my.firstChild.firstChild;//my 

我們也可以通過nodeValue來改變值。

my.firstChild.firstChild.nodeValue = 'your';//your 

 
修改樣式
大部分修改節(jié)點可能都是修改樣式。元素節(jié)點有style屬性用來修改樣式。style的屬性和css屬性是一一對應(yīng)的。如下代碼

my.style.border = "1px solid red"; 

CSS屬性很多都有破折號("-"),如padding-top,這在javascript中是不合法的。這樣的話一定要省略波折號并把第二個詞的開頭字母大寫,規(guī)范如下。 margin-left變?yōu)閙arginLeft。依此類推

my.style.fontWeight = 'bold'; 

我們還可以修改其他的屬性,無論這些屬性是否被初始化。

my.align = "right"; 
my.name = 'myname'; 
my.id = 'further'; 
my;//<p id="further" align="right" style="border: 1px solid red; font-weight: bold;"> 

 
創(chuàng)建節(jié)點

為了創(chuàng)建一個新的節(jié)點,可以使用createElement和createTextNode.如果新建完成,可以用appendChild()把節(jié)點添加到DOM樹中。
創(chuàng)建一個元素P,并把設(shè)置innerHTML屬性

var myp = document.createElement('p'); 
myp.innerHTML = 'yet another'; 

 
元素P建完成了,就可以隨意修改添加屬性了

myp.style.border = '2px dotted blue' 

 接下來可以用appendChild把新的節(jié)點添加到DOM樹中的。

document.body.appendChild(myp) 

 
使用DOM的方法
用innerHTML方法的確很簡單,我們可以用純的dom方法來實現(xiàn)上面的功能。

  • 新建一個文本節(jié)點(yet another)
  • 新建一個段落
  • 把文本節(jié)點添加到段落中。
  • 把段落添加到body中
// 創(chuàng)建p 
var myp = document.createElement('p'); 
// 創(chuàng)建一個文本節(jié)點 
var myt = document.createTextNode('one more paragraph') 
myp.appendChild(myt); 
// 創(chuàng)建一個STRONG元素 
var str = document.createElement('strong'); 
str.appendChild(document.createTextNode('bold')); 
// 把STRONG元素添加到P中 
myp.appendChild(str); 
// 把P元素添加到BODY中 
document.body.appendChild(myp); 
//結(jié)果<p>one more paragraph<strong>bold</strong></p> 
 cloneNode()

另一種新建節(jié)點的方法是,我們可以用cloneNode來復(fù)制一個節(jié)點。cloneNode()可以傳入一個boolean參數(shù)。如果為true就是深度復(fù)制,包括他的子節(jié)點,false,僅僅復(fù)制自己。
 
首先獲取要復(fù)制的元素。

var el = document.getElementsByTagName('p')[1];//<p><em>second</em> paragraph</p> 

先不用深度復(fù)制。

document.body.appendChild(el.cloneNode(false)) 

我們發(fā)現(xiàn)頁面并沒有變化,因為僅僅復(fù)制的是元素p。和下面的效果一樣。

document.body.appendChild(document.createElement('p')); 

如果用深度復(fù)制,包括p下面所有的子節(jié)點都會被復(fù)制。當(dāng)然包括文本節(jié)點和EM元素。

document.body.appendChild(el.cloneNode(true)) 

 
insertBefore()
用appendChild,就是把元素添加到最后。而insertBefore方法可以更精確控制插入元素的位置。

elementNode.insertBefore(new_node,existing_node) 

實例

document.body.insertBefore( 
 document.createTextNode('boo!'), 
 document.body.firstChild 
); 

 
意思就是新建一個文本節(jié)點,把它作為body元素的第一個節(jié)點。
 
 
刪除節(jié)點

要從DOM樹刪除一個節(jié)點,我們可以使用removeChild().我們來看看要操作的HTML

<body> 
 <p class="opener">first paragraph</p> 
 <p><em>second</em> paragraph</p> 
 <p id="closer">final</p> 
 <!-- and that's about it --> 
</body> 

來看看下面代碼,刪除第二段

var myp = document.getElementsByTagName('p')[1]; 
var removed = document.body.removeChild(myp); 

removed節(jié)點就是刪除的節(jié)點。以后還可以用這刪除的節(jié)點。
 
我們也可以用replaceChild()方法。這個方法是刪除一個節(jié)點,并用另一個節(jié)點替代。當(dāng)執(zhí)行上個刪除節(jié)點操作之后,結(jié)果如下

<body> 
 <p class="opener">first paragraph</p> 
 <p id="closer">final</p> 
 <!-- and that's about it --> 
</body> 

 我們來看看replaceChild的使用。我們把上一個刪除節(jié)點來替代第二個p

var replaced = document.body.replaceChild(removed, p); 

 和removeChild返回一樣。replaced就是移除的節(jié)點?,F(xiàn)在結(jié)果為

<body> 
 <p class="opener">first paragraph</p> 
 <p><em>second</em> paragraph</p> 
 <!-- and that's about it --> 
</body> 

相關(guān)文章

最新評論