DOM 就是浏览器把 HTML 解析成的一棵树,JS 通过这棵树找到页面上的每个元素。
核心三个:
① document——树根,所有节点的祖先
② 五类节点——文档、元素、属性、文本、注释
③ nodeType——1 是元素、3 是文本
坑:textContent 和 innerHTML 区别、空白也是文本节点、节点不是元素。
点按钮: 左边树会逐层点亮, 下面同步显示代码与结论。
网页刚打开时,浏览器把你写的 HTML 标签,自动摆成一棵树。"节点"就是这棵树上的一个枝桠——一个标签是一个枝,一段文字也是一个小枝。有了这棵树,JS 才找得到、改得动页面上的东西。
// 一棵最简单的树,从上往下长这样: // document(老祖宗) // └─ html(第一个孩子) // ├─ head(管标题、样式) // └─ body(管你看得见的内容) // └─ p(里面装着文字"你好") // 整棵树的老祖宗,打出来看看 console.log(document); // 顺着老祖宗,找到 html 这个枝 console.log(document.documentElement); // 再往下,找到 body 这个枝 console.log(document.body);
树上的枝不全是标签,一共五种。浏览器给每种枝发了一个编号(叫 nodeType),记住下面这张表就行:
| 枝的种类 | 编号 nodeType | 通俗例子 |
|---|---|---|
| 文档枝(老祖宗) | 9 | document,整份网页的根 |
| 元素枝(标签) | 1 | <div>、<p>、<a> 这些标签 |
| 文字枝 | 3 | 标签里写的字、连换行空格都算 |
| 属性枝 | 2 | 标签上的 id、class、src |
| 注释枝 | 8 | <!-- 我是注释 --> |
// 拿到一个枝,问它"你是几号",就知道你是哪种枝
// 抓到页面上那个 .demo 的盒子
let demo = document.querySelector('.demo');
// 问它编号:1 就说明它是个标签(元素枝)
console.log(demo.nodeType);
// 问它是什么标签名:这里是 "DIV"
console.log(demo.nodeName);
为什么老有看不见的空格枝?如果你写代码时标签之间换了行、加了空格,浏览器会把这些空白也当成"文字枝(编号3)"挂在树上。如果你取孩子时发现"怎么多出来几个空东西",因为那些就是空白文字枝,不是出错。
① 用在哪:页面初始化时先确认元素找没找对(打印 nodeType/nodeName);写组件时判断节点类型。
② 常见坑:以为拿到的一定是标签,结果取到空白文字枝,操作报错。
③ 怎么解决:用 nodeType === 1 判断是不是标签,用 nodeName 看标签名,先打印确认再操作。
| API | 作用 | 参数 | 返回值 | 代码示例 |
|---|---|---|---|---|
| document | 整棵 DOM 树的老祖宗 | 无 | 文档对象 | console.log(document.title); |
| document.documentElement | 拿到 html 这个枝 | 无 | html 元素 | console.log(document.documentElement.nodeName); |
| document.body | 拿到 body 这个枝 | 无 | body 元素 | document.body.style.background = '#eee'; |
| 元素.nodeType | 问这个枝是几号 | 无 | 数字(标签1/文字3/文档9) | console.log(el.nodeType); |
| 元素.nodeName | 问这是什么标签 | 无 | 大写标签名 | console.log(el.nodeName); |
| querySelector() | 抓到第一个匹配元素 | CSS 选择器 | 元素或 null | let el = document.querySelector('#box'); |