示例说明: 单击按钮时,显示“Button Clicked!”警报首先显示,因为该事件是在按钮上触发的。之后,事件“冒泡”到父 div,您会看到“Parent Div Clicked!”警报。这是因为事件从按钮开始,然后上升到其父级 div。所以,这个传播过程被称为“事件冒泡”。

事件捕捉

事件捕获是冒泡的逆过程。该事件从网页顶部(从文档开始)开始,向下移动到您与之交互的元素。这意味着父元素的事件处理程序将首先被触发,并且事件将向下移动到您单击或与之交互的子元素。

Parent Div

在这种情况下,当您单击按钮时,“Parent Div Clicked!”警报将首先显示。然后,“按钮被点击!”之所以会显示警报,是因为事件从文档级别开始,首先捕获(滴流)到父 div,然后到达按钮。

addEventListener的第三个参数的值为true是捕获阶段的决定因素。

每个事件都会经历 3 个阶段

当然,每个事件都会经历所有三个阶段:

所以,是的,事件自然会经历所有三个阶段,但是 JavaScript 可以让您控制事件侦听器将执行的阶段。

即使事件经历所有三个阶段,JavaScript 的事件监听器默认情况下附加到冒泡阶段。这意味着当您添加事件监听器而不指定任何内容时,它将仅在冒泡阶段监听事件(在事件到达目标并开始向上移动之后)。

当您传递 true 作为第三个参数时,您告诉 JavaScript 在捕获阶段

监听事件(当它沿着 DOM 传播时)。事件仍然会经历所有阶段(捕获、目标和冒泡),但监听器将在事件到达目标元素之前的捕获阶段被触发。

使用 true 时事件是否从捕获变为冒泡?不,事件

总是通过捕获和冒泡移动。当你传递 true 时,你并没有阻止冒泡阶段。您只是告诉听众在捕获期间做出响应。事件将从捕获到目标继续,然后像往常一样冒泡。

概括

","image":"http://www.luping.net/uploads/20240930/172769184566fa7c4558a6e.jpg","datePublished":"2024-11-08T17:35:33+08:00","dateModified":"2024-11-08T17:35:33+08:00","author":{"@type":"Person","name":"luping.net","url":"https://www.luping.net/articlelist/0_1.html"}}
”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 事件冒泡和捕获 - 像 5 岁一样学习

事件冒泡和捕获 - 像 5 岁一样学习

发布于2024-11-08
浏览:144

Event Bubbling and Capturing - Learn like you are 5

来吧,“像五岁一样学习”只是一个短语——我不是在这里讲一个玩具故事!但我保证,如果你从头到尾仔细阅读,一切都会有意义。

事件冒泡和捕获是在 JavaScript 中触发事件时事件如何通过 DOM(文档对象模型)传播(或传播)的两个阶段。现在,这个说法需要澄清事件传播的概念。

事件传播

当某个元素(例如 div 内的按钮)上发生事件时,该事件不仅仅发生在该按钮上。事件在 DOM 中传播的过程称为事件传播。这个过程分为两个主要阶段:

  • 事件捕获(也称为“trickling”)

  • 事件冒泡

现在,我希望你明白了。让我们通过示例来理解两者。

事件冒泡

事件冒泡是指当某个元素上发生事件时,它首先触发该元素的事件处理程序。然后,它在 DOM 树中向上移动,触发其父元素的事件处理程序,依此类推,直到到达文档或 DOM 树的根。

Parent Div

示例说明: 单击按钮时,显示“Button Clicked!”警报首先显示,因为该事件是在按钮上触发的。之后,事件“冒泡”到父 div,您会看到“Parent Div Clicked!”警报。这是因为事件从按钮开始,然后上升到其父级 div。所以,这个传播过程被称为“事件冒泡”。

事件捕捉

事件捕获是冒泡的逆过程。该事件从网页顶部(从文档开始)开始,向下移动到您与之交互的元素。这意味着父元素的事件处理程序将首先被触发,并且事件将向下移动到您单击或与之交互的子元素。

Parent Div

在这种情况下,当您单击按钮时,“Parent Div Clicked!”警报将首先显示。然后,“按钮被点击!”之所以会显示警报,是因为事件从文档级别开始,首先捕获(滴流)到父 div,然后到达按钮。

addEventListener的第三个参数的值为true是捕获阶段的决定因素。

每个事件都会经历 3 个阶段

