addEventListener()方法第三个参数(useCapture)与浏览器事件触发阶段

2023-11-20

最近面试中有被问到EventTarget.addEventListener()方法的第三个参数useCapture(此方法就不着重讲解了,同时该方法的第三个参数可以传一个对象,可以参考mdn文档,讲解的很详细EventTarget.addEventListener() - Web API 接口参考 | MDN)

浏览器事件触发的三个阶段

捕获阶段:

事件从父节点流向目标节点,途中流经各个DOM节点,在各个节点上触发捕获事件,直到达到目标节点。

目标阶段:

事件到达目标节点时,就到了目标阶段,事件在目标节点上被触发

冒泡阶段:

 事件在目标节点上触发后,不会终止,一层层向上冒,回溯到父节点

 我们直接为元素绑定事件通过onxxx绑定和通过addEventListener添加绑定事件,默认都是在事件冒泡阶段执行事件函数

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .box1{
            width: 300px;
            height: 300px;
            background-color: red;
            font-size:20px;
        }
        .box2{
            width: 200px;
            height: 200px;
            background-color: rgb(0, 187, 255);
            font-size:20px;
        }
        .box3{
            width: 100px;
            height: 100px;
            background-color: orange;
            font-size:20px;
        }
    </style>
</head>
<body>
    <div class="box1">box1
        <div class="box2">box2
            <div class="box3">box3</div>
        </div>
    </div>
    <script>
        document.querySelector(".box1").onclick=()=>{
            console.log("box1");
        }
        document.querySelector(".box2").onclick=()=>{
            console.log("box2");
        }
        document.querySelector(".box3").onclick=()=>{
            console.log("box3");
        }

        
    </script>
</body>
</html>

 将绑定事件由onclick绑定改为addEventListener后结果与上图一致


        // document.querySelector(".box1").onclick=()=>{
        //     console.log("box1");
        // }
        // document.querySelector(".box2").onclick=()=>{
        //     console.log("box2");
        // }
        // document.querySelector(".box3").onclick=()=>{
        //     console.log("box3");
        // }
        document.querySelector(".box1").addEventListener("click",()=>{
            console.log("box1");
        })
        document.querySelector(".box2").addEventListener("click",()=>{
            console.log("box2");
        })
        document.querySelector(".box3").addEventListener("click",()=>{
            console.log("box3");
        })

情况一:为.box1的addEventlistener添加第三个参数useCapture为true(默认是false)


        document.querySelector(".box1").addEventListener("click",()=>{
            console.log("box1");
        },true)
        document.querySelector(".box2").addEventListener("click",()=>{
            console.log("box2");
        })
        document.querySelector(".box3").addEventListener("click",()=>{
            console.log("box3");
        })

此时我们会发现.box1元素绑定的事件回调是在我们捕获阶段触发的,而.box2和.box3触发的事件回调依旧是在我们冒泡阶段触发的

 情况二:为.box2的addEventlistener添加第三个参数useCapture为true(默认是false)


        document.querySelector(".box1").addEventListener("click",()=>{
            console.log("box1");
        })
        document.querySelector(".box2").addEventListener("click",()=>{
            console.log("box2");
        },true)
        document.querySelector(".box3").addEventListener("click",()=>{
            console.log("box3");
        })

 同理,我们会发现,.box2是在事件捕获阶段触发的,而.box1和.box3都是在事件冒泡阶段触发的

情况三:为.box3的addEventlistener添加第三个参数useCapture为true(默认是false)


        document.querySelector(".box1").addEventListener("click",()=>{
            console.log("box1");
        })
        document.querySelector(".box2").addEventListener("click",()=>{
            console.log("box2");
        })
        document.querySelector(".box3").addEventListener("click",()=>{
            console.log("box3");
        },true)

将.box3的useCapture改为true发现,执行的顺序与三个都不改变useCapture是一致的,这是因为当我们点击.box3的时候,我们从父节点(.box1)向.box3捕获的过程中,已经找到了event.target事件源了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

addEventListener()方法第三个参数(useCapture)与浏览器事件触发阶段 的相关文章

