JavaScript htmldom 导航



使用HTML DOM, 可以使用节点关系来导航节点树.


DOM 节点

根据W3C HTML DOM标准, 在一个HTML文档都是一个节点:

The entire document is a document node 每个HTML元素是元素节点 在HTML元素的文本是文本节点 每一个HTML属性是一个属性节点 所有注释都是注释节点

DOM HTML tree

使用HTML DOM, 在节点树的所有节点可以通过JavaScript访问.

可以创建新节点,并可以修改或删除所有节点.


节点关系

节点树中的节点彼此具有层次关系.

使用父母,孩子和兄弟姐妹的术语是用来描述他们的关系.

  • 在节点树中,顶节点称为根 (或根节点)
  • 每个节点都有一个父节点,除了根节点 (没有父节点)
  • 节点可以有多个孩子
  • 兄弟姐妹(兄弟或姐妹)有同一个父节点
<html>

  <head>
      <title>DOM Tutorial</title>
  </head>

  <body>
      <h1>DOM Lesson one</h1>
      <p>Hello world!</p>
  </body>

</html>

Node tree

从上面你可以阅读HTML:

  • <html> 是根节点
  • <html> 没有父节点
  • <html><head><body>的父节点
  • <head><html>的第一个节点
  • <body><html>的最后一个节点

并且:

  • <head> 有一个子节点: <title>
  • <title> 有一个子节点 (文本节点): "DOM Tutorial"
  • <body> 有两个子节点: <h1><p>
  • <h1> 有一个子节点: "DOM Lesson one"
  • <p> 有一个子节点: "Hello world!"
  • <h1><p> 是兄弟节点

节点之间导航

你可以使用以下的节点属性导航节点之间使用JavaScript:

  • parentNode
  • childNodes[nodenumber]
  • firstChild
  • lastChild
  • nextSibling
  • previousSibling

子节点和节点值

在DOM处理中常见的错误就是认为一个元素节点包含文本.

<title id="demo">DOM Tutorial</title>

元素节点<title> (在上面的实例中) 不包含文本。

它包含有值的文本节点 "DOM Tutorial".

该文本节点的值可以通过节点的innerHTML属性访问:

var myTitle = document.getElementById("demo").innerHTML;

访问innerHTML属性访问和访问第一个子节点值相同:

var myTitle = document.getElementById("demo").firstChild.nodeValue;

访问第一个子节点也可以这样做:

var myTitle = document.getElementById("demo").childNodes[0].nodeValue;

所有下面3个实例查询<h1>元素的文本,并且拷贝它到<p>元素。

<html>
<body>

<h1 id="id01">My First Page</h1>
<p id="id02"></p>

<script>
document.getElementById("id02").innerHTML = document.getElementById("id01").innerHTML;
</script>

</body>
</html>

让我试试

<html>
<body>

<h1 id="id01">My First Page</h1>
<p id="id02"></p>

<script>
document.getElementById("id02").innerHTML = document.getElementById("id01").firstChild.nodeValue;
</script>

</body>
</html>

让我试试

<html>
<body>

<h1 id="id01">My First Page</h1>
<p id="id02">Hello!</p>

<script>
document.getElementById("id02").innerHTML = document.getElementById("id01").childNodes[0].nodeValue;
</script>

</body>
</html>

让我试试


InnerHTML

在本教程中,我们使用innerHTML属性来检索HTML元素的内容.

然而,学习其他方法理解树结构和DOM的导航是有用的.


DOM 根节点

有两个特殊属性允许访问完整文档:

  • document.body - 文档主体
  • document.documentElement - 完整的文档
<html>
<body>

<p>Hello World!</p>
<div>
<p>The DOM is very useful!</p>
<p>This example demonstrates the <b>document.body</b> property.</p>
</div>

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

</body>
</html>

让我试试

<html>
<body>

<p>Hello World!</p>
<div>
<p>The DOM is very useful!</p>
<p>This example demonstrates the <b>document.documentElement</b> property.</p>
</div>

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

</body>
</html>

让我试试


nodeName 属性

nodeName属性指定一个节点的名称.

  • nodeName 是只读的
  • nodeName 一个元素节点的节点名称和标签名称相同
  • 一个属性节点的节点名称是属性名
  • 一个文本节点的nodeName总是 #text
  • 文档的节点名称总是 #document
<h1 id="id01">My First Page</h1>
<p id="id02"></p>

<script>
document.getElementById("id02").innerHTML = document.getElementById("id01").nodeName;
</script>

让我试试

注意: nodeName总是包含HTML元素的大写标签名称.


nodeValue 属性

nodeValue 属性指定节点的值.

  • 素节点的节点值是 undefined
  • 文本节点的节点是文本本身
  • 属性节点的节点值是属性值

nodeType 属性

nodeType 属性返回节点类型. nodeType 是只读的.

<h1 id="id01">My First Page</h1>
<p id="id02"></p>

<script>
document.getElementById("id02").innerHTML = document.getElementById("id01").nodeType;
</script>

让我试试

最重要的节点类型有:

元素类型 节点类型
Element 1
Attribute 2
Text 3
Comment 8
Document 9