【前端每天一题】🔥第7题 事件冒泡与事件捕获 - 前端高频面试题

这是前端高频面试题的详细版 + 速记卡版,可以直接用在面试里。

第 7 题:事件冒泡和事件捕获的区别?如何阻止事件冒泡?如何阻止默认行为?


一、事件冒泡(Event Bubbling)是什么?

事件从 最内层元素(target) 一直向 外层父级元素 传播,直到最顶层(document)。

传播顺序:

javascript 复制代码
target → parent → document

示例:

HTML:

html 复制代码
<div id="outer">
  <div id="inner"></div>
</div>

点击 inner 时,顺序是:

sql 复制代码
inner → outer → document

冒泡是浏览器默认的事件传播机制。


二、事件捕获(Event Capturing)是什么?

事件从 最外层(document) 往 目标元素(target) 方向传播。

传播顺序:

javascript 复制代码
document → parent → target

三、浏览器完整的事件流阶段

事件流包含 三个阶段:

markdown 复制代码
1. 捕获阶段(从外到内)
2. 目标阶段(target 本身)
3. 冒泡阶段(从内到外)

图示:

javascript 复制代码
document
   ↓ (捕获)
parent
   ↓
target
   ↑ (冒泡)
parent
   ↑
document

四、addEventListener 如何指定阶段?

语法:

javascript 复制代码
element.addEventListener(event, handler, useCapture)

第三个参数:

  • true → 捕获阶段执行
  • false → 冒泡阶段执行(默认)

示例:

javascript 复制代码
div.addEventListener('click', handler, true)  // 捕获
div.addEventListener('click', handler, false) // 冒泡

五、如何阻止事件冒泡?

方式 1:标准方法(推荐)

javascript 复制代码
event.stopPropagation()

方式 2:阻止所有传播(包括捕获 + 冒泡)

javascript 复制代码
event.stopImmediatePropagation()

⚠️ 并且会阻止"同一元素上后续绑定的回调函数"。

🚫 重要说明:return false 并不会阻止冒泡

原生 DOM 中:

javascript 复制代码
return false

只能阻止默认行为,不会阻止冒泡。

(除非在 jQuery 中)


六、如何阻止默认行为?

方法 1:标准方法

javascript 复制代码
event.preventDefault()

方法 2:在标签内直接 return false(只阻止默认行为)

html 复制代码
<a href="#" onclick="return false">点击</a>

方法 3:表单中阻止提交

javascript 复制代码
form.addEventListener("submit", e => e.preventDefault())

七、快速对比总结表

行为 方法 作用
阻止冒泡 event.stopPropagation() 阻止事件向父级继续冒泡
阻止所有传播 event.stopImmediatePropagation() 同节点后续事件也不再触发
阻止默认行为 event.preventDefault() 阻止浏览器的默认动作(跳转、滚动、提交等)
return false 部分情况下等于 preventDefault 原生不会阻止冒泡

速记卡(10 秒复习版)

🔶 捕获:从外到内

document → ... → target

🔶 冒泡:从内到外

target → ... → document

🔶 阻止冒泡

event.stopPropagation()

🔶 阻止所有传播(包括同级绑定事件)

event.stopImmediatePropagation()

🔶 阻止默认行为

event.preventDefault()

相关推荐
鬼手点金6 小时前
nanoGPT/nanochat 能做出 DeepSeek/Qwen 这样的大模型吗?
服务器·前端·javascript·bug·openclaw
蛋蛋的就会顺顺的6 小时前
hot100 p0——栈,贪心算法,动态规划
java·前端·javascript·算法·leetcode·力扣
程序员Sunday6 小时前
TypeScript 的 any、unknown、never 有什么区别?
前端·面试·typescript
朱涛的自习室6 小时前
70 美金的 Beyond Compare,我让 Gemini 4 和 DeepSeek 造个开源免费版(Day 2)
android·前端·人工智能
小 黄 鸡7 小时前
HashMap 面试必会知识点详解(JDK 8)
java·面试·职场和发展
码艺-Alimjan7 小时前
Tauri 源码备份 · 打包 & 解压 总结,源码收集之路
前端·javascript·vue.js
小马不起床7 小时前
零基础玩转 FastAPI_11:前端后台管理页面
前端·状态模式·fastapi
子非鱼a8 小时前
【文件上传】一个普普通通的edu16
前端
美狐美颜SDK开放平台9 小时前
直播APP如何实现美白滤镜功能?视频美颜SDK技术开发方案详解
前端·数据库·人工智能·音视频·美颜sdk·直播美颜sdk·视频美颜sdk
pride.li9 小时前
第03章 Python 教程-基础语法:注释与变量
服务器·前端·后端·python·算法·计算机视觉