Web-Dev-For-Beginners Terrarium 第三部分作业指南:如何完成「DOM 接口调查」并写出一份 300–500 词的技术分析
这篇指南聚焦于 Web-Dev-For-Beginners 课程 Terrarium(生态瓶)项目第三课之后的进阶作业——「DOM 元素调查(DOM Element Investigation)」。读完后,你将掌握一套完整的 DOM 接口研究方法:如何从 MDN 的 DOM 接口清单中按能力分层挑选合适的接口、如何围绕"技术概述—真实网站实现—代码演示"三条主线组织 300–500 词的技术分析,并能在 Terrarium 项目已有的拖拽代码之上复用一个接口的实战案例。
作业的定位:从"会拖拽"走向"理解 DOM 接口生态"
第三课(Terrarium 第三部分 README)带领你用原生 JavaScript 完成了可拖拽植物页面:通过 document.getElementById() 选取元素、用 dragElement() 闭包为每株植物维护独立的坐标状态、以 Pointer Events 驱动拖拽生命周期。而本作业(英文原版作业)要求你"领养"一个 DOM 元素——从浏览器暴露的众多 DOM 接口中自选其一做深入调研,把课堂所学的单一拖拽场景推广到更广阔的 DOM 交互世界。
作业给出的学习目标共有四项,也是完成度检查的基准:
- 调研(Research):深入理解某一个具体的 DOM 接口;
- 分析(Analyze):剖析真实网站中 DOM 操作的实际实现;
- 联结(Connect):把理论概念对应到实际应用场景;
- 输出(Develop):锻炼技术文档撰写与分析能力。
作业的核心指令(印地语译版 assignment.hi.md 与英文版一致)是:打开 MDN 的「DOM 接口清单」(Document Object Model 参考页),选定一个接口,找到某个网站正在使用它的证据,并撰写一段说明它"如何被使用"的分析短文。下文按作业原定的三步流程展开。
第一步:按能力分层选择一个 DOM 接口
作业要求你访问 MDN 的 DOM 接口综合清单后自选接口,并为了避免大家选题雷同,明确给出了三个难度分层的候选清单:
入门级(Beginner-Friendly):
| 接口 | 用途 |
|---|---|
Element.classList |
动态管理 CSS 类 |
Document.querySelector() |
高级元素选取 |
Element.addEventListener() |
指针事件之外的事件处理 |
Window.localStorage |
客户端本地数据持久化 |
进阶级(Intermediate):
| 接口 | 用途 |
|---|---|
Intersection Observer API |
检测元素可见性 |
MutationObserver |
监听 DOM 变更 |
Drag and Drop API |
拖放方案(与课程所用的指针事件方案互为替代) |
Geolocation API |
获取用户地理位置 |
探索级(Advanced):
| 接口 | 用途 |
|---|---|
Web Components |
自定义元素与 Shadow DOM |
Canvas API |
程序化图形绘制 |
Web Workers |
后台线程处理 |
Service Workers |
离线功能 |
选题建议:如果你只想交一份"达标"作业,选入门级即可快速上手;如果想冲"优秀"档评分,进阶级接口更容易写出有深度的真实案例分析(例如 Kanban 看板用 Drag and Drop API、长列表用 IntersectionObserver 懒加载)。
选题前先看:Terrarium 项目自己用掉了哪些 DOM 接口
在动手调研之前,值得先盘点一下本仓库解决方案里已经出现的 DOM 接口——它们既是课堂知识,也是你作业中"与 Terrarium 项目对比"这一评分点的现成素材。完整实现见 solution/script.js:
Document.getElementById()(元素选取):script.js 第 3–16 行 对plant1到plant14共 14 株植物逐一调用document.getElementById('plantN'),把元素引用传给dragElement()。课程 README 特别解释了为什么用 ID 而不是 class:ID 为单个元素提供唯一标识,当 JavaScript 需要操纵具体元素时,ID 提供了精确性和性能。- Pointer Events(事件处理):script.js 第 31–41 行的
pointerDrag在pointerdown触发时调用e.preventDefault()阻止浏览器默认的文本选中行为,记录e.clientX/e.clientY起始坐标,并把pointermove/pointerup监听器挂到document上——挂到 document 是为了鼠标移出植物元素后拖拽依然连续。 Element.style与offsetTop/offsetLeft(属性访问):script.js 第 43–57 行的elementDrag用pos3 - e.clientX等差值计算位移,再写回terrariumElement.style.top和style.left。这里能生效的前提在 solution/style.css 中:.plant声明了position: absolute(第 33–38 行),且offsetTop/offsetLeft是相对于最近的定位祖先元素(.plant-holder声明了position: relative)计算的——这正是作业要求你"解释接口解决的问题"时可以展开的原理细节。<script defer>(脚本加载时序):solution/index.html 第 13 行 使用<script src="./script.js" defer></script>,保证脚本等 HTML 解析完毕后才执行,避免"JS 先于元素就绪"的时序错误。- 闭包封装的私有状态:script.js 第 23–64 行的
dragElement为每株植物创建独立的pos1–pos4私有变量,pointerDrag、elementDrag、stopElementDrag三个内部函数共享这套状态——这是"每个元素独立记忆自己的坐标"的实现基础。
调研接口时,把上面这份清单当作参照系:你选的接口是在替换/补充其中某一个,还是引入了全新的能力维度?这个判断直接决定作业"实际应用"一节的写法。
第二步:研究与文档撰写——300–500 词分析的三段式结构
作业规定分析短文长度为 300–500 词,并强制要求覆盖三个板块。逐条拆解如下:
板块一:Technical Overview(技术概述)
需要完成三个动作:
- 定义(Define):用初学者能听懂的语言说明这个接口做什么;
- 解释(Explain):列出它提供的关键方法、属性或事件;
- 描述(Describe):说明它被设计来解决哪类问题。
写作提示(作业"写作指南"部分给出):用自己的话而非照抄文档;把概念当成"教给一位朋友"来讲解;给出具体例子与代码片段;把你的接口放到更广泛的 Web 开发概念中定位。
板块二:Real-World Implementation(真实网站实现)
这是拉开评分差距的板块,作业要求:
- 找到(Find):一个真实使用该接口的网站——可以通过浏览器开发者工具审查其代码,或检索公开示例;
- 记录(Document):尽可能附上具体实现的代码片段;
- 分析(Analyze):开发者为什么选择这种方案;
- 解释(Explain):它如何提升了用户体验。
注意评分标准里对"真实案例分析"的分级:优秀档要求"识别并彻底分析真实实现且给出具体例子",而"联系模糊或不准确"直接落入最低档。所以"找到某个网站的开发者工具证据"这一步不要省。
板块三:Practical Application(实际应用)
- 对比(Compare):把选定的接口与 Terrarium 项目已使用的技术(指针事件拖拽、闭包坐标追踪、
getElementById选取)做对比; - 建议(Suggest):说明该接口如何增强或扩展 Terrarium 的功能;
- 识别(Identify):指出该接口在其他项目中同样有价值的应用场景。
例如选择 Window.localStorage 时,对比点就非常自然:课程 README 的"创意扩展"里就明确列出了"用 localStorage 实现一个保存功能,记住植物的位置";你只需说明 localStorage 解决的是"刷新后状态丢失"这一指针事件方案完全不涉及的持久化问题。
第三步:写一个可运行的代码示例
作业要求提交一份演示所选接口的代码示例,并给出四条硬性标准:
- 可用(Functional):代码实际测试后必须能跑;
- 有注释(Commented):解释每一部分的作用;
- 相关(Relevant):对应一个真实的使用场景;
- 新手友好(Beginner-friendly):正在学习 Web 开发的人能读懂。
作业"代码示例思路"部分建议:做一个展示接口核心特性的简单 demo;在相关处基于 Terrarium 项目概念进行扩展;功能优先于视觉设计;提交前务必自测。下面是一个符合全部四条标准、且正好落在入门级候选清单里的完整示例——用 localStorage 为 Terrarium 植物位置做持久化(可直接追加到 solution/index.html 引用的 script.js 末尾运行):
// 场景:页面刷新后,植物回到用户上次摆放的位置
// 1. 读取:JSON.parse 把字符串还原为 { plant1: {top, left}, ... } 对象
const saved = JSON.parse(localStorage.getItem('terrariumPositions') || '{}');
// 2. 恢复位置:仅恢复保存过的植物,style.top/left 需要带 'px' 单位
Object.keys(saved).forEach((id) => {
const el = document.getElementById(id);
if (el && saved[id]) {
el.style.top = saved[id].top;
el.style.left = saved[id].left;
}
});
// 3. 保存:在 pointerup 之后把当前 14 株植物的位置写回 localStorage
function savePositions() {
const positions = {};
for (let i = 1; i <= 14; i++) {
const el = document.getElementById('plant' + i);
// 记录 CSS 定位值(字符串),而不是 offsetTop(数字),避免单位丢失
positions['plant' + i] = { top: el.style.top, left: el.style.left };
}
localStorage.setItem('terrariumPositions', JSON.stringify(positions));
}
// 4. 把保存动作挂到 document 的 pointerup 上,作为拖拽结束后的收尾
document.addEventListener('pointerup', savePositions);
这个示例同时演示了入门级的 Document.querySelector() 家族(getElementById)、Window.localStorage 的读写对称(JSON.stringify 写入 / JSON.parse 读出),以及事件监听的追加式用法(addEventListener 与 script.js 第 61–62 行 直接赋值式 onpointerup = null 清理的对照——前者可挂多个监听器,后者后赋值会覆盖前值)。选择 MutationObserver 或 IntersectionObserver 的读者,可仿照同样"场景先行、逐行注释、绑定 Terrarium"的思路组织自己的示例。
提交格式:按固定模板组织文档
作业要求提交内容使用清晰标题结构,模板如下(提交时把方括号内容替换为实际内容):
# [接口名] DOM Investigation(接口名 + DOM 调查)
## What It Does(它做什么)
[技术概述]
## Real-World Example(真实案例)
[网站分析与实现细节]
## Code Demonstration(代码演示)
[带注释的可运行示例]
## Reflection(反思)
[与 Terrarium 项目的关联及未来应用]
评估标准:五个维度对照定级
作业给出的完整评分表(Exemplary A / Proficient B / Developing C / Needs Improvement D 四档):
| 评分维度 | 优秀 (A) | 熟练 (B) | 发展中 (C) | 需改进 (D) |
|---|---|---|---|---|
| 技术理解 | 理解深入,解释准确,术语使用规范 | 理解扎实,解释大体准确 | 基础理解,存在部分误解 | 理解有限,错误明显 |
| 真实案例分析 | 识别并彻底分析真实实现,有具体例子 | 找到真实案例,分析充分 | 找到了案例但分析缺乏深度 | 真实联系模糊或不准确 |
| 代码示例 | 代码可运行、注释完善、清晰演示接口 | 代码功能正常,注释充分 | 代码能跑但文档化不足 | 代码有错误或解释混乱 |
| 写作质量 | 表达清晰有吸引力,结构与技术沟通规范 | 组织良好,技术写作得当 | 组织与清晰度尚可 | 组织差或表达不清 |
| 批判性思维 | 在概念间建立洞见性联系,提出创新性应用 | 分析能力强,关联贴切 | 有一定分析但可以更深入 | 批判性思维证据有限 |
需要注意一个关键细节:这份作业的评估明确以"是否带示例"为分水岭——印地语译版 assignment.hi.md 保留的简版评分表把"优秀(Exemplary)"定义为"提交了带示例的短文","够用(Proficient)"是"提交了不带示例的短文","需改进"则是"未提交任何写稿"。也就是说,哪怕分析篇幅不长,只要附上可运行的代码示例与真实网站证据,评分上限就完全不同。
研究策略与写作技巧清单
作业原文最后给出的三条清单,这里完整保留供自查:
研究策略:
- 从 MDN 文档起步,获取权威信息;
- 查找 代码示例(课程原文建议在 GitHub 或 CodePen 上找);
- 检查 主流网站——用浏览器开发者工具直接看它们的 DOM 与事件监听;
- 观看 教程视频获得可视化讲解。
写作指南:
- 使用 自己的话,而非复制文档;
- 包含 具体示例与代码片段;
- 像 教朋友一样解释技术概念;
- 把 接口与更广泛的 Web 开发概念联系起来。
代码示例思路:
- 创建 一个展示接口核心特性的简单 demo;
- 在 相关处基于 Terrarium 项目概念构建;
- 关注 功能而非视觉设计;
- 测试 代码确保其正确运行。
完成前自查与仓库阅读路径
提交前对照自查:分析是否覆盖"技术概述 / 真实案例 / 实际应用"三板块且落在 300–500 词内;代码示例是否真实可运行且逐段有注释;是否完成与 Terrarium 拖拽方案(指针事件 + 闭包坐标追踪)的对比;提交文档是否遵循四段式标题模板。
建议按以下顺序浏览本仓库文件以完成作业:
| 文件 | 用途 |
|---|---|
| 3-terrarium/3-intro-to-DOM-and-closures/README.md | 第三课正文:DOM 树、闭包、拖拽生命周期与事件选型表 |
| 3-terrarium/3-intro-to-DOM-and-closures/assignment.md | 本作业英文原版全文(含提交模板与完整评分表) |
| 3-terrarium/solution/script.js | 可拖拽植物完整实现,dragElement 闭包与三个内部函数 |
| 3-terrarium/solution/index.html | 14 株植物的页面结构与 defer 脚本加载 |
| 3-terrarium/solution/style.css | position: absolute / position: relative 定位上下文,理解 offsetTop 参照系 |
| 3-terrarium/README.md | Terrarium 项目部署说明(Azure Static Web Apps),可作发布练习 |
把"选定接口 → 找出真实网站证据 → 写出对比 Terrarium 的分析 → 附上可运行示例"这条主线走完,你就同时完成了本作业与第三课 README 中"探索现代 DOM API"的延伸学习目标。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0624
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00

