首页
/ Web-Dev-For-Beginners Terrarium 第三部分作业指南:如何完成「DOM 接口调查」并写出一份 300–500 词的技术分析

Web-Dev-For-Beginners Terrarium 第三部分作业指南:如何完成「DOM 接口调查」并写出一份 300–500 词的技术分析

2026-09-06 20:48:04作者:廉皓灿Ida

这篇指南聚焦于 Web-Dev-For-Beginners 课程 Terrarium(生态瓶)项目第三课之后的进阶作业——「DOM 元素调查(DOM Element Investigation)」。读完后,你将掌握一套完整的 DOM 接口研究方法:如何从 MDN 的 DOM 接口清单中按能力分层挑选合适的接口、如何围绕"技术概述—真实网站实现—代码演示"三条主线组织 300–500 词的技术分析,并能在 Terrarium 项目已有的拖拽代码之上复用一个接口的实战案例。

Terrarium 课程中的 DOM 树结构示意图

完成拖拽交互后的 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

  1. Document.getElementById()(元素选取)script.js 第 3–16 行plant1plant14 共 14 株植物逐一调用 document.getElementById('plantN'),把元素引用传给 dragElement()。课程 README 特别解释了为什么用 ID 而不是 class:ID 为单个元素提供唯一标识,当 JavaScript 需要操纵具体元素时,ID 提供了精确性和性能。
  2. Pointer Events(事件处理)script.js 第 31–41 行的 pointerDragpointerdown 触发时调用 e.preventDefault() 阻止浏览器默认的文本选中行为,记录 e.clientX / e.clientY 起始坐标,并把 pointermove / pointerup 监听器挂到 document 上——挂到 document 是为了鼠标移出植物元素后拖拽依然连续。
  3. Element.styleoffsetTop / offsetLeft(属性访问)script.js 第 43–57 行的 elementDragpos3 - e.clientX 等差值计算位移,再写回 terrariumElement.style.topstyle.left。这里能生效的前提在 solution/style.css 中:.plant 声明了 position: absolute(第 33–38 行),且 offsetTop / offsetLeft 是相对于最近的定位祖先元素(.plant-holder 声明了 position: relative)计算的——这正是作业要求你"解释接口解决的问题"时可以展开的原理细节。
  4. <script defer>(脚本加载时序)solution/index.html 第 13 行 使用 <script src="./script.js" defer></script>,保证脚本等 HTML 解析完毕后才执行,避免"JS 先于元素就绪"的时序错误。
  5. 闭包封装的私有状态script.js 第 23–64 行的 dragElement 为每株植物创建独立的 pos1pos4 私有变量,pointerDragelementDragstopElementDrag 三个内部函数共享这套状态——这是"每个元素独立记忆自己的坐标"的实现基础。

调研接口时,把上面这份清单当作参照系:你选的接口是在替换/补充其中某一个,还是引入了全新的能力维度?这个判断直接决定作业"实际应用"一节的写法。

第二步:研究与文档撰写——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 读出),以及事件监听的追加式用法(addEventListenerscript.js 第 61–62 行 直接赋值式 onpointerup = null 清理的对照——前者可挂多个监听器,后者后赋值会覆盖前值)。选择 MutationObserverIntersectionObserver 的读者,可仿照同样"场景先行、逐行注释、绑定 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"的延伸学习目标。

登录后查看全文
热门项目推荐
相关项目推荐