当然,每个事件都会经历所有三个阶段:

  • 捕获阶段:事件从顶部(文档)开始,向下到达目标。

  • 目标阶段:事件到达您与之交互的元素(目标)。

  • 冒泡阶段:到达目标后,事件通过父元素向上冒泡。

所以,是的,事件自然会经历所有三个阶段,但是 JavaScript 可以让您控制事件侦听器将执行的阶段。

即使事件经历所有三个阶段,JavaScript 的事件监听器默认情况下附加到冒泡阶段。这意味着当您添加事件监听器而不指定任何内容时,它将仅在冒泡阶段监听事件(在事件到达目标并开始向上移动之后)。

当您传递 true 作为第三个参数时,您告诉 JavaScript 在捕获阶段

监听事件(当它沿着 DOM 传播时)。事件仍然会经历所有阶段(捕获、目标和冒泡),但监听器将在事件到达目标元素之前的捕获阶段被触发。

使用 true 时事件是否从捕获变为冒泡?不,事件

总是通过捕获和冒泡移动。当你传递 true 时,你并没有阻止冒泡阶段。您只是告诉听众在捕获期间做出响应。事件将从捕获到目标继续,然后像往常一样冒泡。

概括

  • 所有事件都会自然地经历捕获、目标和冒泡阶段

  • 默认情况下,事件监听器在冒泡阶段工作

    (事件到达目标并向上移动之后)。

  • 当您传递 true 时,您将告诉事件侦听器在捕获阶段
  • (当事件向下传播时)触发

  • 事件仍然会经历所有阶段(捕获、目标和冒泡),但您的侦听器决定在哪个阶段执行操作。
