DOM 把 HTML 解析成一棵可编程的树(JS 的手能摸到的界面),Ajax 让页面不换页也能偷偷跟服务器要数据——两者合体,网页从「文档」进化成「应用」。
上游:6-1 的 HTML 骨架、6-5 的动态网站;网络课 4.10 讲过「Web 应用」概念。下游:6-8 的 jQuery 是 DOM 操作的语法糖、虚拟 DOM 是它的性能补丁。
一、DOM:界面成了一棵树
DOM(Document Object Model,文档对象模型)=浏览器把 HTML 解析成的对象树:
document
└── html
├── head
│ └── title
└── body
├── h1 "成绩单"
└── table
└── tr
├── td "波仔"
└── td "88"
每个标签、属性、文字都是节点对象,JS 可以查、改、增、删:
// 浏览器 F12 控制台即可运行
document.title = "新标题"; // 改:标签页名字立刻变
const p = document.createElement("p"); // 建:新节点
p.textContent = "JS 动态添加的一行";
document.body.appendChild(p); // 挂:上树,页面立刻多一段
document.querySelector("h1").style.color = "red"; // 查+改样式
- 为什么树:嵌套标签天然是层次;树的遍历(4-16 DFS)就在渲染引擎里天天跑。
- 重排(reflow):改尺寸布局会触发浏览器重算整棵树——DOM 操作贵,这是 6-8 虚拟 DOM 存在的理由。
二、Ajax:不换页的悄悄话
2005 年前的 Web:每次点链接/交表单都整页刷新,白屏一闪。Ajax(Asynchronous JavaScript and XML)让 JS 在后台发 HTTP 请求、拿到数据后用 DOM 局部更新——页面不闪、不用重载:
旧:点击 → 整页请求 → 白屏 → 新整页
新:点击 → JS 后台要数据 → 回来后 DOM 只改那一块
现代写法是 fetch(Ajax 思想的今日语法):
// 点按钮 → 后台要数据 → 局部刷新(在 F12 控制台或本地页面跑)
async function loadScore() {
const resp = await fetch("score.json"); // 后台 GET,不换页
const data = await resp.json(); // 解析 JSON(6-9)
document.querySelector("#score").textContent =
`波仔:${data.score} 分`; // 只改这一个节点的文字
}
document.querySelector("button").addEventListener("click", loadScore);
Ajax 的时代意义:Gmail、Google 地图(2004~2005)靠它做出了「像软件一样」的网页——SPA(单页应用)、前后端分离(界面 JS 写、数据走接口)都由此生。
三、两者如何配合
Ajax 是运输队(拿数据),DOM 是施工队(改界面):数据到手 → querySelector 定位节点 → 改内容/样式。6-6 的 MVVM 框架把这两步自动化,但底层仍是它们。
动手 Demo:整页刷新 vs Ajax 局部刷新,亲手对比
<!-- demo_ajax.html:两个按钮,体验两种刷新 -->
<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title>Ajax 对比</title></head>
<body>
<div id="box">初始内容</div>
<button onclick="location.reload()">① 整页刷新</button>
<button onclick="localUpdate()">② 局部更新(Ajax 式)</button>
<script>
function localUpdate() {
// 没有服务器就用本地数据模拟「请求返回」
const data = { time: new Date().toLocaleTimeString() };
document.getElementById("box").textContent =
"局部更新于 " + data.time; // 只有 #box 变,页面不闪
}
</script>
</body></html>
看到什么算成功:点①整页白屏一闪(F12 网络面板多一条文档请求);点②只有那行字变、页面纹丝不动(网络面板零请求——本地模拟了返回数据)。
读结果:把「本地模拟返回」换成 fetch("...") 就是真 Ajax;把「只改 #box」换成换页,就是老 Web。应用感的差距全在这两处。
30 秒实验
F12 → 控制台跑 document.querySelectorAll("*").length——数一数当前页面有多少 DOM 节点(几百到几千都正常)。再跑 document.body.appendChild(document.createElement("div"))——看不到变化?节点上树了但是空的;给它 textContent 才看得见。树上的每个节点都是活的、可编程的。
常见误区
- 「DOM 是 HTML」——HTML 是文本,DOM 是解析后的对象树;JS 摸不到文本,摸到的是树。
- 「Ajax 就是一段时间前的技术已过时」——
fetch/axios 全是 Ajax 思想的现代包装;「不换页拿数据」至今是 Web 应用的呼吸方式。 - 「操作 DOM 很廉价」——每次改动都可能触发重排重绘,循环里上千次appendChild 是性能事故高发区——框架虚拟 DOM 就为此而生(6-8)。
自测三问(点击展开)
1. **DOM 是什么、什么结构?** 答:文档对象模型——浏览器把 HTML 解析成的对象树,JS 通过它读写界面。 2. **Ajax 解决什么问题?** 答:不用整页刷新,后台要数据+DOM 局部更新。 3. **为什么说 DOM 操作昂贵?** 答:改动会触发重排/重绘,浏览器要重算布局;大量操作应批量化或交给虚拟 DOM。- ☑ 6-7 完成 —— 界面成树、悄悄话运数据:DOM+Ajax
- ☐ 下一节 6-8 jQuery、虚拟DOM
相关笔记
- 网络 4.10 · Web应用 —— 「网页变应用」的概念篇
- MVVM —— 把本篇两步自动化的上层框架
- 树的遍历 —— 渲染引擎遍历的就是这棵树
- ⌨️ 编程原理 · 索引 —— 全课路线图