DOM(Document Object Model):文档对象模型
是一种W3C(万维网联盟)定义的访问 HTML 和 XML 文档的标准。
官方解释:W3C 文档对象模型 (DOM) 是中立于平台和语言的接口,它允许程序和脚本动态地访问和更新文档的内容、结构和样式。
W3C DOM 标准被分为 3 个不同的部分:
HTML DOM 是:
HTML DOM 定义了访问和操作 HTML 文档的标准。
HTML DOM 定义了所有 HTML 元素的对象和属性,以及访问它们的方法。
HTML DOM关于如何获取、修改、添加或删除 HTML 元素的标准。
HTML DOM是联合HTML、CSS、JavaScript静态网页三剑客使用的。
在 HTML DOM 中,所有事物都是节点。DOM 是被视为节点树的 HTML。
根据 W3C 的 HTML DOM 标准,HTML 文档中的所有内容都是节点:
HTML DOM 将 HTML 文档视作树结构。这种结构被称为节点树:
HTML DOM Tree 实例:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GsMOOxCd-1588150685057)(HTML DOM.assets/ct_htmltree.gif)]
通过 HTML DOM,树中的所有节点均可通过 JavaScript 进行访问。所有 HTML 元素(节点)均可被修改,也可以创建或删除节点。
节点树中的节点彼此拥有层级关系。
父(parent)、子(child)和同胞(sibling)等术语用于描述这些关系。父节点拥有子节点。同级的子节点被称为同胞(兄弟或姐妹)。
可通过节点的 innerHTML 属性来访问文本节点的值。
浏览器在解析 HTML 文档时,会把每个标签抽象成代码里的对象,按照层次分明的结构(HTML DOM Tree)进行组织,这就是 HTML DOM。
浏览器解析完 HTML,就要开始解析 HTML 里的 JavaScript代码。程序员可以通过 JavaScript 代码实现一些动态的网页效果。
可通过 JavaScript (以及其他编程语言)对 HTML DOM 进行访问。
DOM 里的对象,正好就是 JavaScript 语言里的对象。JavaScript 可以通过DOM方法访问 DOM 树上的节点对象。
1.Document 对象:(document:文档)
每个载入浏览器的 HTML 文档都会成为 Document 对象(一个HTML文档就是一个Document对象),Document 对象使我们可以从脚本中对 HTML 页面中的所有元素进行访问。
注:Document 对象是 Window 对象的一部分,可通过 window.document 属性对其进行访问。
2.Element 对象:(element:元素)
在 HTML DOM 中,Element 对象表示 HTML 元素(一个HTML元素就是一个Element 对象)。Element 对象可以拥有类型为元素节点、文本节点、注释节点的子节点。
NodeList 对象表示节点列表,比如 HTML 元素的子节点集合。(NodeList :节点列表)
3.Attribute 对象:(attribute:属性)
在 HTML DOM 中,Attr 对象表示 HTML 属性(一个HTML属性就是一个Attr对象)。
HTML 属性始终属于 HTML 元素。
4.Event 对象:(event:事件)
Event 对象代表事件的状态,比如事件在其中发生的元素、键盘按键的状态、鼠标的位置、鼠标按钮的状态。
事件通常与函数结合使用,函数不会在事件发生前被执行!
方法是我们可以在节点(HTML 元素)上执行的动作。
Document 对象方法:
方法 | 描述 |
---|---|
close() | 关闭用 document.open() 方法打开的输出流,并显示选定的数据。 |
getElementById() | 返回对拥有指定 id 的第一个对象的引用。 |
getElementsByName() | 返回带有指定名称的对象集合。 |
getElementsByTagName() | 返回带有指定标签名的对象集合。 |
open() | 打开一个流,以收集来自任何 document.write() 或 document.writeln() 方法的输出。 |
write() | 向文档写 HTML 表达式 或 JavaScript 代码。 |
writeln() | 等同于 write() 方法,不同的是在每个表达式之后写一个换行符。 |
常用方法
方法 | 描述 |
---|---|
getElementById() | 返回带有指定 ID 的元素。 |
getElementsByTagName() | 返回包含带有指定标签名称的所有元素的节点列表(集合/节点数组)。 |
getElementsByClassName() | 返回包含带有指定类名的所有元素的节点列表。 |
appendChild() | 把新的子节点添加到指定节点。 |
removeChild() | 删除子节点。 |
replaceChild() | 替换子节点。 |
insertBefore() | 在指定的子节点前面插入新的子节点。 |
createAttribute() | 创建属性节点。 |
createElement() | 创建元素节点。 |
createTextNode() | 创建文本节点。 |
getAttribute() | 返回指定的属性值。 |
setAttribute() | 把指定属性设置或修改为指定的值。 |
属性是节点(HTML 元素)的值,您能够获取或设置。
(1)innerHTML属性
获取元素内容的最简单方法是使用 innerHTML 属性。
innerHTML 属性对于获取或替换 HTML 元素的内容很有用。
举例:获取 id=“intro” 的 < p> 元素的内容
<html>
<body>
<p id="intro">Hello World!p>
<script>
var txt=document.getElementById("intro").innerHTML;
document.write(txt);
script>
body>
html>
(2)nodeName 属性
nodeName 属性规定节点的名称。
nodeName 始终包含 HTML 元素的大写字母标签名。
(3)nodeValue 属性
nodeValue 属性规定节点的值。
(4)nodeType 属性
nodeType 属性返回节点的类型。nodeType 是只读的。
比较重要的节点类型有:
元素类型 | NodeType |
---|---|
元素 | 1 |
属性 | 2 |
文本 | 3 |
注释 | 8 |
文档 | 9 |
访问 HTML DOM == 查找 HTML 元素。
您能够以不同的方式来访问 HTML 元素:
修改 HTML == 改变元素、属性、样式和事件。
1.改变元素内容:使用 innerHTML 属性
<html>
<body>
<p id="p1">Hello World!p>
<script>
document.getElementById("p1").innerHTML="New text!";
script>
body>
html>
2.向 HTML DOM 添加新元素:首先必须创建该元素(元素节点),然后把它追加到已有的元素上
两个方法:appendChild()、insertBefore()
<div id="d1">
<p id="p1">This is a paragraph.p>
<p id="p2">This is another paragraph.p>
div>
<script>
var para=document.createElement("p");
var node=document.createTextNode("This is new.");
para.appendChild(node);
var element=document.getElementById("d1");
element.appendChild(para);
script>
例子解释:
这段代码创建了一个新的 < p> 元素:
var para=document.createElement("p");
如需向 < p> 元素添加文本,您首先必须创建文本节点。这段代码创建文本节点:
var node=document.createTextNode("This is a new paragraph.");
然后您必须向 < p> 元素追加文本节点:
para.appendChild(node);
最后,您必须向已有元素追加这个新元素。
这段代码查找到一个已有的元素:
var element=document.getElementById("div1");
这段代码向这个已存在的元素追加新元素:
element.appendChild(para);
appendChild() 方法是将新元素作为父元素的最后一个子元素进行添加
insertBefore() 方法是将在您指定的已有子节点之前插入新的子节点
<div id="div1">
<p id="p1">This is a paragraph.p>
<p id="p2">This is another paragraph.p>
div>
<script>
var para=document.createElement("p");
var node=document.createTextNode("This is new.");
para.appendChild(node);
var element=document.getElementById("div1");
var child=document.getElementById("p1");
element.insertBefore(para,child);
script>
3.删除 HTML 元素:必须先找到该元素的父元素
方法:removeChild()
<div id="div1">
<p id="p1">This is a paragraph.p>
<p id="p2">This is another paragraph.p>
div>
<script>
var parent=document.getElementById("div1");
var child=document.getElementById("p1");
parent.removeChild(child);
script>
方式二:parentNode属性:找到其父节点
var child=document.getElementById("p1");
child.parentNode.removeChild(child);
3.替换 HTML 元素
方法: replaceChild()
<div id="div1">
<p id="p1">This is a paragraph.p>
<p id="p2">This is another paragraph.p>
div>
<script>
var para=document.createElement("p");
var node=document.createTextNode("This is new.");
para.appendChild(node);
var parent=document.getElementById("div1");
var child=document.getElementById("p1");
parent.replaceChild(para,child);
script>
HTML DOM 允许 JavaScript 对 HTML 事件作出反应。
HTML 事件的例子:
如需向 HTML 元素分配事件,您可以使用事件属性。
1.在HTML中:
语法:< element οnclick=“SomeJavaScriptCode”>
举例:
向 button 元素分配一个 onclick 事件:
<button id="myBtn" onclick="displayDate()">试一试button>
当点击按钮时,会执行名为 displayDate 的函数。
2.在JavaScript中:
语法:object.οnclick=function(){Some JavaScriptCode};
注:HTML DOM 允许使用 JavaScript 向 HTML 元素分配事件:
举例:为 button 元素分配 onclick 事件:
<script>
document.getElementById("myBtn").onclick=function(){
displayDate()};
script>
onclick 属性可以使用与所有 HTML 元素
除了 :< base>, < bdo>, < br>, < head>, < html>, < iframe>, < meta>, < param>, < script>, < style>, 和 < title>.
onload 通常用于 < body> 元素,在页面完全载入后(包括图片、css文件等等。)执行脚本代码。
1.在 HTML中
语法:< body οnlοad=“SomeJavaScriptCode”>
举例:
body>
2.在JavaScript中
语法:window.οnlοad=function(){ SomeJavaScriptCode};
举例:
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
<script type="text/javascript">
window.onload = function () {
alert("页面加载完成了2");
}
script>
head>
<body>
body>
html>
注:
以下 HTML 标签支持 onload :
< body>, < frame>, < frameset>, < iframe>, < img>, < input type=“image”>, < link>, < script>, < style>
onunload 发生于当用户离开页面时发生的事件(通过点击一个连接,提交表单,关闭浏览器窗口等等。)
(与onload用法相同)
1.HTML 中:
语法:< body οnunlοad=“SomeJavaScriptCode”>
2.JavaScript 中:
语法:window.οnunlοad=function(){ SomeJavaScriptCode};
注:
以下 HTML 标签支持 onunload :
< body>, < frameset>
onchange 事件会在域的内容改变时发生。
onchange事件在内容改变(两次内容有可能还是相等的)且失去焦点时触发。
onchange 事件也可用于单选框与复选框改变后触发的事件。
1.HTML 中:
语法:< element οnchange=“SomeJavaScriptCode”>
2.JavaScript 中:
语法:object.οnchange=function(){ SomeJavaScriptCode};
举例:如何使用 onchange。当用户改变输入字段的内容时,将调用 upperCase() 函数。
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
<script>
function myFunction()
{
var x=document.getElementById("fname");
x.value=x.value.toUpperCase();
}
script>
head>
<body>
请输入你的英文名:<input type="text" id="fname" onchange="myFunction()">
<p>当你离开输入框时,被触发的函数会把你输入的文本转换为大写字母。p>
body>
html>
等同于:
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
<body>
请输入你的英文名:<input type="text" id="fname">
<p>当你离开输入框时,被触发的函数会把你输入的文本转换为大写字母。p>
<script>
var fname = document.getElementById("fname");
fname.onchange = function () {
this.value = this.value.toUpperCase();
}
script>
head>
body>
html>
注:支持 onchange 事件的 HTML 标签:
onchange 属性可以使用于: < input>, < select>, 和 < textarea>。
onmouseover 和 onmouseout 事件可用于在鼠标指针移动到或离开元素时触发函数。
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
<body>
<div
onmouseover="mOver(this)"
onmouseout="mOut(this)"
style="background-color:#D94A38;width:200px;height:50px;padding-top:25px;text-align:center;">
Mouse Over Me
div>
<script>
function mOver(obj)
{
obj.innerHTML="谢谢你"
}
function mOut(obj)
{
obj.innerHTML="把鼠标指针移动到上面"
}
script>
body>
html>
1.5 onmousedown、onmouseup 以及 onclick 事件
这三个事件是鼠标点击的全部过程。首先当某个鼠标按钮被点击时,触发 onmousedown 事件,然后,当鼠标按钮被松开时,会触发 onmouseup 事件,最后,当鼠标点击完成时,触发 onclick 事件。
实例:
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
<body>
<div
onmousedown="mDown(this)"
onmouseup="mUp(this)"
style="background-color:#D94A38;width:200px;height:50px;padding-top:25px;text-align:center;">
点击这里
div>
<script>
function mDown(obj)
{
obj.style.backgroundColor="#1ec5e5";
obj.innerHTML="松开鼠标"
}
function mUp(obj)
{
obj.style.backgroundColor="#D94A38";
obj.innerHTML="谢谢你"
}
script>
body>
html>
getElementsByTagName() 方法返回节点列表。节点列表是一个节点数组。
举例:
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
<body>
<p>Hello World!p>
<p>DOM 很有用!p>
<script>
x=document.getElementsByTagName("p");
document.write("第二段的 innerHTML 是: " + x[1].innerHTML);
script>
body>
html>
结果:
Hello World!
DOM 很有用!
第二段的 innerHTML 是: DOM 很有用!
length 属性定义节点列表中节点的数量。
使用 length 属性来循环节点列表
举例:
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
<body>
<p>Hello World!p>
<p>DOM 很有用!p>
<p>本例演示 <b>lengthb> 属性。p>
<script>
x=document.getElementsByTagName("p");
for (i=0;i<x.length;i++)
{
document.write(x[i].innerHTML);
document.write("
");
}
script>
body>
html>
结果:
Hello World!
DOM 很有用!
本例演示 length 属性。
Hello World!
DOM 很有用!
本例演示 length 属性。
使用三个节点属性:parentNode、firstChild 以及 lastChild ,在文档结构中进行导航。
<body>
<p>Hello World!p>
<div>
<p>DOM 很有用!p>
<p>本例演示节点关系。p>
div>
body>
另外firstChild 属性还可以可用于访问元素的文本:
firstChild.nodeValue
举例:
<body>
<p id="intro">Hello World!p>
<script>
x=document.getElementById("intro");
//方式一:innerHTML
// document.write(x.innerHTML);.//Hello World!
//方式二:firstChild.nodeValue
// document.write(x.firstChild.nodeValue);//Hello World!
document.write(x.firstChild.nodeType);//3 文本
document.write(x.nodeType);//1 元素
script>
body>
childNodes 和 nodeValue:
除了 innerHTML 属性,您也可以使用 childNodes 和 nodeValue 属性来获取元素的内容。
举例:
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
<body>
<p id="intro">Hello World!p>
<script>
txt=document.getElementById("intro").childNodes[0].nodeValue;
document.write(txt);
script>
body>
html>
注:若需要更详细的学习该技术,推荐去w3school网进行进一步学习。
网址:https://www.w3school.com.cn/