(从pink老师的网课和w3chool的学习整理)
DOM
介绍
- DOM(Document Object Model,简称DOM)
文档对象模型 - 是W3C组织推荐的处理可扩展标记语言
(HTML或者XHTML)的标准编程接口 - W3C已经定义了一系列的DOM接口,通过这些DOM接口可以改变网页的内容、结构和样式
- W3C DOM 标准被分为 3 个不同的部分:
1.核心 DOM - 针对任何结构化文档的标准模型
2.XML DOM - 针对 XML 文档的标准模型
3.HTML DOM - 针对 HTML 文档的标准模型
DOM树
- 文档:一个页面就是一个文档,DOM中使用document表示
- 元素:页面中所有标签都是元素,DOM中使用element表示
- 节点:网页中所有内容都是节点(标签、属性、文本、注释等),DOM中使用node来表示
DOM把以上内容都看作对象
HTML DOM 节点
节点树中的节点彼此拥有层级关系
:父(parent)、子(child)和同胞(sibling)
- 在节点树中,顶端节点被称为根(root)
- 每个节点都有父节点、除了根(它没有父节点)
- 一个节点可拥有任意数量的子
- 同胞是拥有相同父节点的节点
编程接口
所有HTML元素被定义为对象,编程接口则是对象方法和对象属性(属性就是能够获取或设置的值,比如节点的名称或内容)
HTML DOM方法
方法是可以在节点(HTML元素)上执行的动作(修改元素或添加元素)
getElementById()
getElementsByTagName()
getElementsByClassName()
详细请见HTML DOM 访问
appendChild()
replaceChild()
insertBefore()
removeChild()
HTML DOM属性
innerHTML属性
innerHTML 属性可用于获取或改变任意 HTML 元素,包括<html>
和 <body>
<p id="demo">Hello World!</p>
<script>
var x=document.getElementById("demo").innerHTML ;
document.write("来自demo段落的文本:" +x);
</script>
nodeName 属性
节点的名称
- nodeName 是只读的
- 元素节点的 nodeName 与标签名相同
- 属性节点的 nodeName 与属性名相同
- 文本节点的 nodeName 始终是 #text
- 文档节点的 nodeName 始终是 #document
nodeValue属性
节点的值
- 元素节点的 nodeValue 是 undefined 或 null
- 文本节点的 nodeValue 是文本本身
- 属性节点的 nodeValue 是属性值
例子
<p id="demo">Hello World!</p>
<script>
x=document.getElementById("demo");
document.write(x.firstChild.nodeValue);
</script>
Hello World!
Hello World!
<p id="demo">Hello World!</p>
<script>
x=document.getElementById("demo");
document.write(x.firstChild.nodeName);
</script>
Hello World!
#text
nodeType属性
返回节点的类型
只读
<p id="demo">Hello World!</p>
<script>
x=document.getElementById("demo");
document.write(x.firstChild.nodeType);
</script>
Hello World!
3
HTML DOM访问
getElementById()
返回带有指定 ID 的元素:
<p id="demo">Hello World!</p>
<script>
var x=document.getElementById("demo");
document.write("来自demo段落的文本:" + x.innerHTML );
</script>
Hello World!
来自demo段落的文本:Hello World!
getElementsByTagName()
document.getElementsByTagName('标签名');
返回带有指定标签名的对象集合
1.因为得到的是一个对象的集合,所以需要遍历才可以操作里面的元素
2.得到元素对象是动态的
例子1:
<ul>
<li>1111</li>
<li>2222</li>
<li>3333</li>
</ul>
<script>
//1.返回的是 获取元素对象的集合 以伪数组的形式存储
var lis = document.getElementsByTagName('li');
console.log(lis);
console.log(lis[0]);
// HTMLCollections(3) [li,li,li]
// <li>1111</li>
// 2.可以采取遍历的方式依次打印里面的元素对象
// 3.如果页面中只有一个li 返回的还是一个伪数组
// 没有这个元素 空的伪数组
</script>
还可以获取某个元素(父元素)内部所有指定标签名的子元素
element.getElementByTagName('标签名');
父元素必须是单个对象(必须指明是哪一个元素对象)获取的时候不包括父元素自己
<ul>
<li>1111</li>
<li>2222</li>
<li>3333</li>
</ul>
<ol id=demo>
<li>6666</li>
</ol>
<srcipt>
var ol= document.getElementById('demo');
console.log(ol.getElementsByTagName('li'));
// HTMLCollections(1)[li]
</script>
getElementsByClassName()
document.getElementsByClassName("类名");
HTML DOM 修改
修改 HTML = 改变元素、属性、样式和事件
创建 HTML 内容
- 使用 innerHTML 属性
<p id="p1">Hello World!</p>
<script>
document.getElementById("p1").innerHTML="New text!";
</script>
改变HTML内容
<p id="p1">Hello World!</p>
<script>
document.getElementById("p1").innerHTML="New text!";
</script>
改变 HTML 样式
<p id="p2">Hello world!</p>
<script>
document.getElementById("p2").style.color="blue";
</script>
创建新的HTML元素
appendChild()
创建该元素,然后把它追加到已有的元素上
(将新元素作为父元素的最后一个子元素进行添加)
<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");//创建新的p元素
var node=document.createTextNode("This is new.");//创建文本节点
para.appendChild(node);//向p元素追加文本节点(添加文本)
//向已有元素追加这个新元素
var element=document.getElementById("div1");//找到一个已有元素
element.appendChild(para);//追加新元素
</script>
This is a paragraph.
This is another paragraph.
This is new.
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>
删除已有元素
必须知道父元素
- 引用父元素
<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");//查找id=div1的元素
var child=document.getElementById("p1");
//查找id="p1"的元素
parent.removeChild(child);
//从父元素parent删除子元素child
</script>
- 在不引用父元素的情况下删除某个元素
var child=document.getElementById("p1");
child.parentNode.removeChild(child);
替换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>
使用事件
执行代码
1.
<input type="button"
onclick="document.body.style.backgroundColor='lightblue';"
value="改变背景色">
2.函数
<script>
function ChangeBackground()
{
document.body.style.backgroundColor="lightblue";
}
</script>
<input type="button" onclick="ChangeBackground()"
value="Change background color" />
HTML DOM事件
允许 JavaScript 对 HTML 事件作出反应
HTML 事件的例子:
- 当用户点击鼠标时
- 当网页已加载时
- 当图片已加载时
- 当鼠标移动到元素上时
- 当输入字段被改变时
- 当 HTML 表单被提交时
- 当用户触发按键时
eg:
<h1 onclick="this.innerHTML='hello!'">请点击这段文本!</h1>
调用函数
2.
function changetext(id)
{
id.innerHTML="hello!";
}
</script>
</head>
<body>
<h1 onclick="changetext(this)">请点击这段文本!</h1>
事件属性
例:向buttom元素分配一个onclick事件
<button onclick="displayDate()">试一试</button>
点击按钮时,会执行名为 displayDate 的函数
<p id="demo"></p>
<button onclick="displayDate()">试一试</button>
<script>
function displayDate()
{
document.getElementById("demo").innerHTML=Date();
}
</script>
分配事件
displayDate 的函数被分配给了 id=myButn的 HTML 元素
<script>
document.getElementById("myBtn").onclick=function(){displayDate()};
</script>
onload、onunload事件
当用户进入或离开页面时,会触发 onl oad 和 onunload 事件
- onload 事件可用于检查访客的浏览器类型和版本,以便基于这些信息来加载不同版本的网页
- onload 和 onunload 事件可用于处理 cookies
<body onl oad="checkCookies()">
<script>
function checkCookies()
{
if (navigator.cookieEnabled==true)
{
alert("Cookies are enabled")
}
else
{
alert("Cookies are not enabled")
}
}
</script>
onchange事件
用于输入字段的验证
例如:将输入文本转换成大写
<input type="text" id="fname" onchange="upperCase()">
<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>
onmouseover 、onmouseout 事件
用于在鼠标指针移动到或离开元素时触发函数
<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="helloworld"
}
function mOut(obj)
{
obj.innerHTML="鼠标指针移动到上面"
}
</script>
onmousedown、onmouseup事件
<div
onmousedown="mDown(this)"
onmouseup="mUp(this)"
style="background-color: lightblue;width:200px;height:50px;padding-top:25px;text-align:center;">
点击这里
</div>
<script>
function mDown(obj)
{
obj.style.backgroundColor="yellow";
obj.innerHTML="松开鼠标"
}
function mUp(obj)
{
obj.style.backgroundColor="pink";
obj.innerHTML="hello"
}
</script>
HTML DOM导航
HTML DOM 节点列表
getElementsByTagName() 方法返回节点列表
<p>Hello</p>
<p>world</p>
<script>
x=document.getElementsByTagName("p");
document.write("第二段的 innerHTML 是: " + x[1].innerHTML);
</script>
length 属性来循环节点列表
也就是遍历
<p>Hello</p>
<p>world</p>
<p>遍历</p>
<script>
//获取所有 <p> 元素节点
x=document.getElementsByTagName("p");
//输出每个 <p> 元素的文本节点的值
for (i=0;i<x.length;i++)
{
document.write(x[i].innerHTML);
document.write("<br>");
}
</script>
导航节点关系
三个节点属性:parentNode(父节点)、firstChild (第一个子元素)、lastChild(最后一个子元素)
<p id="demo">Hello World!</p>
<script>
x=document.getElementById("demo");
document.write(x.firstChild.nodeValue);
</script>
DOM根节点
- document.documentElement - 全部文档
- document.body - 文档的主体
例子:
1.document.documentElement - 全部文档
<!DOCTYPE html>
<html>
<body>
<p>Hello World!</p>
<div>
<p>弹出了窗口</p>
<p>显示了全部body</p>
</div>
<script>
alert(document.documentElement .innerHTML);
</script>
</body>
</html>
2. document.body - 文档的主体
<body>
<p>Hello World!</p>
<div>
<p>弹出了窗口</p>
<p>显示了全部body</p>
</div>
<script>
alert(document.body.innerHTML);
</script>
</body>
childNodes、nodeValue
获取元素内容
<div id="intro">Hello DOM!<p>666666</p>
</div>
<script>
txt=document.getElementById("intro").childNodes[0].nodeValue;
document.write(txt);
</script>
Hello DOM!
666666
Hello DOM!