随机推荐

  • Invalid Address specified to RtlValidateHeap

    Invalid Address specified to RtlValidateHeap VC编程 最后推出对话框的时候 会有错误提示声音 硄 但是没有弹出错误提示对话框 症状描述与下面的类似 声音就和Assertion Failure一样
  • html遍历数组,JS数组遍历的几种方式

    JS数组遍历 基本就是for forin foreach forof map等等一些方法 以下介绍几种本文分析用到的数组遍历方式以及进行性能分析对比 第一种 普通for循环 代码如下 for j 0 j lt arr length j 简要
  • 【三电平SVPWM学习

    导读 本期对三电平SVPWM的原理和建模做一个简单介绍 并与两电平SVPWM做了一个对比 后面把三电平的SVPWM运用到异步电机直接转矩控制中 看与传统的两电平SVPWM 控制性能是否得到改善 模型可分享 关注公众号 浅谈电机控制 留下邮箱
  • 八大排序算法(六)——优先队列、堆和堆排序

    6 1 API 优先队列是一种抽象数据类型 它表示了一组值和对这些值的操作 优先队列最重要的操作就是删除最大元素和插入元素 6 2 初级实现 6 2 1 数组实现 无序 或许实现优先队列最简单方法就是基于下压栈的代码 insert 方法的代
  • java通过文件路径读取该路径下的所有文件并将其放入list中

    java通过文件路径读取该路径下的所有文件并将其放入list中 java中可以通过递归的方式获取指定路径下的所有文件并将其放入List集合中 假设指定路径为path 目标集合为fileList 遍历指定路径下的所有文件 如果是目录文件则递归
  • 旋转链表(leetcode)

    61 旋转链表 给你一个链表的头节点 head 旋转链表 将链表每个节点向右移动 k 个位置 示例 1 输入 head 1 2 3 4 5 k 2 输出 4 5 1 2 3 示例 2 输入 head 0 1 2 k 4 输出 2 0 1 提
  • centos安装配置hadoop超详细过程(含故障排除)

    1 集群部署介绍 1 1 Hadoop简介 Hadoop是Apache软件基金会旗下的一个开源分布式计算平台 以Hadoop分布式文件系统 HDFS Hadoop Distributed Filesystem 和MapReduce Goog
  • 计算机科学丛书(2014-2018.Q1)

    ISBN 名称 作者 出版时间 978 7 111 53451 8 数学设计和计算机体系结构 原书第2版 美 戴维 莫尼 哈里斯 莎拉 L 哈里斯著 978 7 111 44075 8 嵌入式计算系统设计原理 美 Marilyn Wolf著
  • C#中string.Format输出内容中含有花括号的解决方法

    转载一篇 版权声明 本文为CSDN博主 九德真君 的原创文章 遵循CC 4 0 BY SA版权协议 转载请附上原文出处链接及本声明 原文链接 https blog csdn net lzdidiv article details 69469
  • python matrix用法_numpy中matrix使用方法

    matrix T transpose 返回矩阵的转置矩阵 matrix H hermitian conjugate transpose 返回复数矩阵的共轭元素矩阵 matrix I inverse 返回矩阵的逆矩阵 matrix A bas
  • 基于C语言实现的文件压缩算法-哈夫曼编码

    哈夫曼编码 是一种数据压缩算法 通常用于无损数据压缩 该算法是由 David A Huffman在麻省理工学院就读理学博士 Doctor of Science 的时候发明的 这位大佬在1952年发表了相关的一篇论文A Method for
  • 页面上input输入框宽度实现自动调整

    input输入框宽度实现自动调整 本文介绍两种方式 一是通过获取input内容的宽度实现输入框宽度的自动调整 二是通过内容字符串的长度乘以文本字体大小的积 来实现输入框宽度的自动调整 1 input输入框宽度的获取方式一 由于input输入
  • 利用maven项目创建一个web项目工程(图文详解)

    最近正开始学习java 老师布置的第一个作业便是用maven项目创建一个web项目工程 不会 跑去百度了半天 跳出来的全是我们csdn的教程 但到创建资源包的时候就没法跟着做了 因为显示已存在 没法跟着创建了 那些文章基本一样的讲法 都是默
  • 超详细的用IDEA整合SSM框架和profile 配置环境

    SSM作为现在最流行的开发框架 很大的提升了开发效率 一些同学在SSM基础上的整合一些更实用的开发基础框架 被用来作为快速开发的基础框架 本次实践主要是以下3个目标 从最基础的SSM框架做起 摸索和处理SSM框架整合中可能会遇到的问题 使用
  • 手机知识:手机的快充技术是什么,看完本文你就懂了

    目录 1 什么是手机快充 2 目前主流的手机快充协议 2 1 PD协议 2 2 PE协议 联发科 2 3 QC协议 高通 2 4 VOOC闪充 OPPO厂商 2 5 SCP FCP闪充 华为厂商 2 6 FlashCharge闪充 Vivo
  • 【前后端数据交互:Axios】

    前后端数据交互 Axios Axios 介绍 在前端页面展示的数据大多数都是通过访问一个API获取的 做这件事的方法有好几种 例如jquery ajax vue resource axios 而vue resource是vue插件 但3版本
  • 基于RGB颜色空间使用OpenCV-Python实现照片换底

    前往老猿Python博文目录 https blog csdn net LaoYuanPython 一 引言 前一阵子家人报考教师资格证考试 因报名需要将蓝底的数字相片换成白底的 老猿虽然在学习图像处理相关开发技术 但并没有熟练使用的图像编辑
  • BigDecimal精度问题

    BigDecimal精度问题 在近来项目展示价格的时候 遇到了一个问题 一个价格为99999 999的商品在购物车中的展示却是100000 00 原因归结于在原项目代码中 是采用BigDecimal的格式 然而前端需要展示的时候 采用的却是
  • .NET6.0的日志组件Log4net

    前言 不允许让没有任何日志监控的项目上线 所以说真正开发起来必须要有监控 相当于多一双眼睛帮着我们看项目在运行时会不会有什么问题 我们要不断的在每个环节写日志 这样发生异常我们可以快速知道哪里有问题了 就可以快速解决 目录 一 Log4ne
  • addEventListener()方法第三个参数(useCapture)与浏览器事件触发阶段

    最近面试中有被问到EventTarget addEventListener 方法的第三个参数useCapture 此方法就不着重讲解了 同时该方法的第三个参数可以传一个对象 可以参考mdn文档 讲解的很详细EventTarget addEv