前端知识之--DOM

1.什么是DOM

我们在前端的学习中经常会发现DOM这个高频词,那么什么是DOM呢?

DOM是文档对象模型(Document Object Model)的缩写。 是 W3C(万维网联盟)的标准。是一种用于HTML和XML文档的编程接口。它给文档提供了一种结构化的表示方法,可以改变文档的内容和呈现方式。是中立于平台和语言的接口,它允许程序和脚本动态地访问和更新文档的内容、结构和样式。DOM属于浏览器,而不是JavaScript语言规范里的规定的核心内容。

HTML DOM 节点

在 HTML DOM 中,所有事物都是节点。DOM 是被视为节点树的 HTML。通过 HTML DOM,树中的所有节点均可通过 JavaScript 进行访问。所有 HTML 元素(节点)均可被修改,也可以创建或删除节点。
DOM树

2.编程接口

可通过 JavaScript (以及其他编程语言)对 HTML DOM 进行访问。

所有 HTML 元素被定义为对象,而编程接口则是对象方法和对象属性。

方法是您能够执行的动作(比如添加或修改元素)。

属性是您能够获取或设置的值(比如节点的名称或内容)。

3. 查找元素

document.getElementById("apple"); //找到id为appel的标签,因为id是唯一的,所以是element(ID选择器)
document.getElementsByTagName("like"); //找到like标签的所有元素的节点列表(标签选择器)
document.getElementsByClassName("pdd"); //找到class为pdd的标签的所有元素的节点列表(class选择器)

4.HTML DOM 属性

innerHTML 属性(获取)

获取元素内容的最简单方法是使用 innerHTML 属性。innerHTML 属性对于获取或替换 HTML 元素的内容很有用。

//获取 id="intro" 的 <p> 元素的 innerHTML:
<html>
<body>
<p id="intro">Hello World!</p>
<script>
//getElementById 是一个方法,innerHTML是一个属性
var txt=document.getElementById("intro").innerHTML;
document.write(txt);
</script>
</body>
</html>

innerHTML 属性(替换)

<!DOCTYPE html>
<html>
<body>
<p id="p1">Hello World!</p>
<script>
//找到id=p1的标签,替换内容
document.getElementById("p1").innerHTML="New text!";
</script>
<p>上面的段落被一段脚本改变了。</p>
</body>
</html>

nodeName 属性

