JavaScript事件传播实战

news2024/9/20 22:57:03

上篇文章我们学习了事件传播的冒泡和捕获两种类型,现在我们在实际项目中演示一下;

● 首先我们先定义一个随机数

const randomInt = (min, max) => Math.floor(Math.random() * (max - min + 1) + min);

● 接着,我们使用随机数来创建随机的rgb,来实现随机颜色

const randomInt = (min, max) =>
  Math.floor(Math.random() * (max - min + 1) + min);

const randomColor = () =>
  `rgb(${randomColor(0, 255)},${randomColor(0, 255)},${randomColor(0, 255)}})`;

● 接着我们来获取导航栏的连接,实现点击一下,随机更换颜色

const randomInt = (min, max) =>
  Math.floor(Math.random() * (max - min + 1) + min);

const randomColor = () =>
  `rgb(${randomColor(0, 255)},${randomColor(0, 255)},${randomColor(0, 255)}})`;

document.querySelector('.nav__link').addEventListener('click', function (e) {
  this.style.backgroundColor = randomColor();
});

在这里插入图片描述

● 接着我们将这个元素的父级元素全部添加上这样的点击事件

const randomInt = (min, max) =>
  Math.floor(Math.random() * (max - min + 1) + min);

const randomColor = () =>
  `rgb(${randomInt(0, 255)},${randomInt(0, 255)},${randomInt(0, 255)})`;

document.querySelector('.nav__link').addEventListener('click', function (e) {
  this.style.backgroundColor = randomColor();
});

document.querySelector('.nav__links').addEventListener('click', function (e) {
  this.style.backgroundColor = randomColor();
});

document.querySelector('.nav').addEventListener('click', function (e) {
  this.style.backgroundColor = randomColor();
});

在这里插入图片描述

● 我们会发现当我们点击子元素时候,点击事件会被触发,他的父元素也会被触发,这是因为当你点击子元素时,事件会向上冒泡到父元素,也就是说会在父元素上触发相同的事件。这种行为称为事件冒泡。

● 我们可以查看一下事件的源事件和发生事件

const randomInt = (min, max) =>
  Math.floor(Math.random() * (max - min + 1) + min);

const randomColor = () =>
  `rgb(${randomInt(0, 255)},${randomInt(0, 255)},${randomInt(0, 255)})`;

document.querySelector('.nav__link').addEventListener('click', function (e) {
  this.style.backgroundColor = randomColor();
  console.log('LINK', e.target, e.currentTarget);
});

document.querySelector('.nav__links').addEventListener('click', function (e) {
  this.style.backgroundColor = randomColor();
  console.log('LINKS', e.target, e.currentTarget);
});

document.querySelector('.nav').addEventListener('click', function (e) {
  this.style.backgroundColor = randomColor();
  console.log('NAV', e.target, e.currentTarget);
});

在这里插入图片描述

我们发现触发事件源事件都是相同的,但是此刻变化的事件是各自自己;

● 当然,我们也可以手动去停止事件传播

const randomInt = (min, max) =>
  Math.floor(Math.random() * (max - min + 1) + min);

const randomColor = () =>
  `rgb(${randomInt(0, 255)},${randomInt(0, 255)},${randomInt(0, 255)})`;

document.querySelector('.nav__link').addEventListener('click', function (e) {
  this.style.backgroundColor = randomColor();
  console.log('LINK', e.target, e.currentTarget);
  e.stopPropagation(); //停止事件传播
});

document.querySelector('.nav__links').addEventListener('click', function (e) {
  this.style.backgroundColor = randomColor();
  console.log('LINKS', e.target, e.currentTarget);
});

document.querySelector('.nav').addEventListener('click', function (e) {
  this.style.backgroundColor = randomColor();
  console.log('NAV', e.target, e.currentTarget);
});

在这里插入图片描述

● 我们可以通过事件类型的第三个参数来设置事件的传播类型,默认是flase,即冒泡

const randomInt = (min, max) =>
  Math.floor(Math.random() * (max - min + 1) + min);

