文档对象模型(Document Object Model)
document 对象是页面的入口,提供了操作页面的方法,程序和脚本可以通过这个动态地访问和修改页面的内容

  • DOM 代表着加载到浏览器窗口的当前网页,DOM 把一份文档表示为一棵树,一份文档是由节点构成的集合,每个节点都是一个对象(一份文档就是一份节点集合)
  • 文档被加载在浏览器的窗口中,所以 document 又是 window 对象的一个属性
  • 只要查询 DOM 中的元素,浏览器都会搜索整个 DOM 树,从中查找可能匹配的元素(尽量减少对 DOM 的访问)

节点

一共有 12 种节点类型。实际上通常用到的是其中的 3 种:

  • 元素节点:HTML 标签
  • 属性节点:标签的属性
  • 文本节点:元素节点内的文本,只包含一个字符串,没有子节点

节点关系

对 DOM 的所有操作都是以 document 对象开始
DOM 节点是常规的 JS 对象,它们使用基于原型的类进行继承

1000

实时集合:如果文档中的节点树发生变化,集合也会随之变化
静态集合:后面对文档对象模型的任何改动都不会影响集合的内容

Tip

console.dir( node ):可以按照对象的形式打印节点信息


Node

一个基础的接口,“抽象”类,没有实例,其他的节点对象都继承了 Node,提供节点共有的属性和方法

常用属性

获取节点的信息:

  • nodeType:元素节点是 1,属性节点是 2,文本节点是 3,document 节点是 9
  • nodeName:节点名称
  • nodeValue:获取和设置节点的值
  • childNodes:获取所有子节点,返回 实时的 NodeList
  • firstChild:第一个子节点
  • lastChild:最后一个子节点
  • previousSibling:前一个兄弟节点
  • nextSibling:后一个兄弟节点
  • parentNode:父节点
  • textContent:节点内的 纯文本,可以写入

上面大部分没有特殊表明的就是只读的


Document

全局变量 document 就是属于这个类,代表整个文档,作为 DOM 的入口,其属性和方法用于整个文档

常用属性

最顶层的标签可以直接作为 document 的属性来使用

  • document.documentElement<html>
  • document.body<body>
  • document.head<head>

访问其他内容:

  • document.cookie:访问和设置 cookie
  • document.title:访问和设置网页标题
  • document.URL:读取网页 URL
  • document.location:读取网页文档的 URL 相关的信息,返回 Location 对象

Tip

document.location = '...',也可写为 document.location.href = '...'。但是不用这个,用 window.location

常用方法

获取 DOM 中的元素:

  • document.getElementById( id ):根据 id 字符串获取元素对象

创建节点:

  • document.createElement( tag ):创建一个标签元素节点
  • document.createTextNode(text):创建一个文本节点

Element

元素节点属于这个类,有元素节点特有的属性和方法

常用属性

  • innerHTML:获取元素内部的 HTML 字符串形式,也可以重新写入它(会完全重写,更安全的写入:使用 Node 上的 textContent)。如果插入一个脚本则不会执行
  • outerHTML:类似 innerHTML 加上该元素自身(写入内容不会改变原来的元素,而是删除原来的元素再插入一个新的元素,原来的查询引用还是原来的,只是页面展示变成了新的)
  • className:css 类名,赋值会替换整个字符串
  • classList:操作 css class 的对象,可进行单个 class 的操作
  • style:css 对象(对于多词(multi-word)属性,使用驼峰式 camelCase)

常用方法

  • getAttribute( attribute ):获取标签的特性值(大小写不敏感,怎么写都行)
  • setAttribute( attribute, value ):设置标签的特性,value 会自动转为字符串
  • hasAttribute( attribute ):检查标签特性是否存在
  • removeAttribute( attribute ):移除特性
  • attributes:所有特性的实时集合(类数组对象,可迭代对象)
  • matches( css ):检查该元素是否与给定的 CSS 选择器匹配,一般用于在遍历中进行过滤
  • closest( css ):返回离当前元素最近的祖先元素(可以是本身)
  • elemA.contains( elemB ):检查 elemA 中是否包含 elemB,是返回 true
  • insertAdjacentHTML( whereStr, html ):在哪里插入 HTML 字符串

如果一个标签元素有 id 属性,则可以直接使用这个 id 变量名访问该元素

HTML 特性 和 DOM 属性

浏览器加载页面时,他会解析 HTML 并生成 DOM 对象,对于元素节点。大部分 HTML attributes 会变成 DOM 对象的 properties
如:标签有 id <body id="test">,那么 DOM 对象中就有 body.id="test"
大部分情况下会互相实时同步更新(例外:如 input.value 只能从特性同步到属性,反过来则不行),理解为有用户交互控制的不会从属性同步到特性(防止受控)

区别 1区别 2区别 3
HTML attributes大小写不敏感字符串使用 Element 的 getAttribute 等方法访问
DOM properties大小写敏感多种类型直接通过 Element 的属性访问

有些特性和属性的值不一样,如:

  • .getAttribute('href'):获取的是 HTML 中属性的原始值,因此可以精确地处理相对路径和没有协议的情况。
  • .href:获取的是解析后的完整 URL,通常包括协议和主机名等。

HTML 特性可以自定义任意名称

自定义特性可能在未来被 HTML 标准使用,但是以 data- 开头的特性都被保留可以安全使用,data- 后面的名称可以通过 elem.dataset.xxx 获取
像 data-my-state 这样的多词特性可以以驼峰式进行调用:dataset.myState


Document 和 Element 通用

都有的一些属性和方法

常用属性

  • children:子 元素节点
  • hidden:控制是否隐藏节点(类似 style=“display: none”)

常用方法

查询:

  • querySelector( css ):返回给定 CSS 选择器的第一个元素
  • querySelectorAll( css ):返回给定 CSS 选择器的所有元素,返回 静态的 NodeList(类数组对象)
  • getElementsByTagName( tag ):根据标签的名称获取元素节点(可以使用通配符( * )返回所有节点,返回 实时动态的 HTMLCollection)
  • getElementsByClassName( names ):根据类名获取元素节点(多个类名空格隔开,返回 实时动态的 HTMLCollection)

修改:

  • append( ...nodes or strings ):在节点里面的末尾 插入节点或字符串
  • prepend( ...nodes or strings ):在节点里面的开头 插入节点或字符串
  • before( ...nodes or strings ):在节点前面 插入节点或字符串
  • after( ...nodes or strings ):在节点后面 插入节点或字符串
  • replaceWith( ...nodes or strings ):替换为给定的节点或字符串
  • remove():移除节点

其他:

  • .cloneNode( bool ):克隆当前节点,true:深克隆,false:不克隆子元素

总结

搜索

方式documentelement类型
querySelectorcss 选择器静态
querySelectorAllcss 选择器静态
getElementByIdid静态
getElementsByTagNametag 或 *实时
getElementsByClassNameclass实时

写入

区别
innerHTML作为 HTML 写入
textContent作为 纯文本 写入

修改

区别
append / prepend …插入 DOM 节点 或 纯文本片段
insertAdjacentHTML作为 HTML 代码插入