nodeName 属性规定节点的名称。

  • nodeName 是只读的
  • 元素节点的 nodeName 与标签名相同(、、

    等都是元素节点,即标签)

  • 属性节点的 nodeName 与属性名相同(元素属性,如标签的链接属性href=“http://www.imooc.com”)
  • 文本节点的 nodeName 始终是 #text(向用户展示的内容,如li…li中的JavaScript、DOM、CSS等文本)
  • 文档节点的 nodeName 始终是 #document

nodeName 始终包含 HTML 元素的大写字母标签名。

<!DOCTYPE html>
<html>
<body><p id="demo">请点击按钮来获得 body 元素子节点的节点名。</p>
<button onclick="myFunction()">试一下</button>
<script>
function myFunction()
{
var txt="";
var c=document.body.childNodes;//返回节点的子节点集
for (i=0; i<c.length; i++)//使用 length 属性来确定子节点的数量,然后遍历所有的子节点并提取需要的信息
  {
  txt=txt + c[i].nodeName + "<br>";
  };
var x=document.getElementById("demo");  
x.innerHTML=txt;
}
</script>
<p><b>注释:</b>元素中的空格被视作文本,而文本被视作文本节点。</p>
</body>
</html>

P
#text
BUTTON
#text
SCRIPT //因为空隔,返回为#text
#text
P
#text

childNodes 属性

childNodes 属性返回节点的子节点集合,以 NodeList 对象。
可以使用 length 属性来确定子节点的数量,然后遍历所有的子节点并提取需要的信息。

nodeValue 属性

nodeValue 属性规定节点的值。

  • 元素节点的 nodeValue 是 undefined 或 null
  • 文本节点的 nodeValue 是文本本身
  • 属性节点的 nodeValue 是属性值
<!DOCTYPE html>
<html>
<body>

<p id="intro">Hello World!</p>

<script>
x=document.getElementById("intro");
document.write(x.firstChild.nodeValue);//取回 <p id="intro"> 标签的文本节点值:
</script>

</body>
</html>

nodeType 属性

nodeType 属性返回节点的类型。nodeType 是只读的。
元素类型 NodeType
元素 1
属性 2
文本 3
注释 8
文档 9

5.操作文本内容

document对象中有innerHTML、innerText这两个属性,都是获取document对象文本内容,但使用起来还是有区别的;

1. 获取标签中间文本内容: innerText:

设置或获取标签所包含的HTML+文本信息(从标签起始位置到终止位置全部内容,包括HTML标签,但不包括自身)

2. 获取标签中间内容: innerHTML

设置或获取标签所包含的文本信息(从标签起始位置到终止位置的内容,去除HTML标签,但不包括自身)

创建新的 HTML 元素 - appendChild()

如需向 HTML DOM 添加新元素,您首先必须创建该元素,然后把它追加到已有的元素上。(将新元素作为父元素的最后一个子元素进行添加)。

<div id="div1">
<p id="p1">This is a paragraph.</p>
<p id="p2">This is another paragraph.</p>
</div>
<script>
//创建了一个新的 <p> 元素
var para=document.createElement("p");
//创建文本节点,向 <p> 元素添加文本
var node=document.createTextNode("This is new.");
//向 <p> 元素追加文本节点
para.appendChild(node);
//查找到一个已有的元素
var element=document.getElementById("div1");
//向这个已存在的元素追加新元素
element.appendChild(para);
</script>

创建新的 HTML 元素 - 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>

删除已有的 HTML 元素-removeChild()

如需删除 HTML 元素,您必须清楚该元素的父元素:

<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" 的 <p> 元素
parent.removeChild(child);//从父元素中删除子元素
</script>

不能在不引用父元素的情况下删除某个元素,可以找到需要删除的子元素,然后使用 parentNode 属性来查找其父元素:

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>
//创建了一个新的 <p> 元素
var para=document.createElement("p");
//创建文本节点,向 <p> 元素添加文本
var node=document.createTextNode("This is new.");
//向 <p> 元素追加文本节点
para.appendChild(node);
//查找 id="div1" 的元素
var parent=document.getElementById("div1");
//查找 id="p1" 的 <p> 元素
var child=document.getElementById("p1");
//在父节点parent下,子节点para替换child
parent.replaceChild(para,child);
</script>

6. 事件

当事件发生时,可以执行 JavaScript,比如当用户点击一个 HTML 元素时。
如需在用户点击某个元素时执行代码,请把 JavaScript 代码添加到 HTML 事件属性中:

onclick=JavaScript

示例:当用户点击时,会改变 h1元素的内容:

<!DOCTYPE html>
<html>
<body>
<h1 onclick="this.innerHTML='hello!'">请点击这段文本!</h1>
</body>
</html>

示例2:在本例中,会从事件处理程序中调用函数:

<!DOCTYPE html>
<html>
<head>
<script>
function changetext(id)//定义函数与传参
{
id.innerHTML="hello!"; //参数id修改为hello
}
</script>
</head>
<body>
//点击oclick调用changtext函数
<h1 onclick="changetext(this)">请点击这段文本!</h1>
</body>
</html>

HTML 事件属性

如需向 HTML 元素分配事件,可以使用事件属性。

实例
向 button 元素分配一个 onclick 事件:

<!DOCTYPE html>
<html>
<body>
<p>点击按钮来执行 <b>displayDate()</b> 函数。</p>
//点击调用displayDate函数
<button onclick="displayDate()">试一试</button>
<script>
function displayDate()
{
//获取demo元素,修改设置Date(当前时间)
document.getElementById("demo").innerHTML=Date();
}
</script>
<p id="demo"></p>
</body>
</html>

使用 HTML DOM 来分配事件

HTML DOM 允许使用 JavaScript 向 HTML 元素分配事件

实例
为 button 元素分配 onclick 事件:

<!DOCTYPE html>
<html>
<head>
</head>
<body>
<p>点击按钮来执行 <b>displayDate()</b> 函数。</p>
<button id="myBtn">试一试</button>
<script>
//名为 displayDate 的函数被分配给了 id=myButn" 的 HTML 元素
//当按钮被点击时,将执行函数。
document.getElementById("myBtn").onclick=function(){displayDate()};
function displayDate()
{
document.getElementById("demo").innerHTML=Date();
}
</script>
<p id="demo"></p>
</body>
</html>

onload 和 onunload 事件

当用户进入或离开页面时,会触发 onload 和 onunload 事件。
onload 事件可用于检查访客的浏览器类型和版本,以便基于这些信息来加载不同版本的网页。
(onload 和 onunload 事件可用于处理 cookies。)

示例:

<!DOCTYPE html>
<html>
<body onload="checkCookies()">

<script>
function checkCookies()
{
//Navigator 对象包含有关浏览器的信息。
//cookieEnabled 属性可返回一个布尔值,如果浏览器启用了 cookie,该属性值为 true。如果禁用了 cookie,则值为 false。
if (navigator.cookieEnabled==true)
	{
	alert("Cookies are enabled")
	}
else
	{
	alert("Cookies are not enabled")
	}
}
</script>
<p>弹出的提示框会告诉你浏览器是否已启用 cookie。</p>
</body>
</html>

onchange 事件

用于输入字段的验证

<!DOCTYPE html>
<html>
<head>
<script>
function myFunction()
{
var x=document.getElementById("fname");
//当用户改变输入字段的内容时,将调用 upperCase() 函数。把所有小写字符转换为大写,把返回值重新赋给x.value
x.value=x.value.toUpperCase();
}
</script>
</head>
<body>

请输入你的英文名:<input type="text" id="fname" onchange="myFunction()">
<p>当你离开输入框时,被触发的函数会把你输入的文本转换为大写字母。</p>

</body>
</html>

onmouseover 和 onmouseout 事件

可用于在鼠标指针移动到或离开元素时触发函数

<!DOCTYPE html>
<html>
<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>

onmousedown、onmouseup 以及 onclick 事件

onmousedownonmouseup 以及 onclick 事件是鼠标点击的全部过程。首先当某个鼠标按钮被点击时,触发 onmousedown 事件,然后,当鼠标按钮被松开时,会触发 onmouseup 事件,最后,当鼠标点击完成时,触发 onclick 事件。

<!DOCTYPE html>
<html>
<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>

更多内容请查阅JavaScript 参考手册

7.导航

通过 HTML DOM,能够使用节点关系在节点树中导航。

节点列表

通过getElementsByTagName() 方法返回节点列表。节点列表是一个节点数组。

//选取文档中的所有 <p> 节点:
var x=document.getElementsByTagName("p");
//访问第二个节点
y=x[1];

HTML DOM 节点列表长度

length 属性定义节点列表中节点的数量。

<!DOCTYPE html>
<html>
<body>
<p>Hello World!</p>
<p>DOM 很有用!</p>
<p>本例演示 <b>length</b> 属性。</p>
<script>
//返回节点列表长度
x=document.getElementsByTagName("p");
//遍历
for (i=0;i<x.length;i++)
  { 
  document.write(x[i].innerHTML);
  //每次打印分行
  document.write("<br>");
  }
</script>
</body>
</html>
}

