module 05 · javascript dom 与交互 · 第 33–38 课

模块05
JavaScript DOM 与交互

目标一句话:让页面「动起来」—— 找到元素、响应操作、管好数据,做出真实可用的交互应用。

1 课找到元素并改内容:DOM 树 · querySelector · 读写属性
1 课响应用户:事件监听 · 事件对象 · 事件委托
1 课控制状态:classList · CSS 变量 · 暗黑模式
2 课数据驱动视图:动态渲染列表 · 表单校验 · localStorage
1 课阶段实战:待办清单(增删改查 + 筛选 + 持久化)

// module 05

模块五 · JavaScript DOM 与交互 · 第 33–38 课

33DOM 入门找到元素 / 改内容
34事件处理监听 / 冒泡 / 委托
35样式与类操作classList / 暗黑模式
36动态创建与表单交互渲染列表 / 校验
37数据与状态localStorage / 重渲染
38阶段实战五:待办清单一个像真产品的应用

// 模块五 · 第 33 课

DOM 入门

讲授 · 25 min

  • DOM 树与节点关系(父 / 子 / 兄弟)
  • document.querySelector / querySelectorAll
  • 读写内容:textContent / innerText / innerHTML 的区别与风险
  • 读写属性:getAttribute / setAttribute / dataset

练习 · 15 min

用 JS 读取并修改页面上 5 个元素:改标题文字、改图片 src、改链接 href、给卡片加一个 data 属性、批量把所有列表项加上序号前缀。

验收:能用 querySelector 选中带类名和带 id 的元素;知道 querySelectorAll 返回的不是数组。

// 模块五 · 第 34 课

事件处理

讲授 · 25 min

  • addEventListener(类型, 回调)
  • 常见事件:click / input / change / submit / mouseenter / keydown
  • 事件对象:event.target / value / key · preventDefault()
  • 事件冒泡与事件委托(在父元素上监听)

练习 · 15 min

① 输入框实时字数统计;② 表单提交时阻止默认跳转并校验必填项、给错误提示;③ 用事件委托给一个列表的所有项(含后来新增的项)绑定点击。

验收:能解释为什么循环绑定事件不如委托一次;提交后页面不刷新。

// 模块五 · 第 35 课

样式与类操作

讲授 · 25 min

  • element.style.xxx 与 CSS 属性名的驼峰转换
  • classList.add / remove / toggle / contains(推荐用法)
  • dataset 读写 data-* · JS 设置 CSS 变量(setProperty)
  • getComputedStyle 读取最终样式 · 配合 transition 做过渡

练习 · 15 min

① 实现「暗黑模式切换」按钮:切换 <body> 上的类名 + 用 CSS 变量换色;② 做一组标签,点击切换选中态(只允许一个选中)。

验收:样式写在 CSS 里,JS 只负责切类名;切换主题后刷新页面样式仍正确。

核心原则:JS 只负责「切类名」,样式规则留在 CSS 里。

// 模块五 · 第 36 课

动态创建与表单交互

讲授 · 25 min

  • createElement / append / insertBefore / remove
  • 用模板字符串批量渲染列表(与 createElement 的取舍)
  • 表单校验:必填、长度、正则初识 · trim() 去空格
  • 错误提示的呈现方式 · 简单防抖思路

练习 · 15 min

实现「动态留言板」:输入 → 添加 → 删除;空输入拒绝提交,超过 100 字提示,新留言出现在列表最前面。

验收:新元素确实插入了 DOM(不是只创建了对象);重复提交不会重复绑事件。

// 模块五 · 第 37 课

数据与状态

讲授 · 25 min

  • localStorage.setItem / getItem / removeItem 与 JSON 配合
  • 数据与视图分离:改数据 → 重新渲染 → 更新 DOM
  • 数组筛选与搜索(filter + includes)
  • 渲染函数拆分(renderList / renderCount)· 简单模块化

练习 · 15 min

给第 36 课的留言板加两个能力:① 刷新页面数据还在(localStorage);② 顶部搜索框能按关键词筛选留言。

验收:存的是字符串不是对象;刷新后列表与计数一致;搜索时删除功能仍正常。

// 模块五 · 第 38 课 · 阶段实战

阶段实战五 · 待办清单

功能拆解 · 45 min

  • 新增 / 删除 / 编辑任务文字
  • 勾选完成 / 全部-未完成-已完成 三种筛选
  • 剩余未完成数量计数
  • localStorage 持久化 · 刷新不丢数据

验收标准

  • 七个功能全部可用,无 console 报错
  • 刷新后数据与勾选状态保留
  • 使用事件委托处理列表交互
  • 渲染逻辑集中在一个 render 函数里

这个应用可以作为结课作品的「作品展示」区块——它足够小,也足够完整。

// module 05 · summary

本模块交付物 · 待办清单

交付物

  • todo.html —— 完整可用的待办应用
  • 七个功能:增 / 删 / 改 / 勾选 / 筛选 / 计数 / 持久化
  • 集中的 render() 渲染函数

验收标准

  • 功能全部可用,无 console 报错
  • 刷新后数据与勾选状态保留
  • 使用事件委托处理列表交互
  • 渲染逻辑集中在一个函数里

这个应用足够小,也足够完整 —— 可以直接放进结课作品的「作品展示」区块。

S 演讲者视图 · T 切换主题 · ← → 翻页 · F 全屏 · O 总览 · R 重置计时