如何同时在捕获阶段和冒泡阶段添加事件监听器?

简介: 【10月更文挑战第29天】通过以上两种方法,可以根据具体的需求和场景,灵活地同时在捕获阶段和冒泡阶段添加事件监听器,以实现更复杂的事件处理和交互逻辑。

要同时在捕获阶段和冒泡阶段添加事件监听器

方法一:分别使用 addEventListener 绑定

对于同一个元素的同一个事件类型,可以分别调用两次 addEventListener 方法,一次将第三个参数设置为 true 以在捕获阶段添加监听器,另一次将第三个参数设置为 false 或省略该参数以在冒泡阶段添加监听器。以下是一个示例:

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>同时添加捕获和冒泡阶段的事件监听器</title>
  <style>
    #outer {
    
      width: 200px;
      height: 200px;
      background-color: lightgray;
    }

    #inner {
    
      width: 100px;
      height: 100px;
      background-color: gray;
    }
  </style>
</head>

<body>
  <div id="outer">
    Outer
    <div id="inner">Inner</div>
  </div>

  <script>
    const outer = document.getElementById('outer');
    const inner = document.getElementById('inner');

    // 在捕获阶段为 outer 元素添加 click 事件监听器
    outer.addEventListener('click', function () {
    
      console.log('outer capture');
    }, true);

    // 在冒泡阶段为 outer 元素添加 click 事件监听器
    outer.addEventListener('click', function () {
    
      console.log('outer bubble');
    });

    // 在捕获阶段为 inner 元素添加 click 事件监听器
    inner.addEventListener('click', function () {
    
      console.log('inner capture');
    }, true);

    // 在冒泡阶段为 inner 元素添加 click 事件监听器
    inner.addEventListener('click', function () {
    
      console.log('inner target and bubble');
    });

    // 当点击 inner 元素时,控制台输出顺序为:outer capture、inner capture、inner target and bubble、outer bubble
  </script>
</body>

</html>

在上述示例中,分别为 outer 元素和 inner 元素在捕获阶段和冒泡阶段添加了 click 事件监听器。当点击 inner 元素时,可以看到按照捕获阶段先外后内,然后是目标阶段,最后是冒泡阶段从内到外的顺序执行了相应的事件处理函数。

方法二:使用事件委托并结合判断事件阶段

另一种方式是利用事件委托,将事件监听器绑定在共同的祖先元素上,并在事件处理函数中通过检查事件对象的 eventPhase 属性来判断事件处于捕获阶段还是冒泡阶段,从而执行不同的逻辑。以下是一个示例:

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>使用事件委托同时处理捕获和冒泡阶段的事件</title>
  <style>
    #container {
    
      width: 300px;
      height: 300px;
      background-color: lightgray;
    }

    #child {
    
      width: 150px;
      height: 150px;
      background-color: gray;
    }
  </style>
</head>

<body>
  <div id="container">
    Container
    <div id="child">Child</div>
  </div>

  <script>
    const container = document.getElementById('container');

    container.addEventListener('click', function (event) {
    
      if (event.eventPhase === 1) {
    
        console.log('捕获阶段 - 祖先元素:container');
      } else if (event.eventPhase === 2) {
    
        console.log('目标阶段 - 目标元素:', event.target.id);
      } else if (event.eventPhase === 3) {
    
        console.log('冒泡阶段 - 祖先元素:container');
      }
    }, true);

    // 当点击 child 元素时,控制台会输出捕获阶段的 container、目标阶段的 child、冒泡阶段的 container
  </script>
</body>

</html>

在这个示例中,将 click 事件监听器绑定在 container 元素上,并在事件处理函数中根据 eventPhase 属性的值来判断事件所处的阶段,从而实现了在一个事件处理函数中同时处理捕获阶段和冒泡阶段的逻辑。

通过以上两种方法,可以根据具体的需求和场景,灵活地同时在捕获阶段和冒泡阶段添加事件监听器,以实现更复杂的事件处理和交互逻辑。

相关文章
|
JavaScript
【Ant designe vue】中有关表格列中日期展示 yyyy-mm-dd 格式问题
【Ant designe vue】中有关表格列中日期展示 yyyy-mm-dd 格式问题
412 0
|
前端开发 Java
日志框架:基于Logback实现链路追踪
日志框架:基于Logback实现链路追踪
|
10月前
|
SQL 安全 关系型数据库
SQL注入之万能密码:原理、实践与防御全解析
本文深入解析了“万能密码”攻击的运行机制及其危险性,通过实例展示了SQL注入的基本原理与变种形式。文章还提供了企业级防御方案,包括参数化查询、输入验证、权限控制及WAF规则配置等深度防御策略。同时,探讨了二阶注入和布尔盲注等新型攻击方式,并给出开发者自查清单。最后强调安全防护需持续改进,无绝对安全,建议使用成熟ORM框架并定期审计。技术内容仅供学习参考,严禁非法用途。
1609 0
|
监控 安全 网络安全
WPA2 与 802.1X:有什么区别?
【10月更文挑战第17天】
1303 1
WPA2 与 802.1X:有什么区别?
|
JavaScript 前端开发 测试技术
JS都有哪些操作数组的方法
JS都有哪些操作数组的方法
479 3
|
JavaScript 前端开发 数据格式
Ant Design Vue 日期选择器,绑定的日期和框内不一致,日期格式化,纠正时差
Ant Design Vue 日期选择器,绑定的日期和框内不一致,日期格式化,纠正时差
1346 0
Ant Design Vue 日期选择器,绑定的日期和框内不一致,日期格式化,纠正时差
|
SQL 存储 数据采集
ARMS在APM工具选型中的实践
当前的系统在数字化转型需求以及互联网架构实施的影响下,越来越普遍地使用了微服务架构,我们在享受微服务带来的好处(开发效率高, 独立部署, 水平扩展, 故障与资源隔离等等)外,也带来测试,事务,应用监控等各方面的困难。
4152 97
ARMS在APM工具选型中的实践
|
前端开发 JavaScript Java
Springboot图片上传和映射
Springboot图片上传和映射
490 0
|
Java 安全 数据安全/隐私保护
java报错javax.net.ssl.SSLHandshakeException:  sun.security.validator.ValidatorException
linux服务器更新JDK,从jdk1.7升级到jdk1.8,导致java访问https地址时程序报错。                解决方法:1、用浏览器登录该https网站,在浏览器地址栏里找到“证书信息”->“详细信息”->“复制到文件”->选择DER编码二进制X.
11285 0
|
前端开发 Java Spring
Spring Boot 实现图片上传并回显
Spring Boot 实现图片上传并回显
1171 0