JS 事件捕获、事件冒泡、事件委托

js事件机制在开发中可以说时刻使用,例如dom绑定事件、监听其自身事件等。js事件机制有事件捕获、事件冒泡俩种机制,我们分别说下这俩种机制的使用场景。

一、概念

事件捕获顺序如下:
window > document > body > div

事件冒泡顺序如下:
div > body > document > window

可以看到事件捕获是从最外层元素开始,依次向内部元素传播,直到目标元素。而事件冒泡相反,从目标元素,依次向外部元素传播,直到最外层元素

在JavaScript中,我们可以使用addEventListener方法来绑定捕获和冒泡事件,下面俩种方式都可以,第三个参数默认为布尔值false,设为true则为捕获机制,默认为冒泡机制,也可以为object

element.addEventListener(event, handler, option);
element.addEventListener(event, handler, capture);

option包含如下可选属性:

属性作用
capture设置为捕获机制
once只调用一次
passive一个布尔值,设置为 true 时,表示 listener 永远不会调用 preventDefault()
signalAbortSignal,该 AbortSignal 的 abort() 方法被调用时,监听器会被移除

二、实践

事件冒泡:

<div class="div1"><div class="div2"><button>click me</button></div>
</div><script>let div1 = document.querySelector('.div1')let div2 = document.querySelector('.div2')let button = document.getElementsByTagName('button')[0]button.addEventListener('click', e => {console.log('button')}, {capture: false})div1.addEventListener('click', e => {console.log('div1')}, {capture: false})div2.addEventListener('click', e => {console.log('div2')}, {capture: false})window.addEventListener('click', e => {console.log('window')}, {capture: false})
</script>

打印下,可以看到,事件冒泡的执行顺序:
在这里插入图片描述
当然我们可以组织事件冒泡,方式如下:

// 非 IE 浏览器:
e.stopPropagation()
// IE 浏览器:
e.cancleBubble = true
// 同一节点,组织同一事件:
e.stopimmediatePropagation()

事件捕获:

<div class="div1"><div class="div2"><button>click me</button></div>
</div><script>let div1 = document.querySelector('.div1')let div2 = document.querySelector('.div2')let button = document.getElementsByTagName('button')[0]button.addEventListener('click', e => {console.log('button')}, {capture: true})div1.addEventListener('click', e => {console.log('div1')}, {capture: true})div2.addEventListener('click', e => {console.log('div2')}, {capture: true})window.addEventListener('click', e => {console.log('window')}, {capture: true})

打印下,可以看到事件捕获顺序:
在这里插入图片描述

三、事件委托

事件委托也称为事件代理(Event Delegation),事件委托是一种将事件处理程序绑定到一个父元素上,而不是将事件处理程序绑定到每个子元素上的技术。通过事件委托,可以减少事件处理程序的数量,提高性能和代码的可维护性

<ul><li>Pig</li><li>Cat</li><li>Dog</li><li>Tigger</li>
</ul><script>let ul = document.getElementsByTagName('ul')[0]ul.addEventListener('click' e => {console.log(e.target)})
</script>

四、组织浏览器默认行为

// 1、在IE浏览器中通过
e.returnValue = false// 2、在其他浏览器中调用方法
e.preventDefault()// 3、在jQuery中通过在事件回调利用
return false

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

物联网的商业模式洞察

大约在十年前&#xff08;2014年11月&#xff09;&#xff0c;全球知名管理思想家、哈佛商学院教授迈克尔波特与PTC前首席执行官吉姆赫普尔曼&#xff0c;在《哈佛商业评论》上联合撰写了一篇备受赞誉的文章&#xff0c;题为《智能互联产品如何改变竞争》。在这篇文章中&#x…

【自动驾驶系列丛书学习】2.《自动驾驶汽车环境感知》学习笔记

《自动驾驶技术概论》学习笔记 致谢&#xff1a;作者&#xff1a;甄先通、黄坚、王亮、夏添 -------------------------------------------------------------------------------------------------------- 笔记目录 《自动驾驶技术概论》学习笔记 1.自动驾驶环境感知概述…

LM2904DT运算放大器中文资料规格书PDF数据手册引脚图参数图片功能概述

产品概述&#xff1a; 该电路由两个独立的高增益运算放大器&#xff08;运算放大器&#xff09;组成&#xff0c;内部实现了频率补偿。它们专为汽车和工业控制系统而设计。该电路采用单电源供电&#xff0c;工作电压范围很广。低功耗与电源电压的大小无关。 应用领域包括传感…

网络基础『 序列化与反序列化』

&#x1f52d;个人主页&#xff1a; 北 海 &#x1f6dc;所属专栏&#xff1a; Linux学习之旅、神奇的网络世界 &#x1f4bb;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 文章目录 &#x1f324;️前言&#x1f326;️正文1.协议的重要性2.什么是序列化与反序列化&…

优雅的记录日志,拒绝打印模糊信息导致bug定位难

想必大家都有过这样的经历&#xff1a;在项目中遇到报错需要紧急修复时&#xff0c;却因为日志信息模糊不清&#xff0c;无法迅速准确地定位到错误源头&#xff0c;这确实让人感到十分苦恼和无奈。 在新入职一家公司并着手修改遗留bug时&#xff0c;经常发现之前的开发者并未记…

Redis 的 key 的过期策略是怎么实现的【经典面试题】

前言 在 Redis 中可以通过命令 expire 对指定的 key 值设置过期时间&#xff0c;在时间到了以后该键值对就会自动删除。 一个 Redis 中可能会存在很多的 key &#xff0c;而这些 key 中有很大的一部分都会有过期时间&#xff0c;那么 Redis 怎么知道哪些 key 已经到了过期时间需…

