DOM定義
DOM(文檔對象模型,Document Object Model)是W3C組織開發的一套便於操作XML和HTML的JavaScript方法,其將XML和HTML抽象成文檔對象(Document),並將其中所有的標籤和內容都抽象成對象(節點),利用面向對象的思對XML和HTML的操作。其中 Document 對象是DOM的頂層節點。
XML(擴展標記語言,Extensible Markup Language),主要用於信息的存儲和傳送,HTML也是一種XML。
DOM組成
DOM核心:針對任何結構化文檔的標準模型。
XML DOM:針對 XML 文檔的標準模型。
HTML DOM:針對 HTML 文檔的標準模型。
XML DOM和HTML DOM的關係
XML DOM 是:用於 XML 的標準對象模型,用於 XML 的標準編程接口,中立於平臺和語言的 W3C 標準。
XML DOM 定義了所有 XML 元素的對象和屬性,以及訪問它們的方法(接口)。
換言之:XML DOM 是用於獲取、更改、添加或刪除 XML 元素的標準。
HTML DOM 是:HTML 的標準對象模型,HTML 的標準編程接口的 W3C 標準。
HTML DOM 定義了所有 HTML 元素的對象和屬性,以及訪問它們的方法。
換言之,HTML DOM 是關於如何獲取、修改、添加或刪除 HTML 元素的標準。
其中,HTML DOM 是 XML DOM 的擴展,換言之,XML DOM 的方法均可以使用在HTML中,而反過來,HTML DOM 的方法不可以使用在XML中。
DOM樹與節點
1. DOM樹
對於HTML文檔,DOM將所有的標籤全部抽象成節點,並且節點間有嚴格的等級關係,以此形成一個DOM樹。
如:
<!DOCTYPE html><html><head> <meta charset="utf-8" /> <title>Demo</title></head><body> <h1>DOM Lesson one</h1> <p align="center">Hello world!</p></body></html>
其對應的DOM樹:
其中,每一行都是兄弟節點,綠色線條代表父子關係,而紅色線條也是父子關係的一種,但是無法通過父親查找孩子而找到。
2. 節點
2.1 節點分類
由DOM樹可見,節點分爲三種:元素節點(標籤),屬性節點和文本節點。
2.2 節點屬性
nodeName,nodeValue,nodeType
具體如下:
節點類型/元素 | nodeName | nodeValue | nodeType |
元素節點 | 標籤名 | 不可用 | 1 |
屬性節點 | 屬性名 | 屬性的值 | 2 |
文本節點 | #text | 文本內容 | 3 |
document | #document | 不可用 | 9 |
2.3 節點關係
2.4 節點操作
操作目標節點的對象 | 添加 | 刪除 | 修改 | 查詢 |
當前節點 | document.createElement(name) node.setAttribute(name,value) | 不可用 | node.replaceNode(newNode) | document.getElementById(id) document.getElementsByName(name) document.getElementsByTagName(tagName) |
父節點 | node.appendChild(newNode) | node.removeChild(cNode) | node.replaceChild(newNode,oldNode) | 參見節點關係 |
綠色部分爲HTML DOM方法。
DOM的使用
1. 基本屬性與方法
nodeName:返回節點的名稱,依據其類型。
nodeType:返回節點的類型。
attributes:返回元素的屬性。
childNodes:返回元素的子節點的 NodeList。
firstChild:返回元素的首個子節點。
lastChild:返回元素的最後一個子節點。
parentNode:返回元素的父節點。
nextSibling:返回元素之後緊跟的節點。
previousSibling:返回元素之前緊隨的節點。
textContent:設置或返回元素及其後代的文本內容。
innerTest:設置或返回元素後代的文本內容。
innerHTML:設置或返回元素後代的內容。[HTML DOM]
hasAttribute(name):返回元素是否擁有指定的屬性。
hasAttributes():返回元素是否擁有屬性。
hasChildNodes():返回元素是否擁有子節點。
createAttribute(node):創建屬性節點。
createElement(node):創建元素節點。
createTextNode(node):創建文本節點。
appendChild(node):向節點的子節點列表末尾添加新的子節點。
cloneNode(include_all:true,false):克隆節點。
removeAttribute(name):刪除指定的屬性。
removeChild(node):刪除子節點。
replaceNode(newNode):替換節點。[僅IE]
replaceChild(newNode, oldNode):替換子節點。
getElementById(id):找到具有指定id的子孫元素。[HTML DOM]
getElementsByName(name):找到具有指定name的子孫元素。[HTML DOM]
getElementsByTagName(name):找到具有指定標籤名的子孫元素。
getAttribute(name):返回屬性的值。
setAttribute():添加新屬性。
XML DOM屬性
node.innerText;
node.firstChild.nodeValue;
node.lastChild.nodeValue;
node.childNodes[0].nodeValue;
node.textContent;[IE8]
HTML DOM屬性
node.innerHTML;
<!DOCTYPE html><html><head> <meta charset="utf-8" /> <title>讀取指定的內容 </title> <script type="text/javascript"> function _getLi() { var bjNode = document.getElementById("bj"); var _childNodes = bjNode.childNodes; for (var i = 0; i < _childNodes.length; i++) { // 獲取所有子節點,包括暗部(不顯示在網頁中的空格和製表符等) var n = _childNodes[i]; // 如果子節點爲元素,則獲取改元素標籤中的文本 if (n.nodeType == 1) { alert(n.childNodes[0].nodeValue); } } } </script></head><body> <ul> <li id="bj" value="beijing"> 北京 <h1>海淀</h1> 奧運 </li> <li id="sh" value="shanghai"> 上海 </li> <br/> <input type="button" value="li取值" onclick="_getLi()" /> </ul></body></html>
獲取select下面option的文本內容。
HTML:
<!DOCTYPE html><html><head> <meta charset="utf-8" /> <title>Demo</title> <script type="text/javascript" src="js.js"></script></head><body> <select name="edu" id="edu"> <option value="本科1">本科</option> <option value="專科2">專科</option> <option value="高中3">高中</option> <option value="小學4">小學</option> <option value="幼兒園5">幼兒園</option> </select></body></html>
方法1:獲取select對象,獲取childNodes,注意暗部。
var _selObj = document.getElementByTagName("select")[0];var _childNodes = _selObj.childNodes;for (var i = 0; i < _childNodes.length; i++) { var n = _childNodes[i]; // n可能獲取到暗部,需要判斷排除 if (n.nodeType == 1) { alert(n.firstChild.nodeValue + " : " + n.getAttribute("value")); }}
方法2:直接獲取option對象集合
var optNodes = document.getElementsByTagName("option");for (var i = 0; i < optNodes.length; i++) { var n = optNodes[i]; alert(n.getAttribute("value"));}
獲取select對象,並通過該對象的特有方法options直接獲取option的對象集合,避免了暗部的影響。
var optNodes = document.getElementById("edu").options;for (var i = 0; i < optNodes.length; i++) { var n = optNodes[i]; alert(n.getAttribute("value"));}
HTML:
<!DOCTYPE html><html><head> <meta charset="utf-8" /> <title>替換節點內容</title> <script type="text/javascript" src="js.js"></script></head><body> <ul> <li id="tar" onclick="_changeNode()">點這裏</li> <li>湖南</li> <li>山東</li> </ul> <ul> <li id="game">打<span style="color:red">灰</span>機</li> <li>抓泥鰍</li> <li>鬥地主</li> </ul></body></html>
function _changeNode() { //1. 獲取兩個節點的對象 var tarNode = document.getElementById("tar"); var gameNode = document.getElementById("game"); //2 替換節點 //注意:當替換節點時,新節點將出現在被替換的位置,原位置將消失。 // 通過當前節點替換 tarNode.replaceNode(gameNode); // [僅IE] // 通過父節點替換 //tarNode.parentNode.replaceChild(gameNode, tarNode);}
function _changeNode() { //1. 獲取兩個節點的對象 var tarNode = document.getElementById("tar"); //2. 克隆節點 // cloneNode(true/false),true:包括子節點。false:不包括子節點(文本節點)。 // 注意:當使用clone節點的時候,無論參數是true還是false都會把屬性一起克隆,所以可能出現的是相同id的節點,所以不推薦使用克隆方法。 var gameNode = document.getElementById("game").cloneNode(true); tarNode.replaceNode(gameNode); // [僅IE] alert("gameNode clone id is " + gameNode.getAttribute("id")); var oldgameNode = document.getElementsByTagName("li")[3]; alert("oldgaemNode id is " + oldgameNode.getAttribute("id"));}
效果:
HTML:
<!DOCTYPE html><html><head> <meta charset="utf-8" /> <title>添加節點</title> <script type="text/javascript" src="js.js"></script></head><body> <input type="button" value="添加選項" onclick="_addOptions()" /> <select> <option>博士</option> <option>碩士</option> <option>本科</option> </select></body></html>
function _addOptions() { var selObj = document.getElementsByTagName("select")[0]; var optNode = document.createElement("option"); // 創建元素節點 var txtNode = document.createTextNode("小學"); // 創建文本節點 optNode.appendChild(txtNode); // 給optNode添加子節點(文本節點) selObj.appendChild(optNode); // 給selObj添加子節點(option節點)}
function _addOptions() { var selObj = document.getElementsByTagName("select")[0]; selObj.innerHTML += "<option>小學</option>";}
function _addOptions() { var selObj = document.getElementsByTagName("select")[0]; // option(text, value, defaultSelected, selected) // text:顯示的文本 // value:屬性value的值 // defaultSelected:初始化後選中的狀態(true/false) // selected:當前選中的狀態(true/false) var optNode = new Option("小學", "小學", true, true); // 創建了一個Option對象 selObj.add(optNode);}
效果:
7. 表格動態增刪
HTML:
<!DOCTYPE html> <html> <head> <metacharset="utf-8"/> <title>添加節點</title> <scripttype="text/javascript"src="js.js"></script> </head> <body> <tablealign="center"cellpadding="10"cellspacing="3"> <tr> <td>姓名: <inputtype="text"id="username"/> </td> <td>Email: <inputtype="text"id="email"/> </td> <td>年齡: <inputtype="text"id="age"/> </td> </tr> <tr> <tdcolspan="3"align="center"> <inputtype="button"value="添加"onclick="_addTR()"/> </td> </tr> </table> <br/> <br/> <br/> <hr/> <tableid="tabInfo"align="center"width="500"border="1"> <tr> <td>姓名</td> <td>Email</td> <td>年齡</td> <td>操作</td> </tr> </table> </body> </html>
7.1 使用XML DOM方法
function _addTR(){ // 獲取輸入框信息 var tablenode = document.getElementById("tabInfo"); var uname = document.getElementById("username").value; var email = document.getElementById("email").value; var age = document.getElementById("age").value; // 創建一行 var trNode = document.createElement("tr"); // 創建出一個單元格 var unameTd = document.createElement("td"); var emailTd = document.createElement("td"); var ageTd = document.createElement("td"); var dropTd = document.createElement("td"); // 創建文本節點和刪除節點 var unameTxt = document.createTextNode(uname); var emailTxt = document.createTextNode(email); var ageTxt = document.createTextNode(age); var dropButton = document.createElement("input"); dropButton.setAttribute("type","button"); dropButton.setAttribute("value","刪除"); dropButton.setAttribute("onclick","_del(this);"); // 逐級添加 unameTd.appendChild(unameTxt); emailTd.appendChild(emailTxt); ageTd.appendChild(ageTxt); dropTd.appendChild(dropButton); trNode.appendChild(unameTd); trNode.appendChild(emailTd); trNode.appendChild(ageTd); trNode.appendChild(dropTd); tablenode.appendChild(trNode); } function _del(obj){ // 找到tr節點 var trNode = obj.parentNode.parentNode; // 使用tr節點的父節點,刪除tr節點 trNode.parentNode.removeChild(trNode); }
7.2 使用HTML DOM方法
function _addTR() { var tablenode = document.getElementById("tabInfo"); var uname = document.getElementById("username").value; var email = document.getElementById("email").value; var age = document.getElementById("age").value; // 創建一行 var trNode = tablenode.insertRow(); // 創建一個單元格 var unameTd = trNode.insertCell(); var emailTd = trNode.insertCell(); var ageTd = trNode.insertCell(); var dropTd = trNode.insertCell(); // 爲單元格添加內容 unameTd.innerHTML = uname; emailTd.innerHTML = email; ageTd.innerHTML = age; dropTd.innerHTML = "<input type='button' onclick='_del(this)' value='刪除' />";}function _del(obj) { // 拿到table節點 var tablenode = document.getElementById("tabInfo"); // 找到tr節點 var trNode = obj.parentNode.parentNode; // 使用HTML DOM的deleteRow方法 tablenode.deleteRow(trNode.rowIndex);}
當然,也可以全部用innerHTML來實現[IE10+]:
function _addTR(){ var tablenode = document.getElementById("tabInfo"); var uname = document.getElementById("username").value; var email = document.getElementById("email").value; var age = document.getElementById("age").value; // 使用innerHTML添加全部內容 tablenode.innerHTML +="<tr><td>"+ uname +"</td><td>"+ email +"</td><td>"+ age +"</td><td><input type='button' onclick='_del(this)' value='刪除' /></td></tr>"; }
效果:
8. 全選/全不選/反選
HTML:
<!DOCTYPE html> <html> <head> <metacharset="utf-8"/> <title>添加節點</title> <scripttype="text/javascript"src="js.js"></script> </head> <body> <h1>請選擇你的愛好:</h1> <labelfor="all">全選/全不選</label> <inputid="all"type="checkbox"name="hobbys"onclick="_chkSelectAll(this.checked)"/> <br/> <inputid="foot"type="checkbox"name="hobby"value="football"/> <labelfor="foot">足球</label> <inputid="bask"type="checkbox"name="hobby"value="basketball"/> <labelfor="bask">籃球</label> <inputid="swim"type="checkbox"name="hobby"value="swim"/> <labelfor="swim">游泳</label> <inputid="sing"type="checkbox"name="hobby"value="singing"/> <labelfor="sing">唱歌</label> <br/> <inputtype="button"value="全選"onclick="_chkSelectAll(true)"/> <inputtype="button"value="全不選"onclick="_chkSelectAll(false)"/> <inputtype="button"value="反選"onclick="_reverseChecked()"/> </body> </html>
JavaScript[HTML DOM方法]:
function _chkSelectAll(chk){ //拿到所有名字爲hobby的checkbox對象 var hobbyarr = document.getElementsByName("hobby"); for(var i =0; i < hobbyarr.length; i++){ hobbyarr[i].checked = chk; } } function _reverseChecked(){ //拿到所有名字爲hobby的checkbox對象 var hobbyarr = document.getElementsByName("hobby"); for(var i =0; i < hobbyarr.length; i++){ hobbyarr[i].checked =!hobbyarr[i].checked; } }
效果:
9. 下拉列表左右移動
HTML:
<!DOCTYPE html> <html> <head> <metacharset="utf-8"/> <title>替換節點內容</title> <scripttype="text/javascript"src="js.js"></script> </head> <body> <tablealign="center"> <tr> <td> <selectsize="10"id="left"> <option>選項1</option> <option>選項2</option> <option>選項3</option> <option>選項4</option> <option>選項5</option> <option>選項6</option> <option>選項7</option> <option>選項8</option> </select> </td> <td> <inputtype="button"value="->" onclick="_removeLeft()" /> <br/> <inputtype="button"value="=>" onclick="_removeLeftAll()" /> <br/> </td> <td> <selectsize="10"id="right"> <option>選項9</option> </select> </td> </tr> </table> </body> </html>
9.1 使用XML DOM的childNodes屬性
function _removeLeft(){ var leftSel = document.getElementById("left"); var rightSel = document.getElementById("right"); var optIdx = leftSel.selectedIndex; // 使用XML DOM的childNodes屬性需注意暗部的避免。 // 這裏使用變量count記錄真正的選項索引,i爲包括暗部的索引。 var count =0; var i =0; while(i < leftSel.childNodes.length){ if(leftSel.childNodes[i].nodeType ==1){ if(count == optIdx){ var optNode = leftSel.childNodes[i]; break; } count++; } i++; } rightSel.appendChild(optNode); } function _removeLeftAll(){ // 拿到左右兩側下拉列表對象 var leftSel = document.getElementById("left"); var rightSel = document.getElementById("right"); // 遍歷左側下拉列表項 // 這裏使用XML DOM的childNodes屬性,會將所有的暗部一併添加到右側 while(leftSel.childNodes.length >0){ rightSel.appendChild(leftSel.childNodes[0]); } }
9.2 使用HTML DOM的options屬性和add方法
function _removeLeft(){ var leftSel = document.getElementById("left"); var rightSel = document.getElementById("right"); // 獲取選中的索引號 var optIdx = leftSel.selectedIndex; var optNode = leftSel.options[optIdx]; // 將對應索引號的項添加到右邊 rightSel.add(optNode); } function _removeLeftAll(){ var leftSel = document.getElementById("left"); var rightSel = document.getElementById("right"); // 只要左邊列表不爲空,就將列表的第一項加到右邊 while(leftSel.options.length >0){ rightSel.add(leftSel.options[0]); } }
效果:
HTML DOM之CSS(style)屬性的使用
1. 概述
CSS樣式對象均在HTML DOM節點的style屬性中設置,具體可以查看相關文檔。
2. 案例
顏色切換
<!DOCTYPE html> <html> <head> <metacharset="utf-8"/> <title>顏色切換</title> </head> <body> <spanid="a"style="background-color:blue">haha</span> <spanid="b"style="background-color:red">hehe</span> <scripttype="text/javascript"> var b =false; function _func(){ b =!b; if(b){ document.getElementById("a").style.backgroundColor ="red"; document.getElementById("b").style.backgroundColor ="blue"; }else{ document.getElementById("b").style.backgroundColor ="red"; document.getElementById("a").style.backgroundColor ="blue"; } } var inter = setInterval(_func,1000); </script> </body> </html>
效果
漂浮廣告
<!DOCTYPE html> <html> <head> <metacharset="utf-8"/> <title>漂浮廣告</title> <scripttype="text/javascript"> function _rand(){ var randx =Math.random()* screen.width; var randy =Math.random()* screen.height -50; var tar = document.getElementById('img').style; tar.top = randy +"px"; tar.left = randx +"px"; } setInterval(_rand,500); </script> </head> <body> <span>漂浮廣告演示</span> <imgsrc="piaofu.jpg"id="img"width="50px"height="50px"style="position:absolute"/> </body> </html>
轉載至:http://blog.csdn.net/jacobvv/article/details/42845517