版本声明 本文转载于:https://dev.to/abeertech01/event-bubbling-and-capturing-learn-like-you-are-5-4i48?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 字符串与字符串
    字符串与字符串
    细绳 小写字符串是JavaScript中的原始数据类型。 用这种类型创建的字符串不是对象,但 JavaScript 会自动用 String 对象包装它们(这称为“装箱”)。 let imAString = "hello"; console.log(typeof imAString)...
    编程 发布于2024-11-08
  • 如何在 C++ 和 Python 中右对齐输出字符串?
    如何在 C++ 和 Python 中右对齐输出字符串?
    右对齐格式化输出字符串处理文本文件时,一致地对齐数据可以增强可读性和分析能力。在 C 中,出现了一个问题:如何才能格式化右对齐的输出字符串?使用 Python 的格式化语法,解决方案很简单:line_new = '{:>12} {:>12} {:>12}...
    编程 发布于2024-11-08
  • 黑客啤酒节第二周
    黑客啤酒节第二周
    第二周,我不得不花更少的时间寻找问题。这次是 Mattermost 文档网站在深色模式下发生的错误,其中特定按钮的颜色不正确。 我知道 Docusaurus,因为我看过其他文档和基于它构建的一些课程材料网站。它在底层使用了 React,所以我很熟悉它。但这个文档网站是用 Python 编写的。虽然我...
    编程 发布于2024-11-08
  • Python 中的 Try/Except 与 If/Else:哪种方法更有效?
    Python 中的 Try/Except 与 If/Else:哪种方法更有效?
    Try/Except 与 If/Else:哪种方法更可取?在 Python 中处理异常时,开发人员经常面临困境是否测试有效性或尝试某项操作并处理任何产生的异常。本文深入探讨了每种方法的细微差别,为决策提供指导和示例。尝试/除外:拥抱例外根据 PEP 20,错误除非明确地保持沉默,否则绝不应悄无声息地...
    编程 发布于2024-11-08
  • Git 远程分支
    Git 远程分支
    本周我们必须向另一个人的存储库添加一个功能。具体来说,我们需要在用户的 $HOME 文件夹中添加一个默认配置 TOML 文件,其中包含 CLI 工具的默认参数。我已为 readMeMaker 存储库做出了贡献: https://github.com/jadorotan/readMeMaker.git...
    编程 发布于2024-11-08
  • 对于简单的操作,流总是比传统集合慢吗?
    对于简单的操作,流总是比传统集合慢吗?
    Java 8 流性能对比传统集合您最近涉足 Java 8 并进行了非正式基准测试,以将其 Stream API 与经典集合的性能进行比较。您的测试涉及过滤整数列表、提取偶数的平方根并将结果存储在 Double 列表中。然而,您质疑测试的有效性,并渴望澄清真正的性能影响。评估基准测试您的初步结果,表明...
    编程 发布于2024-11-08
  • 语言 API,允许您添加您的母语。
    语言 API,允许您添加您的母语。
    早在 2016 年 4 月,我就有了为一个我非常喜欢的部落“Igede Language”创建一个字典项目的想法,我决定将其称为“Igede Dictionary”,尽管我不是“ t 是母语人士。 这让我撰写并翻译了 5,000 多个单词,从 Igede 语言翻译成英语。毫无疑问,这是我曾经研究过...
    编程 发布于2024-11-08
  • 使用 Playwright、TypeScript 和 JavaScript 进行自动化
    使用 Playwright、TypeScript 和 JavaScript 进行自动化
    剧作家与 TypeScript | JavaScript 安装 Playwright 是 Microsoft 与 Puppeteer 团队合作推出的基于 Web 的现代 API 自动化工具,Puppeteer 是一个 JavaScript 库,它提供高级 API 来通过 DevTools 协议或 W...
    编程 发布于2024-11-08
  • 为什么使用 Z-Index 时我的伪元素出现在标题元素上方?
    为什么使用 Z-Index 时我的伪元素出现在标题元素上方?
    Z-Index 和伪元素:案例研究在 CSS 中,z-index 属性指定元素的堆叠顺序页面,确定哪些元素出现在其他元素“前面”或“后面”。然而,当涉及到伪元素时,例如 ::before 或 ::after,它们与 z-index 的交互有时可能不那么简单。考虑一个场景,我们使用::before 伪...
    编程 发布于2024-11-08
  • 如何在剥离标签之前删除顽固的 HTML 特殊字符?
    如何在剥离标签之前删除顽固的 HTML 特殊字符?
    去除顽固的 HTML 特殊字符strip_tags 函数虽然擅长删除 HTML 标签,但无法处理讨厌的 HTML 特殊字符,例如用于不间断空格或 © 用于版权符号。这可能是创建干净 RSS 源的绊脚石。要解决此问题,请考虑使用以下策略之一:HTML 实体解码:在字符串经过 strip_tags 之前...
    编程 发布于2024-11-08
  • 如何在 Go 中解密 AES ECB 模式加密?
    如何在 Go 中解密 AES ECB 模式加密?
    Go 中的 AES ECB 加密AES ECB 模式加密,其中每个明文块都独立加密,是一种简单但可能不安全的加密方法。在Go中,可以使用以下代码执行AES ECB解密:package main import ( "crypto/aes" "fmt&quo...
    编程 发布于2024-11-08
  • PHP 会话管理中的 session_unset() 和 session_destroy() 有什么区别?
    PHP 会话管理中的 session_unset() 和 session_destroy() 有什么区别?
    揭示 PHP 中 session_unset() 和 session_destroy() 的独特作用在 PHP 会话管理领域,出现了两个关键函数:session_unset() 和 session_destroy()。虽然它们似乎都围绕会话数据操作,但它们的功能和效果却显着不同。1。理解差异根据 P...
    编程 发布于2024-11-08
  • 以下是一些标题选项,请记住问题格式和文章的重点是控制选择框选项宽度:

**选项 1(更多技术性):**
* **如何控制Sele的宽度
    以下是一些标题选项,请记住问题格式和文章的重点是控制选择框选项宽度: **选项 1(更多技术性):** * **如何控制Sele的宽度
    如何控制选择框选项的宽度当选择框中的选项超出框的宽度时,可能会造成混乱以及笨拙的外观。为了解决这个问题,我们可以同时使用 CSS 和 JavaScript 来自定义选项的宽度并截断任何多余的文本。CSS 方法:虽然单独使用 CSS 是不行的足以设置选项的宽度,我们可以利用它来固定选择框本身的宽度。通...
    编程 发布于2024-11-08
  • C++ 异常说明符值得这么麻烦吗?
    C++ 异常说明符值得这么麻烦吗?
    C 中的异常说明符:你应该使用它们吗?C 中的异常说明符允许您指示函数是否可能抛出特定的异常类型。然而,由于担心 Visual Studio .NET 中的编译器执行、程序终止和非标准行为,人们对其实际用途产生了疑问。为什么不使用异常说明符:有限执行:编译器不严格执行异常说明符,从而减少了它们提供的...
    编程 发布于2024-11-08
  • 使用 .EJS 模板配置 Express
    使用 .EJS 模板配置 Express
    通常,我使用经典的入门版。 Expressjs.com const express = require('express') const app = express() const port = 3000 app.set('view engine', 'ejs') app.use(express.u...
    编程 发布于2024-11-08

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3