DOM是什么
DOM 的全称为 Document Object Model,译为文档对象模型。DOM 规定了浏览器应该如何创建 HTML 页面,以及 JavaScript 如何访问和修改浏览器窗口中的 Web 页面的内容。
1. W3C 对 DOM 的定义
DOM 是一个独立于任何语言和平台的接口,允许任何语言或脚本动态地访问和更新 HTML 文档的内容、结构和样式。该 HTML 页面可以进一步处理,并且该处理的结果可以被合并到所呈现的 HTML 页面中。
2. 详解 DOM
DOM 中每一个字母的含义如下:
- D 表示 Document,即将一个 HTML 页面表示为一个文档。
-
O 表示 Object,即将一个 HTML 页面中的每一个部分都转换成一个对象。
DOM 实际上是以面向对象方式来描述一个 HTML 页面。其中 Document 对象主要处理 HTML 页面内容。
-
M 表示 Model,即通过模型来表示对象之间的关系,方便获取对象。
DOM 将一个 HTML 页面表示为一个树形结构的模型。(关于树形结构会在后面学习)
3. DOM 的组成
- DOM Core: 指定类属类型,将带有标记的文档看成树状结构并据此对文档进行相关操作。
- DOM HTML: 提供用于操作 HTML 文档以及类似于 JavaScript 对象模型语法的功能部件,在核心 DOM 的基础上支持对所有 HTML 元素对象进行操作。
- DOM CSS: 提供脚本编程实现 CSS 的接口。
- DOM XML
4. DOM 树结构
当浏览器加载 HTML 页面时,会创建这个 HTML 页面的模型。这个模型就叫做 DOM 树结构,会被保存到浏览器的内存中。
4.1节点
节点(node)是个网络术语,表示网络中的连接点。一个网络是由一些节点构成的集合。在 DOM 树结构中主要由以下 4 种节点组成:
- 文档节点: 表示整个 HTML 页面(相当于 document 对象)。当需要访问任何标签、属性或文本时,都可以通过文档节点进行导航。
- 元素节点: 表示 HTML 页面中的标签(即 HTML 页面的结构)。当访问 DOM 树时,需要从查找元素节点(标签)开始。
- 文本节点: 表示 HTML 页面中的标签所包含的文本内容。
- 属性节点: 表示 HTML 页面中的开始标签包含的属性。
根据节点的分类,上面的 DOM 树结构就可以更详细的表示为如下示例:
4.2判断节点类型
当通过 DOM 节点树获取 HTML 页面的节点时,我们如何可以判断出当前节点是哪种类型呢?我们可以通过如下 3 个属性进行判断:
nodeName | nodeType | nodeValue | |
---|---|---|---|
文档节点 | #document | 9 | null |
元素节点 | 标签名 | 1 | null |
属性节点 | 属性名 | 2 | 属性值 |
文本节点 | #text | 3 | 文本内容 |
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>判断节点类型</title>
<link rel="stylesheet" href="css/style.css" />
<style>
body {
padding-top: 50px;
padding-left: 50px;
}
</style>
</head>
<body>
<div id="container" class="container">
<div class="col-md-6">
<h3>判断文档节点</h3>
<button id="dname" class="btn btn-primary">nodeName</button>
<button id="dtype" class="btn btn-primary">nodeType</button>
<button id="dvalue" class="btn btn-primary">nodeValue</button>
<h3>判断元素节点</h3>
<button id="ename" class="btn btn-primary">nodeName</button>
<button id="etype" class="btn btn-primary">nodeType</button>
<button id="evalue" class="btn btn-primary">nodeValue</button>
<h3>判断属性节点</h3>
<button id="aname" class="btn btn-primary">nodeName</button>
<button id="atype" class="btn btn-primary">nodeType</button>
<button id="avalue" class="btn btn-primary">nodeValue</button>
<h3>判断文本节点</h3>
<button id="tname" class="btn btn-primary">nodeName</button>
<button id="ttype" class="btn btn-primary">nodeType</button>
<button id="tvalue" class="btn btn-primary">nodeValue</button>
</div>
<div id="show" class="col-md-6" style="padding-top: 50px;"></div>
</div>
<script>
var show = document.getElementById('show');
var content = '';
var dname = document.getElementById('dname');
dname.onclick = function(){
content += '<h5>文档节点的nodeName: ' + document.nodeName + '</h5>';
show.innerHTML = content;
}
var dtype = document.getElementById('dtype');
dtype.onclick = function(){
content += '<h5>文档节点的nodeType: ' + document.nodeType + '</h5>';
show.innerHTML = content;
}
var dvalue = document.getElementById('dvalue');
dvalue.onclick = function(){
content += '<h5>文档节点的nodeValue: ' + document.nodeValue + '</h5><br>';
show.innerHTML = content;
}
var ename = document.getElementById('ename');
ename.onclick = function(){
content += '<h5>元素节点的nodeName: ' + ename.nodeName + '</h5>';
show.innerHTML = content;
}
var etype = document.getElementById('etype');
etype.onclick = function(){
content += '<h5>元素节点的nodeType: ' + etype.nodeType + '</h5>';
show.innerHTML = content;
}
var evalue = document.getElementById('evalue');
evalue.onclick = function(){
content += '<h5>元素节点的nodeValue: ' + evalue.nodeValue + '</h5><br>';
show.innerHTML = content;
}
var aname = document.getElementById('aname');
aname.onclick = function(){
var attrNode = aname.getAttributeNode('id');
content += '<h5>属性节点的nodeName: ' + attrNode.nodeName + '</h5>';
show.innerHTML = content;
}
var atype = document.getElementById('atype');
atype.onclick = function(){
var attrNode = atype.getAttributeNode('id');
content += '<h5>属性节点的nodeType: ' + attrNode.nodeType + '</h5>';
show.innerHTML = content;
}
var avalue = document.getElementById('avalue');
avalue.onclick = function(){
var attrNode = avalue.getAttributeNode('id');
content += '<h5>属性节点的nodeValue: ' + attrNode.nodeValue + '</h5><br>';
show.innerHTML = content;
}
var tname = document.getElementById('tname');
tname.onclick = function(){
var textNode = tname.firstChild;
content += '<h5>文本节点的nodeName: ' + textNode.nodeName + '</h5>';
show.innerHTML = content;
}
var ttype = document.getElementById('ttype');
ttype.onclick = function(){
var textNode = ttype.firstChild;
content += '<h5>文本节点的nodeType: ' + textNode.nodeType + '</h5>';
show.innerHTML = content;
}
var tvalue = document.getElementById('tvalue');
tvalue.onclick = function(){
var textNode = tvalue.firstChild;
content += '<h5>文本节点的nodeValue: ' + textNode.nodeValue + '</h5>';
show.innerHTML = content;
}
</script>
</body>
</html>
4.3节点关系
DOM 节点树的概念从上面的图示中可以一目了然。构成节点树结构的同时,节点与节点之间也存在着如下 3 种关系:
- 祖先节点与后代节点的关系
- 父节点与子节点的关系
- 兄弟节点的关系(拥有共同的父节点)