js 事件流、事件冒泡、事件捕获、阻止事件的传播

2023-09-21 18:01:23

事件流

js 事件的执行过程分为捕获阶段(由外层节点传播到内层节点)和冒泡阶段(由内层节点传播到外层节点),即先执行捕获阶段的代码,后执行冒泡阶段的代码

事件冒泡

js 事件中的代码默认在冒泡阶段执行,以下图为例,点击box2时,会依次触发box2的点击事件【冒泡阶段执行】、box1的点击事件【冒泡阶段执行】、window的点击事件【冒泡阶段执行】。
在这里插入图片描述

  window.addEventListener("click", function (e) {
    if (e.target.id === "box2") {
      console.log("点击box2触发window的click事件");
    } else if (e.target.id === "box1") {
      console.log("点击box1触发window的click事件");
    } else {
      console.log("触发了window的click事件");
    }
  });

  document.getElementById("box1").addEventListener("click", function (e) {
    console.log("触发了box1的click事件");
  });

  document.getElementById("box2").addEventListener("click", function (e) {
    console.log("触发了box2的click事件");
  });

在这里插入图片描述

事件捕获

给 addEventListener 函数的第三个参数传入 true ,便会将事件中的代码改为在捕获阶段执行,此时点击box2时,会依次触发window的点击事件【捕获阶段执行】,box2的点击事件【冒泡阶段执行】,box1的点击事件【冒泡阶段执行】。

  window.addEventListener(
    "click",
    function (e) {
      if (e.target.id === "box2") {
        console.log("点击box2触发window的click事件");
      } else if (e.target.id === "box1") {
        console.log("点击box1触发window的click事件");
      } else {
        console.log("触发了window的click事件");
      }
    },
    //改为在捕获阶段执行
    true
  );

  document.getElementById("box1").addEventListener("click", function (e) {
    console.log("触发了box1的click事件");
  });

  document.getElementById("box2").addEventListener("click", function (e) {
    console.log("触发了box2的click事件");
  });

在这里插入图片描述

阻止事件的传播

使用

e.stopPropagation()

范例:点击box2时,只触发box2的点击事件,不触发box1和window的点击事件

  window.addEventListener("click", function (e) {
    if (e.target.id === "box2") {
      console.log("点击box2触发window的click事件");
    } else if (e.target.id === "box1") {
      console.log("点击box1触发window的click事件");
    } else {
      console.log("触发了window的click事件");
    }
  });

  document.getElementById("box1").addEventListener("click", function (e) {
    console.log("触发了box1的click事件");
  });

  document.getElementById("box2").addEventListener("click", function (e) {
    console.log("触发了box2的click事件");
    // 阻止事件继续传播
    e.stopPropagation();
  });

实战范例

需求:

  1. 点击box2时,只执行window点击事件中通过点击box2触发window点击事件的代码,不执行box1的点击事件代码
  2. 点击box1时,只执行box1的点击事件代码,不执行window点击事件中通过点击box1触发window点击事件的代码
  window.addEventListener(
    "click",
    function (e) {
      if (e.target.id === "box2") {
        console.log("点击box2触发window的click事件");
        // 阻止事件继续传播
        e.stopPropagation();
      } else if (e.target.id === "box1") {
        return;
        console.log("点击box1触发window的click事件");
      } else {
        console.log("触发了window的click事件");
      }
    },
    true
  );

  document.getElementById("box1").addEventListener("click", function (e) {
    console.log("触发了box1的click事件");
  });

  document.getElementById("box2").addEventListener("click", function (e) {
    console.log("触发了box2的click事件");
  });
更多推荐

HTTP协议的请求方式有哪些

HTTP请求方式是指客户端向服务器发送请求时所使用的方法,常用的请求方式有GET、POST、PUT、DELETE、HEAD、OPTIONS等。这些请求方式各自有着不同的特点和用途,下面将逐一介绍。GET请求GET请求是最常用的请求方式,用于向服务器请求获取某个资源。GET请求的参数会附加在URL的后面,以问号(?)分隔

API接口大全:常用、热门、免费的都有

