日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網營銷解決方案
淺談DOM文檔對象模型基礎

一、DOM基礎

創(chuàng)新互聯(lián)公司是創(chuàng)新、創(chuàng)意、研發(fā)型一體的綜合型網站建設公司,自成立以來公司不斷探索創(chuàng)新,始終堅持為客戶提供滿意周到的服務,在本地打下了良好的口碑,在過去的10年時間我們累計服務了上千家以及全國政企客戶,如成都圍欄護欄等企業(yè)單位,完善的項目管理流程,嚴格把控項目進度與質量監(jiān)控加上過硬的技術實力獲得客戶的一致稱譽。

1.節(jié)點(node)層次

Document--最頂層的節(jié)點,所有的其他節(jié)點都是附屬于它的。
DocumentType--DTD引用(使用語法)的對象表現(xiàn)形式,它不能包含子節(jié)點。
DocumentFragment--可以像Document一樣來保存其他節(jié)點。
Element--表示起始標簽和結束標簽之間的內容,例如或者。這是唯一可以同時包含特性和子節(jié)點的節(jié)點類型。
Attr--代表一對特性名和特性值。這個節(jié)點類型不能包含子節(jié)點。
Text--代表XML文檔中的在起始標簽和結束標簽之間,或者CDataSection內包含的普通文本。這個節(jié)點類型不能包含子節(jié)點。
CDataSection--的對象表現(xiàn)形式。這個節(jié)點類型僅能包含文本節(jié)點Text作為子節(jié)點。
Entity--表示在DTD中的一個實體定義,例如。這個節(jié)點類型不能包含子節(jié)點。
EntityReference--代表一個實體引用,例如"。這個節(jié)點類型不能包含子節(jié)點。
ProcessingInstruction--代表一個PI。這個節(jié)點類型不能包含子節(jié)點。
Comment--代表XML注釋。這個節(jié)點不能包含子節(jié)點。
Notation--代表在DTD中定義的記號。這個很少用到。

Node接口定義了所有節(jié)點類型都包含的特性和方法。

特性/方法類型/返回類型說明
nodeNameString節(jié)點的名字;根據節(jié)點的類型而定義
nodeValueString節(jié)點的值;根據節(jié)點的類型而定義
nodeTypeNumber節(jié)點的類型常量值之一
ownerDocumentDocument指向這個節(jié)點所屬的文檔
firstChildNode指向在childNodes列表中的***個節(jié)點
lastChildNode指向在childNodes列表中的***一個節(jié)點
childNodesNodeList所有子節(jié)點的列表
previousSiblingNode指向前一個兄弟節(jié)點;如果這個節(jié)點就是***個兄弟節(jié)點,那么該值為null
nextSiblingNode指向后一個兄弟節(jié)點;如果這個節(jié)點就是***一個兄弟節(jié)點,那么該值為null
hasChildNodes()Boolean當childNodes包含一個或多個節(jié)點時,返回真
attributesNamedNodeMap包含了代表一個元素的特性的Attr對象;僅用于Element節(jié)點
appendChild(node)Node將node添加到childNodes的末尾
removeChild(node)Node從childNodes中刪除node
replaceChild(newnode,oldnode)Node將childNodes中的oldnode替換成newnode
insertBefore(newnode,refnode)Node在childNodes中的refnode之前插入newnodd

除節(jié)點外,DOM還定義了一些助手對象,它們可以和節(jié)點一起使用,但不是DOM文檔必有的部分。

NodeList--節(jié)點數(shù)組,按照數(shù)值進行索引;用來表示和一個元素的子節(jié)點。

NamedNodeMap--同時使用數(shù)值和名字進行索引的節(jié)點表;用于表示元素特性。

2.訪問相關的節(jié)點

下面的幾節(jié)中考慮下面的HTML頁面

 
 
 
  1.  
  2.      
  3.         DOM Example 
  4.      
  5.      
  6.         

    Hello World!

     
  7.         

    Isn't this exciting?

     
  8.         

    You're learning to use the DOM!

     
  9.      
  10.  

要訪問元素(你應該明白這是該文件的document元素),你可以使用document的documentElement特性:

 
 
 
  1. var oHtml = document.documentElement; 

現(xiàn)在變量oHtml包含一個表示的HTMLElement對象。如果你想取得和元素,下面的可以實現(xiàn):

 
 
 
  1. var oHead = oHtml.firstChild;  
  2. var oBody = oHtml.lastChild; 

也可以使用childNodes特性來完成同樣的工作。只需把它當成普通的javascript array,使用方括號標記:

 
 
 
  1. var oHead = oHtml.childNodes[0];  
  2. var oBody = oHtml.childNodes[1]; 

