js事件监听机制(事件捕获)总结

yizhihongxing

JS事件监听机制(事件捕获)总结

什么是事件监听机制?

JavaScript事件监听机制是指浏览器在特定条件下,允许开发者在特定的DOM元素上注册回调函数,以便在特定的事件发生时进行响应。

事件类型

目前常见的事件类型可以分为以下三类:

  1. 用户交互事件:click、mousedown、mouseover等;
  2. 浏览器事件:load、resize、error等;
  3. 表单元素事件:submit、change等。

事件监听的两种方式

  1. 冒泡事件监听方式
  2. 捕获事件监听方式

冒泡事件监听方式

冒泡事件监听方式是指事件发生时,浏览器会首先执行最底层的元素上的回调函数,然后逐级向上执行,直到执行到最上层元素上的回调函数。该方式比较常见,也是浏览器默认的事件监听方式。

示例代码:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>冒泡事件监听方式示例</title>
</head>
<body>
  <div id="parent">
    <div id="child">
      Click me!
    </div>
  </div>
  <script>
    const parent = document.querySelector('#parent');
    const child = document.querySelector('#child');
    parent.addEventListener('click', (event) => {
      console.log('Clicked parent!');
    });
    child.addEventListener('click', (event) => {
      console.log('Clicked child!');
    });
  </script>
</body>
</html>

在上述代码中,当点击child元素时,控制台会输出两次Clicked child!,以及一次Clicked parent!。

捕获事件监听方式

捕获事件监听方式与冒泡事件监听方式相反,即在事件发生时,浏览器会首先执行最上层元素上的回调函数,然后逐级向下执行,直到执行到最底层元素上的回调函数。

示例代码:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>捕获事件监听方式示例</title>
</head>
<body>
  <div id="parent">
    <div id="child">
      Click me!
    </div>
  </div>
  <script>
    const parent = document.querySelector('#parent');
    const child = document.querySelector('#child');
    parent.addEventListener('click', (event) => {
      console.log('Clicked parent!');
    }, true); // 将捕获事件监听方式设为true
    child.addEventListener('click', (event) => {
      console.log('Clicked child!');
    }, true); // 将捕获事件监听方式设为true
  </script>
</body>
</html>

在上述代码中,当点击child元素时,控制台会输出一次Clicked parent!,以及两次Clicked child!。

捕获事件监听和冒泡事件监听的选择

在绝大多数情况下,冒泡事件监听方式可以满足网站开发的需求。但是,对于某些特殊的场景来说,我们需要使用捕获事件监听方式。

在某些场景下,冒泡事件监听可能会导致问题,例如:

  1. 父元素和子元素都添加了click事件监听,当子元素被点击时,会逐级冒泡触发父元素的click事件,从而多次触发点击事件。如果在每个父元素上添加“不再向上冒泡”(stopPropagation)方法的调用,则显得比较麻烦。
  2. 对于一些需要动态增删元素的网站来说,如果不小心在每个元素上都添加了click事件监听,那么会导致性能降低,以及冒泡次数过多,增加代码编写和维护的难度。

当然,在使用捕获事件监听方式时,需要注意以下两点:

  1. 所有浏览器都不支持focusin和focusout事件的冒泡,需要使用捕获事件监听方式。
  2. 除了IE9之前的版本,其他浏览器都可以使用addEventListener方法来注册捕获事件监听。

总结

JavaScript事件监听机制是一种灵活且有效的前端技术,可以帮助我们轻松实现网页上的交互功能。至于使用捕获事件监听还是冒泡事件监听,则需要根据具体的需求来进行选择,不能一概而论。

参考资料

  1. MDN:EventTarget.addEventListener()
  2. MDN: Event bubbling and capturing

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js事件监听机制(事件捕获)总结 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • 使用JS实现气泡跟随鼠标移动的动画效果

    使用JS实现气泡跟随鼠标移动的动画效果,可以分为以下几个步骤: 步骤1:HTML结构 首先,需要在HTML中创建一个容器元素,用于包含气泡,代码如下: <div id="container"></div> 步骤2:CSS样式 通过CSS对容器元素进行样式设置,如设置宽高、背景颜色和边框等,代码如下: #contai…

    JavaScript 2023年6月10日
    00
  • 很好用的js日历算法详细代码

    如果你正在寻找一个简单易用且功能强大的js日历算法,那么你应该尝试使用这个“很好用的js日历算法”!这个算法不仅提供了完整的代码实现,还有详细的说明。在下面的步骤中,我们将详细的了解这个算法的使用方法。 步骤1: 下载日历算法代码 你可以在github上找到这个日历算法的代码,可以在你的本地环境中运行查看。你可以单击以下链接: 日历算法代码 然后,你需要从这…

    JavaScript 2023年5月27日
    00
  • ES6基础之数组和对象的拓展实例详解

    首先,对于“ES6基础之数组和对象的拓展实例详解”,我们需要了解 ES6 中关于数组和对象的一些新特性。在 ES6 中,数组和对象都有一些新的方法或语法糖,方便了我们的编码。下面我将会分别介绍数组和对象的拓展实例。 数组的拓展实例 扩展运算符 扩展运算符(spread operator)是 ES6 中新增的一个语法。它的主要作用是将一个数组展开成多个独立的值…

    JavaScript 2023年5月27日
    00
  • JavaScript获取当前时间向前推三个月的方法示例

    获取当前时间向前推三个月可以使用JavaScript中的Date对象和相关方法来实现。下面是具体的攻略: 获取当前时间 使用JavaScript中的Date对象可以获取当前的时间。代码如下: var currentTime = new Date(); console.log(currentTime); 输出结果如下: Sun Jul 11 2021 15:4…

    JavaScript 2023年5月27日
    00
  • JavaScript如何生成二维数组

    生成二维数组的过程,实际上就是创建一个包含其他数组的数组。这个过程也可以称之为多维数组的创建。在 JavaScript 中,可以通过以下几种方法来生成二维数组: 方法一:使用双重循环创建二维数组 let rows = 5; let cols = 4; let arr = new Array(rows); for (let i = 0; i < rows…

    JavaScript 2023年5月28日
    00
  • JSON stringify及parse方法实现数据深拷贝

    JSON stringify及parse方法实现数据深拷贝 对于JavaScript中的对象类型,简单的赋值操作只是将对象的引用传递给了变量,而非真正的拷贝。因此,当我们需要对这些数据进行深拷贝时,需要使用到一些特殊的方法。 在JavaScript中,常用的实现数据深拷贝的方法有以下几种:遍历拷贝、jQuery中的$.extend方法、lodash库中的_.…

    JavaScript 2023年5月27日
    00
  • Javascript立即执行函数(IIFE)实例详解

    Javascript立即执行函数(IIFE)实例详解 在Javascript中,立即执行函数指的是定义完函数后立即自动调用该函数,避免了函数命名污染全局变量的问题,同时可以更好地保护函数内部的变量隐私和封装性。下面就是关于Javascript立即执行函数的详细攻略。 什么是Javascript立即执行函数 Javascript立即执行函数的定义格式如下: (…

    JavaScript 2023年5月27日
    00
  • javascript中利用柯里化函数实现bind方法

    利用柯里化函数实现bind方法 在 JavaScript 中,bind() 是一个用于改变函数 this 上下文的方法。它返回一个新函数,新函数的 this 指向 bind() 的第一个参数,并且在调用的时候可以传入多个参数传递给原函数。这个方法在函数式编程中非常有用,因为它允许我们更容易地组合函数。 柯里化函数可以用来实现 bind() 方法,让我们来看看…

    JavaScript 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部