什么是DOM
DOM是Document Object Model的缩写,即文档对象模型,是基于文档编程的一套API接口,1998年,W3C发布了一级的DOM规范,这个规范允许访问和操作HTML页面中的每个单独远古三,如网页的表格、图片、文本、表单元素等。
DOM 定义了访问文档的标准:
“W3C 文档对象模型(DOM)是中立于平台和语言的接口,它允许程序和脚本动态地访问、更新文档的内容、结构和样式。”
W3C DOM 标准被分为 3 个不同的部分:
- Core DOM - 所有文档类型的标准模型
- XML DOM - XML 文档的标准模型
- HTML DOM - HTML 文档的标准模型
小结:HTML DOM 是关于如何获取、更改、添加或删除 HTML 元素的标准。
节点与节点之间的关系
DOM是以树状结构组织的HTML文档,根据DOM概念,我们可以知道,HTML文档中每个标签或元素都是一个节点,在DOM中是这样规定的:
- 整个文档是一个文档节点
- 每个HTML标签是一个元素节点
- 包含在HTML元素中的文本是文本节点
- 每个HTML属性是一个属性节点
- 注释属于注释节点
HTML DOM 模型被结构化为对象树:
使用父(parent)、子(child)和同胞(sibling)等术语来描述这些节点的层次关系,父节点拥有子节点,同级的子节点被称为同胞或兄弟节点,关系如下:
-
在节点树中,顶部节点被称为根(root),如
<html>
节点 -
每个节点都有父节点,除了根(它没有父节点),如
<head>
和<body>
的父节点都是<html>
-
一个节点可以拥有任意数量的子节点,如
<body>
节点的子节点有<a>
,<h1>
。 -
同胞节点是拥有相同父节点的节点,如
<a>
和<h1>
就是兄弟节点,它们的父节点均为<body>
节点
常用节点分为四类
- 文档节点(document):整个HTML文档 document对象作为window对象的属性存在 的,我们不用获取可以直接使用。
- 元素节点(Element):HTML文档中的HTML标签
- 属性节点(Attr):元素的属性 表示的是标签中的一个一个的属 性,这里要注意的是属性节点并非是元素节点的子节点,而是元素节点的一部分。
- 文本节点(Text):HTML标签中的文本内容
访问节点
-
通过 id 找到 HTML 元素 document.getElementById(“dv”)
它是document对象特有的函数。该方法返回一个有着给定id属性值的元素节点对应的对象。 -
通过 name属性找到 HTML 元素document.getElementsByName(“btn”)
方法可返回带有指定名称的对象的集合 -
通过标签名找到 HTML 元素 getElementsByTagName(“input”);
可返回一个对象数组,每个对象分别对应着文档里有着给定标签的一个元素。
该方法也只有一个参数,该参数是标签的名字。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
function changeContent(){
var spn = document.getElementById("sp");
spn.innerHTML = "SS";
}
function getHobbies(){
var hb = document.getElementsByName("hobby");
for(var i = 0; i<hb.length; i++){
if(hb[i].checked){
alert(hb[i].value);
}
}
}
function getValues(){
var inputs = document.getElementsByTagName("input");
for(var i = 0;i<inputs.length;i++){
document.getElementById("dv").innerHTML += inputs[i].value;
}
}
</script>
</head>
<body>
<span id="sp">国王</span>
<input type="button" value="点击换内容" onclick="changeContent()" />
<input type="checkbox" name="hobby" value="paly" />玩游戏
<input type="checkbox" name="hobby" value="read" />读小说
<input type="checkbox" name="hobby" value="swim" />去游泳
<input type="button" name="btn" value="点击 " onclick="getHobbies()"/>
<input type="button" name="btn" value="通过input标签获取值" onclick="getValues()"/>
<div id="dv"></div>
</body>
</html>
节点信息
1)nodeName(节点名称)
元素节点 nodeName 是标签名
属性节点 nodeName 是属性名称
文本节点 nodeName 永远都是#text
文档节点 nodeName 永远都是#document
2)nodeValue(节点值)
对于文本节点 nodeValue 显示文本内容
对于属性节点 nodeValue 显示属性值
nodeValue 对于文档节点和元素节点不可用的
3)nodeType(节点类型)
nodeType属性可返回节点的类型,是一个只读属性,如返回的是元素节点、文本节点、注释节点等。
元素 1
属性 2
文本 3
注释 8
文档 9
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>节点信息</title>
</head>
<body>
<ul id="nodeList"><li>nodeName</li><li>nodeValue</li><li>nodeType</li></ul><p></p>
<script>
var nodes=document.getElementById("nodeList");
var type1=nodes.firstChild.nodeType;
var type2=nodes.firstChild.firstChild.nodeType;
var name1=nodes.firstChild.firstChild.nodeName;
var str=nodes.firstChild.firstChild.nodeValue;
var con="type1:"+type1+"<br/>type2:"+type2+"<br/>name1:"+name1+"<br/>str:"+str;
document.getElementById("nodeList").nextSibling.innerHTML=con;
</script>
</body>
</html>
4)属性(查找节点)
- firstChild 第一个儿子
- lastChild 最后一个儿子
- childNodes 所有子节点(集合)
- children 所有子元素的集合(不显示其他节点)
- parentNode 父节点
- nextSibling 下一个兄弟节点
- previousSibling 上一个兄弟节点
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>访问节点</title>
<style>
body,ul,li,div,section,header{margin: 0;padding: 0;}
ul,li{list-style: none;}
body{
font-family: "微软雅黑";
font-size: 12px;
line-height: 28px;
}
#news{
border: 1px solid #cccccc;
width: 280px;
overflow: hidden;
margin: 5px auto 0 auto;
}
#news header{
border-bottom: 1px solid #cccccc;
font-size: 16px;
line-height: 40px;
padding-left:15px;
color: #666666;
font-weight: bold;
}
#news header a{text-decoration: none; color: #666666; float: right; padding-right: 10px; font-size: 12px;}
#news ul li{padding-left: 10px;}
#news ul li a{color: #686868; text-decoration: none; display: inline-block;}
#news ul li a:hover{color: #b02f4a;}
</style>
</head>
<body>
<section id="news">
<header>京东快报<a href="#">更多 ></a></header>
<ul>
<li><a href="#">志玲姐姐:墨镜300减30</a></li>
<li><a href="#">京东无锡馆正式启动</a></li>
<li><a href="#">99元抢平板!品牌配件199-100</a></li>
<li><a href="#">节能领跑京东先行</a></li>
<li><a href="#">高洁丝实力撩货,领券五折</a></li>
</ul>
</section>
<script>
var obj=document.getElementById("news");
var str=obj.lastChild.firstChild.nextSibling.nextSibling.innerHTML;
var str=obj.lastChild.lastChild.previousSibling.previousSibling.innerHTML;
var str=obj.lastElementChild.firstElementChild.innerHTML||obj.lastChild.firstChild.innerHTML;
// var str =obj.children[1].children[2].innerHTML;
alert(str);
</script>
</body>
</html>
5)方法操作(添加 修改 删除)
1、创建节点
document.createElement(‘要创建的标签名’)
2、添加节点
添加到最后appendChild
parent.appendChild(son);
添加到某个位置insertBefore
parent.insertBefore(son,position)
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>选择你喜欢的书</title>
<style>
*{font-size: 12px; font-family: "Arial", "微软雅黑"; line-height: 25px;}
div{padding: 5px; text-align: center;
}
div span{display: block;}
</style>
</head>
<body>
<p>选择你喜欢的书:<input type="radio" name="book" onclick="book()">我和狗狗一起活下来 <input type="radio" name="book" onclick="book()">灰霾来了怎么办</p>
<div></div>
<script>
function book(){
var ele=document.getElementsByName("book");
var bName=document.getElementsByTagName("div")[0];
if(ele[0].checked){
var img=document.createElement("img");
img.setAttribute("src","images/dog.jpg");
img.setAttribute("alt","我和狗狗一起活下来");
bName.appendChild(img);
}
else if(ele[1].checked){
var img=document.createElement("img");
img.setAttribute("src","images/mai.jpg");
img.setAttribute("alt","灰霾来了怎么办");
img.setAttribute("onclick","copyNode()")
bName.appendChild(img);
}
}
function copyNode(){
var bName=document.getElementsByTagName("div")[0];
var copy=bName.lastChild.cloneNode(false);
bName.insertBefore(copy,bName.firstChild);
}
</script>
</body>
</html>
3、克隆
new = old.cloneNode();
如果我们传递一个参数参数值为true 表示携带子元素一起克隆
4、设置、获取值
getAttribute(“属性名”):用来获取属性的值
setAttribute(“属性名”,“属性值”):用来设置属性的值
5、删除子节点
parent.removeChild(son)
6、删除自己节点
son.parentNode.removeChild(son)
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>删除和替换节点</title>
<style>
*{padding: 0; margin: 0; font-size: 12px;}
ul,li{list-style: none;}
li{float: left; text-align: center; width: 140px;}
</style>
</head>
<body>
<ul>
<li>
<img src="images/f01.jpg" id="first">
<p><input type="button" value="删除我吧" onclick="del()"></p>
</li>
<li>
<img src="images/f02.jpg" id="second">
<p><input type="button" value="换换我吧" onclick="rep()"></p>
</li>
</ul>
<script>
function del(){
var delNode=document.getElementById("first");
delNode.parentNode.removeChild(delNode);
}
function rep(){
var oldNode=document.getElementById("second");
var newNode=document.createElement("img");
newNode.setAttribute("src","images/f03.jpg");
oldNode.parentNode.replaceChild(newNode,oldNode);
}
</script>
</body>
</html>