常用、热门、免费的第三方接口应有尽有…二次号查询:通过手机号查询是否二次入网,直连三大运营商,精准查询。反欺诈(羊毛盾):反机器欺诈,检测异常IP、异常手机号。IP应用场景-IPv4,IPv4应用场景是获取IP场景属性的在线调用接口,具备识别IP真人度,提升风控和反欺诈等业务能力。IP应用场景基于地理和网络特征的IP场

postgresql教程

postgreSQL教程目录postgreSQL创建数据库的方式:postgreSQL删除数据库的方式:PostgreSQL创建表格postgre删除表格:postgreSQLINSERTINTO语句postgreSQLSELECT语句:postgresql索引:什么情况下要避免使用索引?postgreSQL创建数据库

DC/DC模块升压电源直流可调高压输出隔离升压变换器5v12v24v转60V80V110V150V220V300V400V500V800V1000V

特点效率高达80%以上1*2英寸标准封装单电压输出价格低稳压输出工作温度:-40℃~+85℃阻燃封装,满足UL94-V0要求温度特性好可直接焊在PCB上应用HRBW2~40W系列模块电源是一种DC-DC升压变换器。该模块电源的输入电压分为:4.5~9V、9~18V、及18~36V、36~72VDC标准(2:1)宽输入电

Go面试题:锁的实现原理sync-mutex篇

在Go中,主要实现了两种锁:sync.Mutex(互斥锁)以及sync.RWMutex(读写锁)。本篇主要给大家介绍sync.Mutex的使用和实现原理。文章目录为什么需要锁在Go中对于并发程序进行公共资源的访问的限制最常用的就是互斥锁(sync.mutex)的方式实现原理锁的两种模式注意事项为什么需要锁在高并发下或多

阿里云交互式建模(PAI-DSW)训练并微调推理ChatGLM模型

参考内容为《轻量微调和推理ChatGLM模型实践》点击“交互式建模(DSW)”,然后选择“创建实例”写上实例名称,然后选择GPU规格,选择“ecs.gn6v-c8g1.2xlarge(8vCPU,32GB)”页面往下拉选择“pytorch:1.12-gpu-py39-cu113-ubuntu20.04”这个官方镜像,然

数据分析-利用gpt进行电商平台用户细分专题分析(RFM模型)

promt1:假如你是某电商平台的资深数据分析师,现在要开展用户细分专题分析,目的是根据一些特征将用户分成不同类别,然后针对不同的人群采用精细化运营策略。请基于业务背景和目的,构建该专题分析框架output1:在电商平台中进行用户细分专题分析是一项复杂但非常有价值的任务。这样的分析可以帮助平台更精准地了解用户需求,从而

20230912在ubuntu18.04下使用pigz来提高tar命令压缩解压缩的速度

20230912在ubuntu18.04下使用pigz来提高tar命令压缩解压缩的速度2023/9/1522:19https://blog.csdn.net/wb4916/article/details/12844729820221226编译Toybrick的TB-RK3588X开发板的Android12系统2-SDK

设计的思考,设计是什么? 优漫动游

设计是什么?这是个大问题,但也是个小众问题。可能有很多人会说,“设计就是“你所需要的”东西。”这个回答或许说的很直白:因为有很多人都是从自己的角度去思考问题。”——我想做好一件事情。”——这是我喜欢做好一件事情的动力之一。”——但是这些解释是片面的。为什么?因为大家都会发现:自己所做的任何事情都不可能解决所有的问题。而

图论第四天|127. 单词接龙、841. 钥匙和房间、463. 岛屿的周长

127.单词接龙★文档讲解:代码随想录-127.单词接龙状态:开始学习。(★:需要多次回顾并重点回顾)思路:本题需要解决两个问题:图中的线是如何连在一起的题目中并没有给出点与点之间的连线,而是要我们自己去连,条件是字符只能差一个,所以判断点与点之间的关系,要自己判断是不是差一个字符,如果差一个字符,那就是有链接。起点和

大数据快速入门开发环境篇:CentOS 7安装配置Hadoop大数据框架开发环境

注意:在开始安装之前,请确保您的CentOS7系统已经正确安装和配置了Java。Hadoop需要Java来运行。目录一、下载与配置Hadoop框架:1.1、下载与环境变量设置1.2、XML配置文件Hadoop设置1.3、格式化HDFS二、Hadoop3.x版本中hdfs命令的问题解决与配置方法2.1、问题描述与解决方法

热文推荐