DOM

(从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

  • 文档:一个页面就是一个文档,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属性

返回节点的类型
只读
DOM

<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" />

DOM

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

DOM
DOM
DOM

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>

DOM
2. document.body - 文档的主体

<body>

<p>Hello World!</p>
<div>
<p>弹出了窗口</p>
<p>显示了全部body</p>
</div>

<script>
alert(document.body.innerHTML);
</script>

</body>

DOM

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!

上一篇:利用javascript写一个石头剪刀布的简易小游戏


下一篇:回顾 2021 中国 .NET 开发者峰会