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

红宝书第二十三讲:详解DOM事件模型:冒泡与事件委托


红宝书第二十三讲:详解DOM事件模型:冒泡与事件委托

资料取自《JavaScript高级程序设计(第5版)》。
查看总目录:红宝书学习大纲


一、事件冒泡:从“子”到“父”的传递过程

当点击一个元素时,事件会从最深层元素逐级向上传递到根节点,即 事件冒泡12
类比:石头扔进水里,波纹从中心扩散到外围。

在这里插入图片描述

代码验证:点击子元素触发父元素监听
<div id="parent">
  父元素
  <button id="child">子按钮</button>
</div>

<script>
  document.getElementById('parent').addEventListener('click', () => {
    console.log('父元素被触发了!'); // 点击按钮时会打印
  });
</script>

二、事件对象的关键属性

事件处理函数的参数 event 包含关键属性:

  • target → 实际触发事件的元素(如点击的按钮)3
  • currentTarget → 当前正在处理事件的元素(如父元素)1
  • stopPropagation() → 阻止事件继续冒泡1
parent.addEventListener('click', (e) => {
  console.log('实际触发者:', e.target.id); // 输出 'child'
  console.log('当前处理者:', e.currentTarget.id); // 输出 'parent'
  e.stopPropagation(); // 阻止冒泡到更高层
});

三、事件委托:用“父级代理”子级的事件

场景:列表中有多个子项需要点击处理。
传统方式 → 为每个子项绑定事件(性能差)2
事件委托 → 利用冒泡,只在父级绑定一个事件2

示例:点击任意列表项时打印内容
<ul id="list">
  <li data-action="go">去学习</li>
  <li data-action="eat">去吃饭</li>
  <li data-action="sleep">去睡觉</li>
</ul>

<script>
  document.getElementById('list').addEventListener('click', (e) => {
    const action = e.target.dataset.action;
    if (action) {
      console.log('执行操作:', action); // 点击任意li触发
    }
  });
</script>

优点:动态新增子项无需重新绑定事件,节省内存2


四、event.preventDefault() VS event.stopPropagation()
  • preventDefault()阻止默认行为(如点击链接不跳转)1
  • stopPropagation()阻止冒泡(父元素不再触发)1
document.querySelector('a').addEventListener('click', (e) => {
  e.preventDefault(); // 阻止跳转
  e.stopPropagation(); // 防止父元素的事件被触发
});

目录:总目录
上篇文章:红宝书第二十二讲:详解JavaScript类型化数组与二进制数据处理
下篇文章:红宝书第二十四讲:详解BOM对象:window、location、history

脚注


  1. 《JavaScript高级程序设计(第5版)》中的事件对象属性表解释了bubblesstopPropagation() ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  2. 《JavaScript高级程序设计(第5版)》通过父元素代理处理多个子项事件示例说明事件委托 ↩︎ ↩︎ ↩︎ ↩︎

  3. 《JavaScript高级程序设计(第5版)》代码显示通过event.target区分事件源 ↩︎

相关文章:

  • QCustomPlot拖动绘制变慢问题解决方案
  • LM2576手册解读:高效降压型 DC - DC 转换器的全面解析
  • LabVIEW故障诊断数据处理方法
  • Elasticsearch 基本概念与增删改查
  • 【FreeRTOS】裸机开发与操作系统区别
  • 整数二分·二分的思想与模板·经典二分题:数的范围
  • 面基:雪花算法Snowflake时钟回拨问题解决方案
  • Redis 服务端主动回收配置
  • 项目实战 - 用户列表
  • AIP-203 域行为文档
  • MyBatis执行批量插入sqlserver报错:不允许从数据类型 varbinary 到 datetime2 的隐式转换
  • PowerBi 桑基图(SanKey)显示多节点的解决方法
  • 数据结构与算法基本概念
  • 使用大语言模型进行Python图表可视化
  • 【质量管理】质量的系统是预防,那以预防为主的质量管理系统包括什么?
  • 【QT】练习1
  • 里昂惕夫矩阵:投入产出分析
  • element-plus走马灯(el-carousel)不显示问题
  • 【数论3】裴属定理与扩展欧几里得算法
  • naive_admin项目实战03 基于Go语言的后端
  • 县政府网站加强制度建设/鸿星尔克网络营销案例分析
  • wordpress 设置404页面模板/seo是一种利用搜索引擎的
  • 南昌百恒信息技术有限公司/如何推广seo
  • 施工企业承揽业务不良行为/优化大师怎么卸载
  • 免费网站的app/优化算法
  • 网站的外链是怎么做的/google搜索关键词