注意方括號標記其實是NodeList在javascript中的簡便實現(xiàn)。實際上正式的從childNodes列表中獲取子節(jié)點的方法是使用item()方法:

 
 
 
  1. var oHead = oHtml.childNodes.item(0);  
  2. var oBody = oHtml.childNodes.item(1); 

HTML DOM頁定義了document.body作為指向元素的指針。

 
 
 
  1. var oBody = ducument.body; 

有了oHtml,oHead和oBody這三個變量,就可以嘗試確定它們之間的關系:

 
 
 
  1. alert(oHead.parentNode==oHtml);  
  2. alert(oBody.parentNode==oHtml);  
  3. alert(oBody.previousSibling==oHead);  
  4. alert(bHead.nextSibling==oBody);  
  5. alert(oHead.ownerDocument==document); 

以上均outputs "true"。

3.處理特性

正如前面所提到的,即便Node接口已具有attributes方法,且已被所有類型的節(jié)點繼承,然而,只有

Element節(jié)點才能有特性。Element節(jié)點的attributes屬性其實是NameNodeMap,它提供一些用于訪問和處理其內容的方法:

getNamedItem(name)--返回nodename屬性值等于name的節(jié)點;

removeNamedItem(name)--刪除nodename屬性值等于name的節(jié)點;

setNamedItem(node)--將node添加到列表中,按其nodeName屬性進行索引;

item(pos)--像NodeList一樣,返回在位置pos的節(jié)點;

注:請記住這些方法都是返回一個Attr節(jié)點,而非特性值。

NamedNodeMap對象也有一個length屬性來指示它所包含的節(jié)點的數(shù)量。

當NamedNodeMap用于表示特性時,其中每個節(jié)點都是Attr節(jié)點,這的nodeName屬性被設置為特性名稱,而nodeValue屬性被設置為特性的值。例如,假設有這樣一個元素:

 
 
 
  1. Hello world!

     

同時,假設變量oP包含指向這個元素的一個引用。于是可以這樣訪問id特性的值:

 
 
 
  1. var sId = oP.attributes.getNamedItem("id").nodeValue; 

當然,還可以用數(shù)值方式訪問id特性,但這樣稍微有些不直觀:

 
 
 
  1. var sId = oP.attributes.item(1).nodeValue; 

還可以通過給nodeValue屬性賦新值來改變id特性:

 
 
 
  1. oP.attributes.getNamedItem("id").nodeValue="newId"; 

Attr節(jié)點也有一個完全等同于(同時也完全同步于)nodeValue屬性的value屬性,并且有name屬性和nodeName屬性保持同步。我們可以隨意使用這些屬性來修改或變更特性。

因為這個方法有些累贅,DOM又定義了三個元素方法來幫助訪問特性:

getAttribute(name)--等于attributes.getNamedItem(name).value;
setAttribute(name,newvalue)--等于attribute.getNamedItem(name).value=newvalue;
removeAttribute(name)--等于attribute.removeNamedItem(name)。

4.訪問指定節(jié)點

(1)getElementsByTagName()

核心(XML) DOM定義了getElementsByTagName()方法,用來返回一個包含所有的tagName(標簽名)特性等于某個指定值的元素的NodeList。在Element對象中,tagName特性總是等于小于號之后緊跟隨的名稱--例如,的tagName是"img"。下一行代碼返回文檔中所有元素的列表:

 
 
 
  1. var oImgs = document.getElementsByTagName("img"); 

把所有圖形都存于oImgs后,只需使用方括號或者Item()方法(getElementsByTagName()返回一個和childNodes一樣的NodeList),就可以像訪問子節(jié)點那樣逐個訪問這些節(jié)點了:

 
 
 
  1. alert(oImgs[0].tagName); //outputs "IMG" 

假如只想獲取在某個頁面***個段落的所有圖像,可以通過對***個段落元素調用getElementsByTagName()來完成,像這樣:

 
 
 
  1. var oPs = document.getElementByTagName("p");  
  2. var oImgsInp = oPs[0].getElementByTagName("img"); 

可以使用一個星號的方法來獲取document中的所有元素:

 
 
 
  1. var oAllElements = document.getElementsByTagName("*"); 

當參數(shù)是一個星號的時候,IE6.0并不返回所有的元素。必須使用document.all來替代它。

(2)getElementsByName()

HTML DOM 定義了getElementsByName(),這用來獲取所有name特性等于指定值的元素的。

(3)getElementById()

