当前位置: 首页 > backend >正文

第六章:事件风暴 · 用户的意志

剧情引入:风暴来袭

林昊穿越异步幻境后,眼前是一片混乱的城市,城市上空雷云密布——一场“事件风暴”正在爆发。

在这个世界,用户的每一次点击、每一个输入,都会召唤出一股能量。导师零号化身为“风暴记录员”,为林昊解锁新能力:“掌控用户的意志——事件系统。”


事件是什么?

事件是用户和网页之间的桥梁。比如:

  • 用户点击按钮 → click 事件
  • 用户在输入框打字 → input 事件
  • 鼠标移入移出 → mouseover、mouseout
  • 用户按键盘 → keydown、keyup

监听事件:addEventListener 的魔法咒语

林昊面前是一扇沉睡的大门,只有点击它,才能唤醒。

<button id="open">开启大门</button>
document.getElementById("open").addEventListener("click", function() {console.log("大门开启!");
});

使用 addEventListener(event, callback),可以监听各种用户操作。


常见事件类型速查表

事件类型名称场景
click点击点击按钮、链接等
input输入变化文本框输入时触发
submit提交表单表单点击提交按钮时触发
change变化下拉菜单、复选框等变化时
keydown按下键盘键盘交互
mouseover鼠标移入鼠标悬停在元素上

事件对象 Event Object:风暴的信息核心

当林昊触摸到按钮时,风暴中浮现一份情报——这是事件对象。

document.addEventListener("click", function(e) {console.log("你点击了:", e.target);console.log("事件类型:", e.type);console.log("坐标:", e.clientX, e.clientY);
});

e 是事件对象,包含当前事件发生的全部信息。


事件冒泡与阻止传播

风暴能量从内向外扩散,这就是事件冒泡(bubbling)。

HTML结构如下:

<div id="outer"><button id="inner">点我</button>
</div>

监听事件:

document.getElementById("outer").addEventListener("click", () => {console.log("外层被点");
});document.getElementById("inner").addEventListener("click", (e) => {console.log("内层被点");e.stopPropagation(); // 阻止冒泡
});

点击按钮时,如果不阻止传播,outer 也会触发。
使用 e.stopPropagation() 可中断风暴扩散。


事件委托:聚焦一点,管理全局

在风暴密集区域,不能为每一处都布控,导师教林昊使用“事件委托”:

HTML结构:

<ul id="menu"><li>苹果</li><li>香蕉</li><li>橙子</li>
</ul>

JS 只绑定在父元素上:

document.getElementById("menu").addEventListener("click", (e) => {if (e.target.tagName === "LI") {console.log("你选择了:" + e.target.innerText);}
});

高效、优雅,适用于动态添加的内容。


🧩 实战任务 · 小型风暴模拟器

  1. 写一个按钮点击后,控制台输出“按钮已被点击”;
  2. 给文本框添加 input 事件,实时打印用户输入内容;
  3. 给列表动态绑定点击事件,打印点击的列表项内容;
  4. 理解并演示事件冒泡和 stopPropagation 的效果;
  5. 实现一个“切换灯光”的按钮,点一下变亮,再点一下变暗。

🔮 预告:第七章《组件之城》

当事件风暴平息,林昊即将踏入传说中的“组件之城”,学习如何将页面拆分成可复用、模块化的组件单位——那是前端开发者构建世界的真正方式!

http://www.xdnf.cn/news/8482.html

相关文章:

  • VKontakte(VK)注册教程
  • 什么是图神经网络?它用来解决什么问题?它有什么优势?
  • ROS合集(六)SVIn2 点云地图与 3D Tiles 可视化【预览版】
  • [原理理解] 基于diffusion的超分任务时候遇到的CLIPTokenizer和CLIPTextModel
  • facebook开源Triton编写GPU内核的编程模型速读:KernelLLM
  • Python 中的多线程与多进程:真假并行的直观对比
  • synchronized 实现原理
  • 20250523-关于Unity中的GUID简介(未完待续)
  • Ntfs!FindFirstIndexEntry函数中ReadIndexBuffer函数的作用是新建一个Ntfs!_INDEX_LOOKUP_STACK结构
  • Kotlin-数组,集合类以及序列
  • 解决MybatisPlus使用Druid1.2.11连接池查询PG数据库报Merge sql error的一种办法
  • 豆瓣的 PyPI 源关闭后替代方案
  • 怎样判断服务器网络质量的状态?
  • 【博客系统】博客系统第四弹:令牌技术
  • 亚马逊跨境战:解码退货率管控的底层逻辑与战术拆解
  • 论文解读: 2023-Lost in the Middle: How Language Models Use Long Contexts
  • Java与Go差别在哪
  • **代换积分法**或**变量替换法**)
  • 【论文阅读】Stop Overthinking:高效大模型推理技术综述
  • 26考研|高等代数:λ-矩阵
  • 07_分类器不确定评估
  • 京东外卖分润系统部署实操!0门槛入驻+全平台接入+自定义比例...这些人,赚翻了!
  • Terraform本地windows部署
  • 安全生态与职业跃迁
  • 相机--基础
  • [Datagear] 实现按月颗粒度选择日期的方案
  • 精益数据分析(81/126):从Timehop案例看病毒性增长的黑客式策略
  • 数据的获取与读取篇---获取数据
  • 客服中心大模型应用演进路线:从传统服务到超级智能助手的转型
  • leetcode513. 找树左下角的值:层序遍历中的深度与顺序控制之道