- JavaScript 教程
- JavaScript 教程
- Javascript - 概述
- Javascript - 功能
- 在浏览器中启用 JavaScript
- JavaScript - 放置在 HTML 文件中
- JavaScript - 语法
- JavaScript - Hello World 程序
- JavaScript - Console.log()方法
- JavaScript - 注释
- JavaScript - 变量
- JavaScript - let 语句
- JavaScript - 常量
- JavaScript - 数据类型
- JavaScript - 类型转换
- JavaScript - 严格模式
- JavaScript - 保留关键字
- JavaScript 运算符
- JavaScript - 运算符
- JavaScript - 算术运算符
- JavaScript - 比较运算符
- JavaScript - 逻辑运算符
- JavaScript - 按位运算符
- JavaScript - 赋值运算符
- JavaScript - 条件运算符
- JavaScript - typeof 运算符
- JavaScript - Nullish 合并运算符
- JavaScript - Delete 运算符
- JavaScript - 逗号运算符
- JavaScript - 分组运算符
- JavaScript - Yield 运算符
- JavaScript - Spread 运算符
- JavaScript - 幂运算符
- JavaScript - 运算符优先级
- JavaScript 控制流
- JavaScript - if...else 语句
- JavaScript - While 循环
- JavaScript - For 循环
- JavaScript - For...in 循环
- JavaScript - For...of 循环
- JavaScript - 循环控制
- JavaScript - Break 语句
- JavaScript - Continue 语句
- JavaScript - Switch Case 语句
- JavaScript - 用户定义的迭代器
- JavaScript 函数
- JavaScript - 函数
- JavaScript - 函数表达式
- JavaScript - 函数参数
- JavaScript - 默认参数
- JavaScript - Function() 构造函数
- JavaScript - 函数提升
- JavaScript - 自调用函数
- JavaScript - 箭头函数
- JavaScript - 函数调用
- JavaScript - 函数 call() 方法
- JavaScript - 函数 apply() 方法
- JavaScript - 函数 bind() 方法
- JavaScript - 闭包
- JavaScript - 变量范围
- JavaScript - 全局变量
- JavaScript - 智能函数参数
- JavaScript 对象
- JavaScript - Number 对象
- JavaScript - 布尔对象
- JavaScript - String 对象
- JavaScript - Array 对象
- JavaScript - 日期对象
- JavaScript - DataView 对象
- JavaScript - 处理程序
- JavaScript - math 对象
- JavaScript - 正则表达式
- JavaScript - Symbol 对象
- JavaScript - Set(集)对象
- JavaScript - WeakSet 对象
- JavaScript - Maps (地图) 对象
- JavaScript - WeakMap 对象
- JavaScript - Iterables 对象
- JavaScript - Reflect 对象
- JavaScript - TypedArray 对象
- JavaScript - 模板文本
- JavaScript - tagged 模板
- 面向对象的 JavaScript
- JavaScript - 对象概述
- JavaScript - 类(Classes)
- JavaScript - 对象属性
- JavaScript - 对象方法
- JavaScript - Static(静态)方法
- JavaScript - display(显示)对象
- JavaScript - 对象访问器
- JavaScript - 对象构造函数
- JavaScript - 原生原型
- JavaScript - ES5 对象方法
- JavaScript - Encapsulation(封装)
- JavaScript - Inheritance(继承)
- JavaScript - Abstraction(抽象)
- JavaScript - Polymorphism(多态性)
- JavaScript - 解构赋值
- JavaScript - 对象解构
- JavaScript - 数组解构
- JavaScript - 嵌套解构
- JavaScript - 可选链接
- JavaScript - 全局对象
- JavaScript - Mixin
- JavaScript - Proxies(代理)
- JavaScript 版本
- JavaScript - 历史
- JavaScript - 版本
- JavaScript - ES5
- JavaScript cookies
- JavaScript - Cookies
- JavaScript - Cookie 属性
- JavaScript - 删除 Cookie
- JavaScript 浏览器 BOM
- JavaScript - 浏览器对象模型
- JavaScript - Window 对象
- JavaScript - Document 对象
- JavaScript - Screen 对象
- JavaScript - History 对象
- JavaScript - navigator 对象
- JavaScript - Location 对象
- JavaScript - Console 对象
- JavaScript Web API
- JavaScript - Web API
- JavaScript - history API( 历史 API)
- JavaScript - Storage API(存储 API)
- JavaScript - Forms API(表单 API)
- JavaScript - Worker API
- JavaScript - Fetch API (获取 API)
- JavaScript - Geolocation API (地理位置 API)
- JavaScript 事件
- JavaScript - Events (事件简介)
- JavaScript - DOM 事件
- JavaScript - addEventListener()
- JavaScript - 鼠标事件
- JavaScript - 键盘事件
- JavaScript - 表单事件
- JavaScript - 窗口/文档事件
- JavaScript - 事件委派
- JavaScript - 事件冒泡
- JavaScript - 事件捕获
- JavaScript - 自定义事件
- JavaScript 错误处理
- JavaScript - 错误和异常处理
- JavaScript - try...catch 语句
- JavaScript - 调试
- JavaScript - 自定义错误
- JavaScript - 扩展错误
- JavaScript 重要关键词
- JavaScript - this 关键字
- JavaScript - void 关键字
- JavaScript - new 关键字
- JavaScript - var 关键字
- JavaScript HTML DOM
- JavaScript - 文档对象模型或 DOM
- JavaScript - DOM 方法
- JavaScript - DOM 文档
- JavaScript - DOM 元素
- JavaScript - DOM 表单
- JavaScript - 更改 HTML
- JavaScript - 更改 CSS
- JavaScript - DOM 动画
- JavaScript - DOM 导航
- JavaScript - DOM 集合
- JavaScript - DOM 节点列表
- JavaScript 杂项
- JavaScript - Ajax
- JavaScript - 异步迭代
- JavaScript - Atomics 对象 (原子对象)
- JavaScript - Rest 参数
- JavaScript - 页面重定向
- JavaScript - 对话框
- JavaScript - 页面打印
- JavaScript - 表单验证
- JavaScript - 动画
- JavaScript - 多媒体
- JavaScript - Image Map(图像映射)
- JavaScript - 浏览器兼容性
- JavaScript - JSON
- JavaScript - 多行字符串
- JavaScript - 日期格式
- JavaScript - 获取日期方法
- JavaScript - 设置日期方法
- JavaScript - 模块
- JavaScript - 动态导入
- JavaScript - BigInt 数据类型
- JavaScript - Blob
- JavaScript - Unicode
- JavaScript - 浅层复制
- JavaScript - 调用堆栈
- JavaScript - 引用类型
- JavaScript - IndexedDB
- JavaScript - 点击劫持攻击
- JavaScript - Currying (局部套用)
- JavaScript - 图形
- JavaScript - Canvas
- JavaScript - Debouncing (防抖)
- JavaScript - 性能
- JavaScript - 样式指南
- JavaScript - 内置函数
JavaScript - 事件冒泡
事件冒泡
事件冒泡是 JavaScript 中的一个概念,指的是事件在 DOM(文档对象模型)层次结构中传播时处理的顺序。当事件发生在特定元素上时,例如单击或按键,它不仅可以触发该特定元素上的处理程序,还可以触发 DOM 树中其祖先上的处理程序。
事件冒泡步骤
以下是事件冒泡的分步说明 -
事件触发
- 在特定的 DOM 元素上触发事件,例如单击按钮或按下键。
- 这是事件传播的起点。
捕获阶段(可选)
- 事件可以选择进入捕获阶段。此阶段从 DOM 树的根开始,向目标元素移动。
- 在此阶段,将执行使用第三个参数 true 向 addEventListener 方法注册的事件处理程序。
目标阶段
- 事件到达 target 元素,即最初发生事件的元素。
冒泡阶段
- 在目标阶段之后,事件开始从目标元素向 DOM 树的根部冒泡。
- 在此阶段,将执行未注册第三个参数或第三个参数设置为 false 的事件处理程序。
使用 2 个嵌套 DIV 的事件冒泡
在这个嵌套的 <div> 元素示例中,当子 <div> 上的 click 事件通过 DOM 层次结构向上传播以触发父 <div> 上的 click 事件侦听器时,事件冒泡是显而易见的。尽管在子事件上被单击,但子事件侦听器和父事件侦听器都会按顺序响应 click 事件。
此行为展示了 DOM 中的默认事件冒泡机制,其中事件从目标元素遍历到其祖先,允许多个元素响应同一事件。在控制台中,单击子 <div> 时,将显示子事件侦听器和父事件侦听器的日志消息,说明事件冒泡过程。
<!DOCTYPE html>
<html lang="en">
<head>
<style>
.parent {
width: 600px;
height: 200px;
background-color: #eee;
position: relative;
cursor: pointer;
}
.child {
width: 400px;
height: 100px;
background-color: #66c2ff;
position: absolute;
top: 50px;
left: 50px;
}
#message {
margin-top: 10px;
font-weight: bold;
}
</style>
</head>
<body>
<h2>Nested Divs</h2>
<div class="parent" id="parentDiv">
<div class="child" id="childDiv">Click me!</div>
</div>
<div id="message"></div>
<script>
let messageElement = document.getElementById('message');
document.getElementById('parentDiv').addEventListener('click', function () {
messageElement.innerHTML+='Parent div clicked<br>';
});
document.getElementById('childDiv').addEventListener('click', function () {
messageElement.innerHTML+='Child div clicked<br>';
});
</script>
</body>
</html>
灰色框是父 div,蓝色框是子 div。
使用 3 个嵌套关卡的事件冒泡
在此示例中,具有三个嵌套级别的 <div> 元素,事件冒泡演示为单击最内层的 Level 3 <div> 会触发父级 Level 2 和 Level 1 <div> 元素上的连续单击事件侦听器。每个级别都使用独特的背景颜色设置样式,直观地表示其层次结构。
单击级别 3 <div> 时,事件会向上传播,为更高级别的元素调用事件侦听器。控制台日志显示指示单击的级别及其背景颜色的消息,展示了用于处理 DOM 中嵌套结构的简化事件冒泡机制。
<!DOCTYPE html>
<html>
<head>
<style>
.level1 {
background-color: #ff9999;
padding: 20px;
text-align: center;
max-width: 80%;
cursor: pointer;
}
.level2 {
background-color: #99ff99;
padding: 15px;
}
.level3 {
background-color: #9999ff;
padding: 10px;
cursor: pointer;
}
#message {
margin-top: 10px;
font-weight: lighter;
border: 1px solid #ddd;
padding: 10px;
max-width: 80%;
background-color: #f9f9f9;
border-radius: 5px;
font-family: 'Arial', sans-serif;
font-size: 14px;
color: #333;
}
</style>
</head>
<body>
<div class="level1" id="div1">
Level 1
<div class="level2" id="div2">
Level 2
<div class="level3" id="div3">
Level 3 (Click me!)
</div>
</div>
</div>
<div id="message"></div>
<script>
const messageElement = document.getElementById("message");
document.getElementById('div1').addEventListener("click", function (event) {
messageElement.innerHTML += "Clicked on Level 1, Background Color:" + getComputedStyle(event.target).backgroundColor + "<br>";
});
document.getElementById('div2').addEventListener("click", function (event) {
messageElement.innerHTML += "Clicked on Level 2, Background Color:" + getComputedStyle(event.target).backgroundColor + "<br>";
});
document.getElementById('div3').addEventListener('click', function (event) {
messageElement.innerHTML +="Clicked on Level 3, Background Color:" + getComputedStyle(event.target).backgroundColor + "<br>";
});
</script>
</body>
</html>