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

简介: 【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 属性的值来判断事件所处的阶段,从而实现了在一个事件处理函数中同时处理捕获阶段和冒泡阶段的逻辑。

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

相关文章
|
12月前
|
存储 缓存 关系型数据库
MariaDB 和 GreatSQL 性能差异背后的真相
【10月更文挑战第22天】本文介绍了 MariaDB 和 GreatSQL 两款数据库系统的背景、性能差异因素及实际应用场景。MariaDB 是 MySQL 的分支,具有良好的社区支持和丰富的插件生态系统;GreatSQL 是国产的 MySQL 兼容数据库,专注于企业级应用场景。文章详细对比了两者的存储引擎优化、查询优化器差异、缓存机制和并发处理能力,并分析了它们在 OLTP 和 OLAP 场景中的性能表现。
437 3
|
11月前
|
存储 JavaScript 前端开发
块级作用域和函数作用域的区别在哪些方面会对性能产生影响?
【10月更文挑战第29天】块级作用域和函数作用域在变量查找效率、内存管理、闭包、代码执行顺序以及作用域链维护等方面的区别,都会在不同程度上对性能产生影响。在实际开发中,需要根据具体的代码逻辑、应用场景和性能需求,合理地选择和运用这两种作用域,以达到最佳的性能和代码质量平衡。
|
11月前
|
JavaScript 前端开发
除了点击事件,`addEventListener` 还能用于处理哪些事件类型?
【10月更文挑战第29天】 `addEventListener` 能够处理的事件类型非常丰富,涵盖了各种用户交互和页面状态变化的场景,通过合理地使用这些事件类型,可以为网页或应用程序添加丰富多样的交互效果和功能。
|
11月前
|
开发者
静态方法和实例方法的区别是什么?
静态方法和实例方法在面向对象编程中各自扮演着重要的角色,开发者需要根据具体的业务需求和设计原则来合理地使用它们,以实现高效、可读和易于维护的代码结构。
409 68
|
11月前
|
机器学习/深度学习 前端开发 测试技术
探索软件测试中的自动化测试框架选择与优化策略####
本文深入探讨了在当前软件开发生命周期中,自动化测试框架的选择对于提升测试效率、保障产品质量的重要性。通过分析市场上主流的自动化测试工具,如Selenium、Appium、Jest等,结合具体项目需求,提出了一套系统化的选型与优化策略。文章首先概述了自动化测试的基本原理及其在现代软件开发中的角色变迁,随后详细对比了各主流框架的功能特点、适用场景及优缺点,最后基于实际案例,阐述了如何根据项目特性量身定制自动化测试解决方案,并给出了持续集成/持续部署(CI/CD)环境下的最佳实践建议。 --- ####
|
11月前
|
云安全 安全 数据安全/隐私保护
带你读《阿里云安全白皮书》(二十五)——总结与展望
数智化技术的发展重塑了社会生产模式,提高了生产效率和资源配置精度。阿里云致力于构建安全、高效的云生态系统,通过深化安全机制研究和建设,保障云服务的稳定运行和客户业务安全,推动数字经济的可持续发展。
|
11月前
|
设计模式 JavaScript 前端开发
addEventlistener和正常的onclick=()=> 的区别
【10月更文挑战第29天】`addEventListener` 是一种更推荐的添加事件处理函数的方式,它提供了更好的灵活性、可维护性和代码结构,能够满足复杂的事件处理需求,而 `onclick` 属性则更适合简单的、一次性的事件绑定场景,且在现代的JavaScript开发中,应尽量避免在HTML中直接使用 `onclick` 属性,以提高代码的质量和可维护性。
|
11月前
|
存储 算法
后序遍历的递归和非递归实现有何区别?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
266 56
|
11月前
|
前端开发
业余时间开发了个海报编辑器
为了满足撰写博客或录制教程视频时对高质量海报的需求,我利用业余时间开发了一款海报编辑器。第一版功能简单,支持固定尺寸、黑底白字的标题。后来经过优化,增加了背景图、模糊效果、文字样式调整等功能,使海报更具吸引力。目前该编辑器已上线,欢迎大家试用并反馈。[访问海报编辑器](https://tool.share888.top/#/poster)
172 6
业余时间开发了个海报编辑器
|
11月前
|
Android开发
鸿蒙开发:自定义一个简单的标题栏
本身就是一个很简单的标题栏组件,没有什么过多的技术含量,有一点需要注意,当使用沉浸式的时候,注意标题栏的位置,需要避让状态栏。
217 5
鸿蒙开发:自定义一个简单的标题栏