系统学习DOM(一)

215 阅读2分钟

这是我参与更文挑战的第4天,活动详情查看:更文挑战

上次 系统学习BOM 后,时隔几天,终于有时间继续系统学习 DOM,相对于 BOM,DOM 的内容明显更多,因此打算分开整理。

Screen Shot 2021-06-25 at 1.07.39 AM.png

DOM(Document Object Model,文档对象模型)是针对 HTML 和 XML 文档的一个 API,通过层次化节点树的方式来描述文档,并且提供了一系列增删改查的方法,来对文档进行操作。

因为 DOM 是一棵树,所以首先需要了解它的节点类型,从而对其全貌有个大致印象。

1. Node

Node 是 DOM1 定义的接口,该接口将由 DOM 的所有节点类型实现,它有如下常用的属性和方法:

  • nodeType:表示节点类型,共有12个取值,分别是:
    • Node.ELEMENT_NODE(1)
    • Node.ATTRIBUTE_NODE(2)
    • Node.TEXT_NODE(3)
    • Node.CDATA_SECTION_NODE(4)
    • Node.ENTITY_REFERENCE_NODE(5)
    • Node.ENTITY_NODE(6)
    • Node.PROCESSING_INSTRUCTION_NODE(7)
    • Node.COMMENT_NODE(8)
    • Node.DOCUMENT_NODE(9)
    • Node.DOCUMENT_TYPE_NODE(10)
    • Node.DOCUMENT_FRAGMENT_NODE(11)
    • Node.NOTATION_NODE(12)
  • nodeName:节点名称
  • nodeValue:节点值
  • childNodes:保持子节点的 NodeList 对象,是一个类数组
  • appendChild:向 childNodes 列表的􏳦􏳧添加一个节点
  • 更多方法不再列出,可以查询 MDN 文档

2. Document

表示整个文档,nodeType = 9,一般使用它的实例 document,它有一些常用的属性和反方法:

  • document.documentElement:html 节点
  • document.title:title 节点,即显示在标题栏的文本
  • document.body:body 节点
  • document.URL:地址栏的 URL
  • document.getElementById:通过 id 获取节点
  • document.querySelector:通过选择器获取节点
  • document.write:在文档中动态写入 html
  • 更多方法不再列出

3. Element

表示组成文档节点元素,nodeType = 1,这个类型非常常用,比如常见的有:

  • HTMLDivElement:div 元素
  • HTMLImageElement:image 元素
  • HTMLTableElement:table 元素
  • 更多方法不再列出

4. Text

表示 text 节点,nodeType = 3,即在 DOM 树中没有标签包裹的文本。

5. Comment

表示注释,nodeType = 8。

6. CDATASection

只针对 XML 文档,nodeType = 4,表示 CDATA 区域。

7. DocumentType

包含于文档 doctype 有关信息,nodeType = 10,即 html 最顶上 <!DOCTYPE html>。

8. DocumentFragment

“虚拟”节点,nodeType = 11,在文档中没有对应标记,类似 React.Fragment。

9. Attr

表示元素属性,nodeType = 2,比如 width、height 等。

以上就是 DOM 节点的基本类型,对于每个类型,都包含对应的增删改查方法,这样通过 API,就可以完备的操作一棵 DOM 树,从而操作文档。

这样抽象有什么好处呢?试想如果没有 DOM,我们操作文档就只能通过字符串匹配来做,这样很低效且容易出错,而 DOM 正好给我们提供了一套完备高效的方法。