const randomColor = () =>
  `rgb(${randomInt(0, 255)},${randomInt(0, 255)},${randomInt(0, 255)})`;

document.querySelector('.nav__link').addEventListener('click', function (e) {
  this.style.backgroundColor = randomColor();
  console.log('LINK', e.target, e.currentTarget);
  e.stopPropagation(); //停止事件传播
});

document.querySelector('.nav__links').addEventListener('click', function (e) {
  this.style.backgroundColor = randomColor();
  console.log('LINKS', e.target, e.currentTarget);
});

document.querySelector('.nav').addEventListener(
  'click',
  function (e) {
    this.style.backgroundColor = randomColor();
    console.log('NAV', e.target, e.currentTarget);
  },
  true
);

在这里插入图片描述

● 当我们将第三个参数设置为true,事件传播就会被设置为捕获,设置为捕获只会,刚开始是从父级元素开始变化,之后向下传播!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1840122.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

osi七层参考模型和tcp/ip模型的区别与相似之处

osi七层参考模型: 2.tcp/ip四层参考模型: osi七层参考模型与tcp/ip四层参考模型的相似与区别: 相同点: 2者都是模型化层次化 下层对上层提供服务支持 每层协议彼此相互独立 不同点:OSI先有模型才有协议 TCP/IP先有…

目标检测数据集 - 零售食品LOGO检测数据集下载「包含VOC、COCO、YOLO三种格式」

数据集介绍:零售食品 LOGO 检测数据集,真实零售食品 LOGO 高质量商品图片数据,数据集含常见零售食品 LOGO 图片,包括饮料类、酒类、调味品类、膨化饼干类、巧克力类、常见零食类等等。数据集类别丰富,标注标签包含 150…

【因果推断python】44_评估因果模型2

目录 累积弹性曲线 累积增益曲线 考虑差异 关键思想 累积弹性曲线 再次考虑将价格转换为二元处理的说明性示例。我们会从我们离开的地方拿走它,所以我们有弹性处理带。我们接下来可以做的是根据乐队的敏感程度对乐队进行排序。也就是说,我们把最敏感…

Python学习打卡:day10

day10 笔记来源于:黑马程序员python教程,8天python从入门到精通,学python看这套就够了 目录 day1073、文件的读取操作文件的操作步骤open()打开函数mode常用的三种基础访问模式读操作相关方法read()方法readlines()方法readline()方法for循…

大模型微调和RAG的应用场景

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

进入docker容器内部操作mysql数据库

文章目录 1、查询docker容器2、进入mysql容器内部3、连接mysql数据库4、查询mysql所有的数据库5、使用某个数据库6、展示数据库中所有的表7、查询某张表8、断开mysql9、退出mysql容器 1、查询docker容器 [rootlocalhost ~]# docker ps CONTAINER ID IMAGE …

聚观早报 | 苹果AI功能将分批上线;三星Galaxy Z Fold6尺寸数据

聚观早报每日整理最值得关注的行业重点事件,帮助大家及时了解最新行业动态,每日读报,就读聚观365资讯简报。 整理丨Cutie 6月18日消息 苹果AI功能将分批上线 三星Galaxy Z Fold6尺寸数据 华为智慧PC新品AI能力升级 抖音出品《三星堆&am…

Spring MVC学习记录(基础)

目录 1.SpringMVC概述1.1 MVC介绍1.2 Spring MVC介绍1.3 Spring MVC 的核心组件1.4 SpringMVC 工作原理 2.Spring MVC入门2.1 入门案例2.2 总结 3.RequestMapping注解4.controller方法返回值4.1 返回ModelAndView4.2 返回字符串4.2.1 逻辑视图名4.2.2 Redirect重定向4.2.3 forw…

六面体大米装袋机长期稳定运行原因分析

随着现代化农业生产的发展,六面体大米装袋机已成为粮食加工行业不可或缺的重要设备。然而,如何确保这些机器长期稳定运行,提高生产效率,降低维护成本,一直是广大粮食加工企业关注的焦点。星派将为您揭示六面体大米装袋…