大语言模型系列-中文开源大模型

文章目录 前言一、主流开源大模型二、中文开源大模型排行榜 前言 近期&#xff0c;OpenAI 的主要竞争者 Anthropic 推出了他们的新一代大型语言模型 Claude 3&#xff0c;该系列涵盖了三个不同规模的模型&#xff1a;Opus、Sonnet 和 Haiku。 Claude 3声称已经全面超越GPT-4。…

Python AI 之Stable-Diffusion-WebUI

Stable-Diffusion-WebUI简介 通过Gradio库&#xff0c;实现Stable Diffusion web 管理接口 Windows 11 安装Stable-Diffusion-WebUI 个人认为Stable-Diffusion-WebUI 官网提供的代码安装手册/自动安装不适合新手安装&#xff0c;我这边将一步步讲述我是如何搭建Python Conda…

WorkPlus Meet提供高效、安全视频会议解决方案

WorkPlus Meet是一款私有部署和定制化的视频会议解决方案&#xff0c;为企业提供高效、安全的远程协作平台。随着全球数字化转型的加速&#xff0c;视频会议已成为企业必不可少的工作工具&#xff0c;而WorkPlus Meet的私有部署和定制化功能&#xff0c;为企业提供了更大的控制…

HYBBS 表白墙网站PHP程序源码,支持封装成APP

PHP表白墙网站源码&#xff0c;适用于校园内或校区间使用&#xff0c;同时支持封装成APP。告别使用QQ空间的表白墙。 简单安装&#xff0c;只需PHP版本5.6以上即可。 通过上传程序进行安装&#xff0c;并设置账号密码&#xff0c;登录后台后切换模板&#xff0c;适配手机和PC…

2024年最新阿里云和腾讯云云服务器价格租用对比

2024年阿里云服务器和腾讯云服务器价格战已经打响&#xff0c;阿里云服务器优惠61元一年起&#xff0c;腾讯云服务器61元一年&#xff0c;2核2G3M、2核4G、4核8G、4核16G、8核16G、16核32G、16核64G等配置价格对比&#xff0c;阿腾云atengyun.com整理阿里云和腾讯云服务器详细配…

Kotlin:枚举类

点击查看枚举类中文文档 点击查看枚举类英文文档 枚举类的最基本的用法是实现类型安全的枚举&#xff1a; enum class Direction {NORTH, SOUTH, WEST, EAST }每个枚举常量都是一个对象。枚举常量用逗号分隔。 初始化 因为每一个枚举都是枚举类的实例&#xff0c;所以他们可…

Sass语法小册-笔记迁移

Sass 1、extend 一个元素使用的样式与另一个元素完全相同&#xff0c;但又添加了额外的样式。 .a{width: 100px;height: 100px;background-color: greenyellow;} .b{extend .a;background-color: orangered;//覆盖.a继承来的背景色 } 结果-》 .b[data-v-5d9daadb] {backgrou…

Github 2024-03-11 开源项目周报 Top15

根据Github Trendings的统计,本周(2024-03-11统计)共有15个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目4TypeScript项目3Jupyter Notebook项目3C#项目1HTML项目1CSS项目1Dart项目1Lua项目1Shell项目1Rust项目1Java项目1C++项目1屏幕截图转…

HTML 语义化:构建优质网页的关键

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

蓝桥杯真题讲解:整数删除

蓝桥杯真题讲解&#xff1a;整数删除 一、视频讲解二、暴力代码三、正解代码 一、视频讲解 蓝桥杯真题讲解&#xff1a;整数删除 二、暴力代码 // 暴力模拟 #include<bits/stdc.h> #define int long long #define INF 0x3f3f3f3f3f3f3f using namespace std; const in…

Java后端八股文之Redis

文章目录 1. Redis是什么&#xff1f;2. Redis为什么这么快&#xff1f;3. 为什么要使用缓存&#xff1f;4. Redis几种使用场景&#xff1a;5. Redis的Zset底层为什么要使用跳表而不是平衡树、红黑树或者B树&#xff1f;6.Redis持久化6.1 什么是RDB持久化6.1.1RDB创建快照会阻塞…

蓝桥杯[OJ 1621]挑选子串-CPP-双指针

目录 一、题目描述&#xff1a; 二、整体思路&#xff1a; 三、代码&#xff1a; 一、题目描述&#xff1a; 二、整体思路&#xff1a; 要找子串&#xff0c;则必须找头找尾&#xff0c;找头可以遍历连续字串&#xff0c;找尾则是要从头的基础上往后遍历&#xff0c;可以设头…

STM32 学习11 独立看门狗与窗口看门狗

STM32 学习11 独立看门狗与窗口看门狗 一、**看门狗概述**二、**STM32中的看门狗类型**1. 独立看门狗&#xff08;IWDG&#xff09;&#xff08;1&#xff09;基本概念&#xff08;2&#xff09;独立看门狗框图&#xff08;3&#xff09;独立看门狗配置步骤&#xff08;4&#…

【机器学习】科学库使用第1篇:机器学习(常用科学计算库的使用)基础定位、目标【附代码文档】

机器学习&#xff08;科学计算库&#xff09;完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;机器学习&#xff08;常用科学计算库的使用&#xff09;基础定位、目标&#xff0c;机器学习概述&#xff0c;1.1 人工智能概述&#xff0c;1.2 人工智能发展历…