JavaScript——DOM知识

简介:
+关注继续查看

2014093009570421.gif

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树:

spacer.gif

其中,每一行都是兄弟节点,绿色线条代表父子关系,而红色线条也是父子关系的一种,但是无法通过父亲查找孩子而找到。

2. 节点

2.1 节点分类

由DOM树可见,节点分为三种:元素节点(标签),属性节点和文本节点。

2.2 节点属性

nodeName,nodeValue,nodeType

具体如下:

节点类型/元素 nodeName nodeValue nodeType
元素节点 标签名 不可用 1
属性节点 属性名 属性的值 2
文本节点 #text 文本内容 3
document #document 不可用 9

2.3 节点关系

spacer.gif

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"));}

效果:

spacer.gif

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);}

效果:

spacer.gif

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>";
}

效果:

spacer.gif

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;
}
}

效果:

spacer.gif

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]);
}
}

效果:

spacer.gif

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>

效果

spacer.gif

漂浮广告

<!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

相关文章
|
6天前
|
存储 JSON JavaScript
|
9天前
|
XML 缓存 JavaScript
JavaScript操作DOM常用的API
1 什么是DOM 文档对象模型 (DOM) 是HTML和XML文档的编程接口。它提供了对文档的结构化的表述,并定义了一种方式可以使从程序中对该结构进行访问,从而改变文档的结构,样式和内容。文档对象模型 (DOM) 是对HTML文件的另一种展示,通俗地说,一个HTML 文件,我们可以用编辑器以代码的形式展示它,也可以用浏览器以页面的形式展示它,同一份文件通过不同的展示方式,就有了不一样的表现形式。而DOM 将文档解析为一个由节点和对象(包含属性和方法的对象)组成的结构集合。简言之,它会将web页面和脚本或程序语言连接起来,我们可以使用脚本或者程序语言通过DOM 来改变或者控制web页面。
45 0
|
10天前
|
JavaScript 前端开发
JAVAScript Dom总结
JAVAScript Dom总结
|
18天前
|
XML JavaScript 前端开发
JavaScript函数和BOM及DOM编程(详细总结-无尿点)(二)
JavaScript函数和BOM及DOM编程(详细总结-无尿点)(二)
14 0
|
18天前
|
存储 JavaScript 前端开发
JavaScript函数和BOM及DOM编程(详细总结-无尿点)(一)
JavaScript函数和BOM及DOM编程(详细总结-无尿点)(一)
16 0
|
20天前
|
JavaScript 前端开发
JavaScript 进阶5:WebAPI:DOM- 网页特效篇
JavaScript 进阶5:WebAPI:DOM- 网页特效篇
18 0
|
26天前
|
JavaScript 前端开发
JS中DOM编程获取与操作元素
JS中DOM编程获取与操作元素
18 0
|
26天前
|
XML 编解码 JavaScript
JS中的BOM和DOM的介绍与使用
JS中的BOM和DOM的介绍与使用
23 0
|
29天前
|
XML JavaScript 前端开发
【JavaWeb】知识总结Ⅳ(JavaScript中的DOM)
JavaScript 能改变页面中的所有 HTML 元素 JavaScript 能改变页面中的所有 HTML 属性 JavaScript 能改变页面中的所有 CSS 样式 JavaScript 能删除已有的 HTML 元素和属性 JavaScript 能添加新的 HTML 元素和属性 JavaScript 能对页面中所有已有的 HTML 事件作出反应 JavaScript 能在页面中创建新的 HTML 事件
|
2月前
|
JavaScript 前端开发
JavaScript基础(Dom操作)(三)
JavaScript基础(Dom操作)
热门文章
最新文章
相关产品
云迁移中心
推荐文章
更多