
DOM定义
DOM(文档对象模型,Document Object Model)是W3C组织开发的一套便于操作XML和HTML的JavaScript方法,其将XML和HTML抽象成文档对象(Document),并将其中所有的标签和内容都抽象成对象(节点),利用面向对象的思对XML和HTML的操作。其中 Document 对象是DOM的顶层节点。
XML(扩展标记语言,Extensible Markup Language),主要用于信息的存储和传送,HTML也是一种XML。
DOM组成
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:返回元素的属性。
-
textContent:设置或返回元素及其后代的文本内容。
-
innerTest:设置或返回元素后代的文本内容。
-
innerHTML:设置或返回元素后代的内容。[HTML DOM]
-
hasAttribute(name):返回元素是否拥有指定的属性。
-
hasAttributes():返回元素是否拥有属性。
-
hasChildNodes():返回元素是否拥有子节点。
-
createAttribute(node):创建属性节点。
-
createElement(node):创建元素节点。
-
createTextNode(node):创建文本节点。
-
getElementById(id):找到具有指定id的子孙元素。[HTML DOM]
-
getElementsByName(name):找到具有指定name的子孙元素。[HTML DOM]
-
getElementsByTagName(name):找到具有指定标签名的子孙元素。
XML DOM属性
-
node.innerText;
-
node.firstChild.nodeValue;
-
node.lastChild.nodeValue;
-
node.childNodes[0].nodeValue;
-
node.textContent;[IE8]
HTML DOM属性
<!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