如何在前端项目中用字体图标替换图片,方便减小打包体积和统一切换颜色

1.进入阿里妈妈矢量图标图库 地址:阿里妈妈矢量图 2.搜索自己想要的图标 3.添加自己想要的图标 4.把刚才选的图标,添加到自己要下载的项目 5.把项目下载到本地 6.引入iconfont.css 在div上增加对应的类名就可以啦 下载的所有类名都在下面的demo_index…

测速小车模块

1.用途:广泛用于电机转速检测,脉冲计数,位置限位等。 2.有遮挡,输出高电平;无遮挡,输出低电平 接线 VCC 接电源正极3.3-5V GND 接电源负极 DO TTL开关信号输出 AO 此模块不起作用 测试原理和单位换算:…

如何定制Spring的错误json信息

一,前言 相信很多同学都有遇到过这样的spring错误信息。 在我们没有做catch处理时或者做全局的exceptionHandle时,Spring遇到抛出向外的异常时,就会给我们封装返回这么个格式的异常信息。 那么问题来了,我们能否对这个返回增加错…

[Linux] vi编辑器

命令模式&文本模式 命令模式就输入命令然后执行,文本模式就是系统把你的输入都当成写进文件里的字符 切换模式: 刚进入默认是命令模式,按: i I a A o O 进入文本模式, 通过他们进入文本模式有什么不同? 然后按esc进…

PLC模拟量和数字量到底有什么区别?

PLC模拟量和数字量的区别 在工业自动化领域,可编程逻辑控制器(PLC)是控制各种机械设备和生产过程的核心组件。PLC通过处理模拟量和数字量来实现对工业过程的精确控制。了解模拟量和数字量的区别对于设计高效、可靠的自动化系统至关重要。 1. …

vue3+ts 使用vue3-ace-editor实现Json编辑器

1、效果图 输入代码,点击格式化就出现以上效果,再点击压缩,是以下效果2、安装 npm i vue3-ace-editor 3、使用 新建aceConfig.js文件 // ace配置,使用动态加载来避免第一次加载开销 import ace from ace-builds// 导入不同的主…

查看服务器接口各行代码耗时的 linux 命令

如何通过命令来查看接口具体位置的耗时情况 首先然后找到需要执行查看耗时的方法执行查询命令 trace 首先 使用这个命令 curl -O https://arthas.aliyun.com/arthas-boot.jar java -jar arthas-boot.jar然后找到需要执行查看耗时的方法 复制出来的 是 com.a.tms.api.service.…

昇思MindSpore全场景深度学习框架总结

昇思MindSpore介绍 MindSpore是一个全场景深度学习框架,旨在实现易开发、高效执行、全场景统一部署三大目标,具体包括API友好、调试难度低、计算效率、数据预处理效率和分布式训练效率高以及支持云、边缘和端侧场景。 昇思MindSpore的各个扩展功能模块&…

基于JSP的高校毕业生就业满意度调查统计系统

开头语: 你好呀,我是计算机学长猫哥!如果有相关需求,文末可以找到我的联系方式。 开发语言:JSP 数据库:MySQL 技术:JSP技术 工具:MyEclipse、Tomcat、MySQL 系统展示 首页 用…

SPI协议——读取外部SPI Flash ID

简介: 单片机型号:stm32l431rct6 SPI Flash型号:W25Q32JVSSIQ 使用软件:CubeIDE 1. W25Q32JVSSIQ简介 我们通过SPI协议来读取 SPI Flash的厂商ID和芯片独一无二的ID,查数据的芯片手册可以看到如下重要点: …

pandas中的loc和iloc

loc和iloc的比较 .loc 和 .iloc 是 pandas 提供的两种不同的索引方法,它们的主要区别在于索引数据的依据: .loc: 基于标签的索引,使用 DataFrame 或 Series 的索引标签(即行名和列名)来获取数据。可以使用…