在 HTML DOM (Document Object Model) 中, 每个东西都是节点

  • 文档本身就是一个文档对象
  • 所有 HTML 元素都是元素节点
  • 所有 HTML 属性都是属性节点
  • 插入到 HTML 元素文本是文本节点
  • 注释是注释节点

    元素对象

    在 HTML DOM 中,元素对象代表着一个 HTML 元素。
    元素对象 的子节点可以是元素节点,文本节点,注释节点等。
    NodeList 对象代表了节点列表,类似于 HTML元素的子节点集合。

    nodeType

    node(节点) - 图1

    节点的关系

    node(节点) - 图2
    node(节点) - 图3

    只考虑元素节点(为排除文本节点的干扰)

    node(节点) - 图4
    考虑所有节点就会把文本和注释等这些节点都算上了,但很多情况我们用不上,反而会干扰我们,比如我们想调用第一个子节点的属性,得到的节点有可能会是文本节点或是空文本节点,我们并不需要,只希望是元素,所以我们可以排除它们。使用只考虑元素节点,需添加Element关键字,就表示元素的意思,那么firstElementChild的意思就如语义一样表示第一个子元素节点。
    node(节点) - 图5
    注意点:父节点一定是元素节点,因此并不需要加Elment关键词

我们来演示几种情况:

  1. 简化代码
  2. <body>
  3. <div id="box">
  4. <p>我是段落A</p>
  5. <p id="para">我是段落B</p>
  6. <p>我是段落C</p>
  7. </div>
  8. <script>
  9. var box = document.getElementById('box');
  10. var para = document.getElementById('para');
  11. // 所有子节点
  12. consol.log(box.childNodes);
  13. </script>
  14. </body>

node(节点) - 图6会有7项,我们展开来看看
node(节点) - 图7
可以看到,都是文本节点,然后在是p标签。
也就是说它把标签之间的这些的空格也当作是文本节点,也叫空文本节点
node(节点) - 图8,除非我们把这些空也给去掉就没有文本节点了,得到的自然也是元素,但我们大多数为了美观和可读性不会写的如此紧凑,因此还是非常有必要需要只选择元素。

现在我们演示如何得到子元素节点

  1. 简化代码(在上一个代码尾部添加如下代码)
  2. // 所有的元素子节点(IE9开始兼容)
  3. console.log(box.children);

node(节点) - 图9z

自行测试代码

  1. 简化代码
  2. <body>
  3. <div id="box">
  4. <p>我是段落A</p>
  5. <p id="para">我是段落B</p>
  6. <p>我是段落C</p>
  7. </div>
  8. <script>
  9. var box = document.getElementById('box');
  10. var para = document.getElementById('para');
  11. // 所有子节点
  12. console.log(box.childNodes);
  13. // 所有的元素子节点(IE9开始兼容)
  14. console.log(box.children);
  15. // 第一个子节点
  16. console.log(box.firstChild);
  17. console.log(box.firstChild.nodeType);
  18. // 第一个元素子节点(IE9开始兼容)
  19. console.log(box.firstElementChild);
  20. // 最后一个子节点
  21. console.log(box.lastChild);
  22. console.log(box.lastChild.nodeType);
  23. // 最后一个元素子节点(IE9开始兼容)
  24. console.log(box.lastElementChild);
  25. // 父节点
  26. console.log(para.parentNode);
  27. // 前一个兄弟节点
  28. console.log(para.previousSibling);
  29. // 前一个元素兄弟节点(IE9开始兼容)
  30. console.log(para.previousElementSibling);
  31. // 后一个兄弟节点
  32. console.log(para.nextSibling);
  33. // 后一个元素兄弟节点(IE9开始兼容)
  34. console.log(para.nextElementSibling);
  35. </script>
  36. </body>

节点操作

改变元素节点的内容

node(节点) - 图10

  1. 简化代码
  2. <body>
  3. <div id="box"></div>
  4. <script>
  5. var oBox = document.getElementById('box');
  6. oBox.innerHTML = 'innerHTML'
  7. </script>
  8. </body>

node(节点) - 图11
并且可以书写HTML标签
oBox.innerHTML=’

  • 牛奶
  • 咖啡
‘;
node(节点) - 图12
而innerText这样写就是一个纯文本了,会原样输出出来,这就是两者区别。

改变元素节点的css样式

1.png
演示:

  1. 简化代码
  2. <body>
  3. <p id="p1">Hello World!</p>
  4. <p id="p2">Hello World!</p>
  5. <script>
  6. document.getElementById("p2").style.color="blue";
  7. document.getElementById("p2").style.fontFamily="Arial";
  8. document.getElementById("p2").style.fontSize="larger";
  9. </script>
  10. <p>以上段落通过脚本修改。</p>
  11. </body>

2.png
会以行内的样式给我们设定
3.png
说明优先级最高,即使在css书写依然会覆盖

改变元素节点的HTML属性

4.png
演示:

  1. 简化代码
  2. <body>
  3. <img id="image" src="smiley.gif" width="160" height="120">
  4. <script>
  5. document.getElementById("image").src="landscape.jpg";
  6. </script>
  7. <p>原图片为 smiley.gif,脚本将图片修改为 landscape.jpg</p>
  8. </body>

5.png

不符合标准的写法
7.png

引用:
元素对象

节点的创建、被挂载、移除和克隆

创建节点

createElement()【创建元素节点】

document.createElement(nodename)

参数 类型 描述
nodename String 必须。创建元素的名称。

返回值

类型 描述
元素对象 创建的元素节点

1.png

把节点挂载到DOM树上

2.png
元素对象

移动节点

1.png
元素对象

删除节点

1.png
元素对象

克隆节点

1.png
元素对象