這是HTML DOM定義的第二種方法,它將返回id特性等于指定值的元素。在HTML中,id特性是唯一的--這意味著沒有兩個元素可以共享同一個id。毫無疑問這是從文檔樹中獲取單個指定元素最快的方法。

注:如果給定的ID匹配某個元素的name特性,IE6.0還會返回這個元素。這是一個bug,也是必須非常小心的一個問題。

5.創(chuàng)建新節(jié)點

最常用到的幾個方法是

createDocumentFragment()--創(chuàng)建文檔碎片節(jié)點

createElement(tagname)--創(chuàng)建標簽名為tagname的元素

createTextNode(text)--創(chuàng)建包含文本text的文本節(jié)點

createElement()、createTextNode()、appendChild()

 
 
 
  1.  
  2.      
  3.         createElement() Example 
  4.          
  5.      
  6.      
  7.      
  8.  

removeChild()、replaceChild()、insertBefore()刪除節(jié)點

 
 
 
  1.  
  2.      
  3.         removeChild() Example 
  4.          
  5.      
  6.      
  7.         

    Hello World!

     
  8.      
  9.  

替換

 
 
 
  1.  
  2.      
  3.         replaceChild() Example 
  4.          
  5.      
  6.      
  7.         

    Hello World!

     
  8.      
  9.  

新消息添加到舊消息之前

 
 
 
  1.  
  2.      
  3.         insertBefore() Example 
  4.          
  5.      
  6.      
  7.         

    Hello World!

     
  8.      
  9.  

createDocumentFragment()

一旦把節(jié)點添加到document.body(或者它的后代節(jié)點)中,頁面就會更新并反映出這個變化。對于少量的更新,這是很好的,然而,當要向document添加大量數(shù)據時,如果逐個添加這些變動,這個過程有可能會十分緩慢。為解決這個問題,可以創(chuàng)建一個文檔碎片,把所有的新節(jié)點附加其上,然后把文檔碎片的內容一次性添加到document中,假如想創(chuàng)建十個新段落。

 
 
 
  1.  
  2.      
  3.         insertBefore() Example 
  4.          
  5.      
  6.      
  7.  
  8.      
  9.  

6.讓特性像屬性一樣

大部分情況下,HTML DOM元素中包含的所有特性都是可作為屬性。

假設有如下圖像元素:

 
 
 
  1.  

如果要使用核心的DOM來獲取和設置src和border特性,那么要用getAttribute()和setAttribute()方法:

 
 
 
  1. alert(oImg.getAttribute("src"));  
  2. alert(oImg.getAttribute("border"));  
  3. oImg.setAttribute("src","mypicture2.jpg");  
  4. oImg.setAttribute("border",1); 

然而,使用HTML DOM,可以使用同樣名稱的屬性來獲取和設置這些值:

 
 
 
  1. alert(oImg.src);  
  2. alert(oImg.border);  
  3. oImg.src="mypicture2.jpg";  
  4. oImg.border ="1"; 

唯一的特性名和屬性名不一樣的特例是class屬性,它是用來指定應用于某個元素的一個CSS類,因為class在ECMAScript中是一個保留字,在javascript中,它不能被作為變量名、屬性名或都函數(shù)名。于是,相應的屬性名就變成了className;

注:IE在setAttribute()上有很大的問題,***盡可能使用屬性。

7.table方法

為了協(xié)助建立表格,HTML DOM給

,和等元素添加了一些特性和方法。
元素添加了以下內容:

元素的集合元素(如果存在)元素(如果存在)元素并將其放入表格元素并將其放入表格元素元素
特性/方法說明
caption指向
元素并將其放入表格
tBodies
tFoot指向
tHead指向
rows表格中所有行的集合
createTHead()創(chuàng)建
createTFood()創(chuàng)建
createCpation()創(chuàng)建
元素并將其放入表格
deleteTHead()刪除
deleteTFood()刪除
deleteCaption()刪除
元素
deleteRow(position)刪除指定位置上的行
insertRow(position)在rows集合中的指定位置上插入一個新行

元素添加了以下內容

中所有行的集合
特性/方法說明
rows
deleteRow(position)刪除指定位置上的行
insertRow(position)在rows集合中的指定位置上插入一個新行

元素添加了以下內容

元素中所有的單元格的集合
特性/方法說明
cells
deleteCell(postion)刪除給定位置上的單元格
insertCell(postion)在cells集合的給點位置上插入一個新的單元格

8.遍歷DOM

NodeIterator,TreeWalker

DOM Level2的功能,這些功能只有在Mozilla和Konqueror/Safari中才有,這里就不介紹了。


新聞標題:淺談DOM文檔對象模型基礎
分享地址:http://m.5511xx.com/article/ccoepsi.html