惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

The GitHub Blog
The GitHub Blog
S
SegmentFault 最新的问题
MyScale Blog
MyScale Blog
有赞技术团队
有赞技术团队
V
Visual Studio Blog
T
The Blog of Author Tim Ferriss
爱范儿
爱范儿
Vercel News
Vercel News
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Y
Y Combinator Blog
Blog — PlanetScale
Blog — PlanetScale
D
DataBreaches.Net
美团技术团队
Microsoft Security Blog
Microsoft Security Blog
大猫的无限游戏
大猫的无限游戏
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
酷 壳 – CoolShell
酷 壳 – CoolShell
GbyAI
GbyAI
A
About on SuperTechFans
云风的 BLOG
云风的 BLOG
The Cloudflare Blog
宝玉的分享
宝玉的分享
V
V2EX
Microsoft Azure Blog
Microsoft Azure Blog

szhshp 的第三边境研究所

假设, AI 把我代替的那一刻真的到来 | szhshp 的第三边境研究所 小傻瓜都能懂的 AstrBot QQ 机器人集成 MCP 功能实战指南 | szhshp 的第三边境研究所 《智人之上: 从石器时代到 AI 时代的信息网络简史》阅读笔记 | szhshp 的第三边境研究所 iPadOS 26 无法设置空间场景图片壁纸的解决方法 | szhshp 的第三边境研究所 《一路云海》(终) | szhshp 的第三边境研究所 《一路云海》(四): 如何不按套路旅行 | szhshp 的第三边境研究所 《一路云海》(三): In Ya Mellow Tone | szhshp 的第三边境研究所 《一路云海》(二): 关西世博参观纪实 | szhshp 的第三边境研究所 《一路云海》(一): 新的征程 | szhshp 的第三边境研究所 2025 大阪世博会 [ 3 天前-先到先得 ] 阶段 场馆预约必中独家攻略 | szhshp 的第三边境研究所 Hackathon 随想 | szhshp 的第三边境研究所 一杯双皮奶 | szhshp 的第三边境研究所 Armbian + CasaOS + NAS 配置指南 | szhshp 的第三边境研究所 Docker 构建镜像报错: error getting credentials - err: exit status 1, out: `` | szhshp 的第三边境研究所 Disqus RIP! 论过高的维护成本如何治疗固执的坏习惯 | szhshp 的第三边境研究所 炸弹猫桌游变体规则 | szhshp 的第三边境研究所 《小岛经济学》阅读笔记 | szhshp 的第三边境研究所 《金钱心理学》阅读笔记 | szhshp 的第三边境研究所 为知笔记 RIP: 迁移剩余的笔记 | szhshp 的第三边境研究所 2025 博客第十年展望 - 再见我的过去 | szhshp 的第三边境研究所 我在独立游戏里面致敬的作品 | szhshp 的第三边境研究所 《How to make thing faster》阅读笔记 | szhshp 的第三边境研究所 《The Art of Clean Code》阅读笔记 | szhshp 的第三边境研究所 《Clean Architecture: A Craftsman Guide to Software Structure and Design》阅读笔记 | szhshp 的第三边境研究所 《How AI Works》阅读笔记 | szhshp 的第三边境研究所 游戏策划废案 - Project Uranus | szhshp 的第三边境研究所 游戏策划废案 - Project X | szhshp 的第三边境研究所 人生第一款独立游戏开发复盘 | szhshp 的第三边境研究所 Trap of Life | szhshp 的第三边境研究所 如果我用手搓了个暗物质雏形 | szhshp 的第三边境研究所
你根本不懂Javascript(EP5 HTML事件捕获与冒泡) | szhshp ...
2018-02-28 · via szhshp 的第三边境研究所

Meta

目录

事件捕捉与冒泡

先捕获的必然是父节点, 然后一层层向下捕获, 然后一层层向上冒泡

这里是一个td被点击的效果图

通过三个阶段:

  1. 捕捉阶段: 从父节点, 逐渐向目标节点冒泡, 即自上向下
  2. 接近目标elem阶段(这一阶段会同时激活第一阶段和第三阶段的handler)
  3. 冒泡阶段: 从子节点向父节点冒泡

事件绑定机制

  1. onXXX(event)
  2. addEventListener(event, handler)
  3. jQuery的elem.on(event, selector, handler)

这里有几点需要注意的:

event.target: 发起event的elem

this: 当前elem

  • 通过onXXX()或者addEventListener(event, handler)绑定的事件无法接触到捕捉阶段, 他们只会响应第二和第三阶段
  • 此外, 对于addEventListener(event, handler)的最后一个函数:
    • false: handler放置在冒泡阶段
    • true: handler放置在捕捉阶段
  • 仅仅对于elem.on(event, selector, handler), 只需要return false可以既阻止默认事件, 又防止冒泡

阻止冒泡

一般不需要阻止冒泡, 因为阻止冒泡之后,可能影响其他事件捕捉机制

组织冒泡的核心在于这个函数:event.stopPropagation()

阻止冒泡之后, 事件将不会继续传递

下面这一段就不会调用到bodyonclick

<body onclick="alert(`the bubbling doesn't reach here`)">
  <button onclick="event.stopPropagation()">Click me</button>

  <!-- 错误的例子,这个仅仅阻止了默认事件 -->
  <!-- <button onclick="return false;">Click me</button> -->
</body>

另外几种阻止冒泡的用法:

// 既阻止冒泡, 又阻止默认事件, 仅仅对于`elem.on(event, selector, handler)`有效
// $("#div1").on('click',function(){
//     return false;
// });

//以下两种情况阻止事件冒泡
//oEvent.cancelBubble = true;
//oEvent.stopPropagation();

//以下两种情况阻止默认行为, 没有停止冒泡
//没有停止冒泡
//oEvent.preventDefault(); 
//return false;

参考文献

https://javascript.info/bubbling-and-capturing