导航节点关系

能够使用三个节点属性:parentNode(父节点)、firstChild(首个元素) 以及 lastChild (最后一个元素),在文档结构中进行导航。

  • firstChild 属性可用于访问元素的文本:
<!DOCTYPE html>
<html>
<body>
<p id="intro">Hello World!</p>
<script>
x=document.getElementById("intro");
//
document.write(x.firstChild.nodeValue);
</script>
</body>
</html>

DOM 根节点

这里有两个特殊的属性,可以访问全部文档:

  • document.documentElement - 全部文档
  • document.body - 文档的主体
<html>
<body>
<p>Hello World!</p>
<div>
<p>DOM 很有用!</p>
<p>本例演示 <b>document.body</b> 属性。</p>
</div>
<script>
alert(document.body.innerHTML);
</script>
</body>
</html>

childNodes 和 nodeValue

除了 innerHTML 属性,也可以使用 childNodes 和 nodeValue 属性来获取元素的内容。

示例:获取 id=“intro” 的

元素的值:

<!DOCTYPE html>
<html>
<body>

<p id="intro">Hello World!</p>

<script>
txt=document.getElementById("intro").childNodes[0].nodeValue;
document.write(txt);
</script>

</body>
</html>

getElementById 是一个方法,而 childNodes 和 nodeValue 是属性。

8.HTML DOM 总结

HTML DOM 可以用来增强网站的动态交互性,操作 HTML 元素以响应不同的场景。

  • 4
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值