HTML DOM允许JavaScript使用节点关系导航节点树。
根据W3C HTML DOM标准,HTML文档中的所有内容都是一个节点:
整个文档是一个文档节点
每个HTML元素都是一个元素节点
HTML元素内的文本是文本节点
每个HTML属性都是一个属性节点(不建议使用)
所有注释都是注释节点
使用HTML DOM,可以通过JavaScript访问节点树中的所有节点。
可以创建新节点,并且可以修改或删除所有节点。
节点树中的节点之间具有层次关系。
术语“父母”,“孩子”和“兄弟姐妹”用于描述关系。
在节点树中,顶部节点称为根(或根节点)
每个节点只有一个父节点,根节点除外(根节点没有父节点)
一个节点可以有多个子节点
兄弟姐妹(兄弟姐妹)是具有相同父节点的节点
<html> <head> <title>DOM Tutorial</title> </head> <h1>DOM Nodes</h1> <p>Hello, World</p> </html>
从上面的HTML中,您可以阅读:
<html>是根节点,并且没有父节点
<html>是<head>和<body>的父级
<head>是<html>的第一个孩子
<body>是<html>的最后一个孩子
和:
<head>有一个孩子:<title>
<title>有一个孩子(一个文本节点):“ DOM Tutorial”
<body>有两个孩子:<h1>和<p>
<h1>有一个孩子(一个文本节点):“ DOM Nodes”
<p>有一个孩子(一个文本节点):“ Hello,world”
<h1>和<p>是同级
您可以使用以下节点属性在具有JavaScript的节点之间导航:
您可以使用DOM节点的属性来访问节点的第一个直接子节点。
<p id="para"> <span>First span</span> <b>First Bold</b> </p> <script> var para = document.getElementById("para"); alert(para.firstElementChild.nodeName); // returns SPAN </script>测试看看
注意:在上面的示例中,输出将是#text,因为插入了文本节点以维护标记之间的空白。任何空格都会创建一个#text节点,从单个空格到多个空格,返回,制表符等。
但是,如果删除空格,则不会插入#text节点,并且span元素将成为段落的第一个子元素:
<p id="para"><span>First span</span> <b>First Bold</b></p> <script> var para = document.getElementById("para"); alert(para.firstChild.nodeName); // returns SPAN </script>测试看看
访问第一个孩子也可以这样进行:
para.childNodes[0].nodeName; // returns SPAN测试看看
您可以使用DOM节点的属性来访问节点的最后一个直接子节点。
para.lastChild.nodeName; // returns B测试看看
为避免出现#text或#comment节点并返回该问题,您可以选择使用:
属性返回指定父元素的第一个子元素。
<p id="para"> <span>First span</span> <b>First Bold</b> </p> <script> var para = document.getElementById("para"); alert(para.firstElementChild.nodeName); // returns SPAN </script>测试看看
属性返回指定父元素的最后一个子元素。
<p id="para"> <span>First span</span> <b>First Bold</b> </p> <script> var para = document.getElementById("para"); alert(para.lastElementChild.nodeName); // returns B </script>测试看看
注:本是一个只读属性,返回当前节点作为字符串的名称。
您可以使用属性来访问DOM树中指定节点的父级。
<div> <p>This is first P inside DIV</p> <p id="para">This is second P inside DIV</p> <p>This is third P inside DIV</p> </div> <script> var para = document.getElementById("para"); alert(para.parentNode.nodeName); // returns DIV </script>测试看看
您还可以使用属性返回指定元素的父元素。
您可以使用和属性来访问DOM树中的上一个和下一个节点。
<div id="div-1">Here is div-1</div> <div id="div-2">Here is div-2</div> <div id="div-3">Here is div-3</div> <script> var x = document.querySelector("#div-2"); alert(x.previousSibling.nodeName); alert(x.nextSibling.nodeName); </script>测试看看
或者,您可以使用和来跳过任何空白文本节点来获取上一个和下一个同级元素。
<div id="div-1">Here is div-1</div> <div id="div-2">Here is div-2</div> <div id="div-3">Here is div-3</div> <script> var x = document.querySelector("#div-2"); alert(x.previousElementSibling.textContent); alert(x.nextElementSibling.textContent); </script>测试看看
属性表示节点的文本内容。
以下两个属性允许访问整个文档:
属性设置或返回文档的元素。
<!DOCTYPE html> <html> <p>Hello, World!</p> <div> <p>DOM根节点</p> <p>document.body属性设置或返回文档的body元素。</p> </div> <script> alert(document.body.innerHTML); </script> </html>测试看看
属性返回文档的元素。
<!DOCTYPE html> <html> <p>Hello, World!</p> <div> <p>DOM根节点</p> <p>document.documentElement属性返回文档的根元素。</p> </div> <script> alert(document.documentElement.innerHTML); </script> </html>测试看看
属性以数字形式返回指定节点的节点类型。
var x = document.getElementById("myPara").nodeType;测试看看
DOM树由不同类型的节点组成,例如元素,文本,注释等。
每个节点都有一个属性,可用于查找要处理的节点类型。
下表列出了最重要的节点类型:
节点 | 类型 | 例 |
---|---|---|
ELEMENT_NODE | 1个 | <p class="heading">Hello, World</p> |
ATTRIBUTE_NODE | 2 | class =“heading”(不建议使用) |
TEXT_NODE | 3 | Hello, World |
COMMENT_NODE | 8 | <!--这是注释--> |
DOCUMENT_NODE | 9 | HTML文档本身(<html>的父级) |
DOCUMENT_TYPE_NODE | 10 | <!doctype html> |