当前位置: 首页 > news >正文

js:javascript中的事件体系:常见事件、事件监听、事件移除、事件冒泡、事件捕获、事件委托、阻止事件

参考资料

  • 事件介绍
  • Element事件

目录

    • 常见的事件
      • 鼠标事件
      • 键盘事件
      • Focus events
    • 添加事件监听
      • 方式一:addEventListener()(推荐)
      • 方式二:事件处理器属性
      • 方式三:内联事件处理器(不推荐)
    • 移除监听器
      • 方式一:removeEventListener
      • 方式二:AbortController
    • 事件的控制
      • 阻止默认行为 preventDefault
      • 事件冒泡
      • 阻止事件冒泡 stopPropagation
      • 事件捕获
      • 事件委托

常见的事件

鼠标事件

事件触发时机
click鼠标的主键在一个元素上被按下和放开时
dblclick在单个元素上单击两次鼠标的主按钮时
contextmenu在用户尝试打开上下文菜单时
mousedown鼠标按钮在元素内按下时
mouseup鼠标按钮在元素内释放时
mouseenter鼠标首次移动到元素的激活区域内时
mouseleave鼠标指针移出某个元素时被触发
mousemove鼠标的光标在元素内移动时

键盘事件

事件触发时机
keypress当按下产生字符或符号值的键时已弃用
keydown键盘按键按下时(所有按键均会触发)
keyup按键被松开时触发

Focus events

事件触发时机
focus元素获取焦点时
blur元素失去焦点的时

添加事件监听

方式一:addEventListener()(推荐)

语法

addEventListener(type, listener);
addEventListener(type, listener, options);
addEventListener(type, listener, useCapture);

参数

参数名类型必须说明
typeString监听事件类型(大小写敏感)
listenerFuncion当所监听的事件类型触发时,会接收到一个事件通知Event对象
optionsObjcet可选一个指定有关 listener 属性的可选参数对象
useCaptureBoolean可选false事件冒泡;true事件捕获

options可选值

参数名类型必须说明
captureBoolean可选事件捕获
onceBoolean可选最多只调用一次 listener
passiveBoolean可选表示 listener 永远不会调用 preventDefault()
signalAbortSignal可选该 AbortSignal 的 abort() 方法被调用时,监听器会被移除。

示例:绑定input获得焦点事件

<inputtype="text"id="input-name"
/><script>let inputName = document.querySelector('#input-name')inputName.addEventListener('focus', (event) => {console.log(event)})
</script>

addEventListener 方式可以在单个事件上添加多个监听器

<button>按钮</button><script>const btn = document.querySelector('button')// 添加多个事件处理器btn.addEventListener('click', () => {console.log('处理器1')})btn.addEventListener('click', () => {console.log('处理器2')})
</script>

方式二:事件处理器属性

示例:为div元素绑定click点击事件

<style>#box {width: 200px;height: 200px;background-color: gray;}
</style><div id="box"></div><script>let box = document.querySelector('#box')box.onclick = (event) => {console.log(event)}
</script>

事件处理器属性,不能为一个事件添加一个以上的处理程序,因为任何后续尝试都会覆写较早设置的属性

方式三:内联事件处理器(不推荐)

<inputtype="text"onfocus="handleFocus()"
/><script>function handleFocus(event) {let e = event || window.eventconsole.log(e)}
</script>

你永远不应该使用 HTML 事件处理器属性——那些已经过时了,使用它们是不好的做法。

移除监听器

方式一:removeEventListener

<button>按钮</button><script>function handleButtonClick(event) {console.log(event)}const btn = document.querySelector('button')// 添加事件处理器btn.addEventListener('click', handleButtonClick)// 移除监听器btn.removeEventListener('click', handleButtonClick)
</script>

方式二:AbortController

<button>按钮</button><script>function handleButtonClick(event) {console.log(event)}const controller = new AbortController()const btn = document.querySelector('button')// 添加事件处理器btn.addEventListener('click', handleButtonClick, {signal: controller.signal, // 向该处理器传递 AbortSignal})// 移除任何/所有与该控制器相关的事件处理器controller.abort()
</script>

事件的控制

阻止默认行为 preventDefault

表单中只有一个输入框,默认键盘敲下回车就会提交表单,可以阻止这种默认行为

<!-- 表单 -->
<form id="form"><inputtype="text"id="name"/>
</form><script>const form = document.querySelector('#form')form.addEventListener('submit', (e) => {e.preventDefault()console.log('submit');})
</script>

事件冒泡

当点击button时,外层容器也会接收到click事件

<div id="box"><button>点击</button>
</div><script>const btn = document.querySelector('button')const box = document.querySelector('#box')btn.addEventListener('click', (e) => {console.log('btn click')})box.addEventListener('click', (e) => {console.log('box click')})
</script>

输出顺序

btn click
box click

阻止事件冒泡 stopPropagation

使用stopPropagation可以阻止事件继续传播

<div id="box"><button>点击</button>
</div><script>const btn = document.querySelector('button')const box = document.querySelector('#box')btn.addEventListener('click', (e) => {e.stopPropagation() // 阻止冒泡console.log('btn click')})box.addEventListener('click', (e) => {console.log('box click')})
</script>

事件捕获

<div id="box"><button>点击</button>
</div><script>const btn = document.querySelector('button')const box = document.querySelector('#box')btn.addEventListener('click',(e) => {console.log('btn click')},{ capture: true })box.addEventListener('click',(e) => {console.log('box click')},{ capture: true })
</script>

输出(和冒泡顺序相反)

box click
btn click

事件委托

利用事件冒泡可以实现事件委托,简化代码

简单的事件监听

<div id="box"><button id="buttonA">点击A</button><button id="buttonB">点击B</button>
</div><script>const buttonA = document.querySelector('#buttonA')const buttonB = document.querySelector('#buttonB')buttonA.addEventListener('click', (e) => {console.log('buttonA click')})buttonB.addEventListener('click', (e) => {console.log('buttonB click')})
</script>

使用事件委托,仅用监听外层元素的事件

<div id="box"><button id="buttonA">点击A</button><button id="buttonB">点击B</button>
</div><script>const box = document.querySelector('#box')box.addEventListener('click', (e) => {// 事件触发元素 buttonA / buttonBconsole.log(e.target)// 获取元素id属性let targetId = e.target.getAttribute('id')console.log(targetId)// 处理元素 boxconsole.log(e.currentTarget)})
</script>

参考文章

  1. 如何将事件作为参数传递给 JavaScript 中的内联事件处理程序?

相关文章:

js:javascript中的事件体系:常见事件、事件监听、事件移除、事件冒泡、事件捕获、事件委托、阻止事件

参考资料 事件介绍Element事件 目录 常见的事件鼠标事件键盘事件Focus events 添加事件监听方式一&#xff1a;addEventListener()&#xff08;推荐&#xff09;方式二&#xff1a;事件处理器属性方式三&#xff1a;内联事件处理器&#xff08;不推荐&#xff09; 移除监听器方…...

【数据结构】特殊矩阵的压缩存储

&#x1f387;【数据结构】特殊矩阵的压缩存储&#x1f387; &#x1f308; 自在飞花轻似梦,无边丝雨细如愁 &#x1f308; &#x1f31f; 正式开始学习数据结构啦~此专栏作为学习过程中的记录&#x1f31f; 文章目录 &#x1f387;【数据结构】特殊矩阵的压缩存储&#x1f38…...

在layui中使用vue,使用vue进行页面数据部分数据更新

layui是一款非常优秀的框架&#xff0c;使用也非常的广泛&#xff0c;许多后台管理系统都使用layui&#xff0c;简单便捷&#xff0c;但是在涉及页面部分数据变化&#xff0c;就比较难以处理&#xff0c;比如一个页面一个提交页&#xff0c;提交之后部分数据实时进行更新&#…...

Vue中如何进行数据导入与Excel导入

Vue中如何进行数据导入与Excel导入 Vue是一款非常流行的JavaScript框架&#xff0c;它提供了一套用于构建用户界面的工具和库。在Vue中&#xff0c;我们可以使用多种方式来导入数据&#xff0c;包括从服务器获取数据、从本地存储获取数据、从文件中读取数据等等。其中&#xf…...

git 的基本操作

1. git建立本地仓库 在想要建立的目录下输入命令 git init 我们可以看一下 .git目录下有什么 2. 配置git本地仓库 配置用户的 name 和 email 命令&#xff1a;git config [...] 配置完后&#xff0c;我们像查看一下 刚才的配置 2.1 查看配置命令 git config -l 2.2 删除…...

搭建Vue项目以及项目的常见知识

前言&#xff1a;使用脚手架搭建vue项目&#xff0c;使用脚手架可以开发者能够开箱即用快速地进行应用开发而开发。 搭建 #创建一个基于 webpack 模板的新项目 vue init webpack my-project #选择所需要的选项如图&#xff1a; cd my-project npm run dev访问localhost:808…...

TypeScript ~ TS Webpack构建工具 ⑦

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; TypeScript ~ TS &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &…...

Rust 自建HTTP Server支持图片响应

本博客是在杨旭老师的 rust web 全栈教程项目基础上进行修改&#xff0c;支持了图片资源返回&#xff0c;杨旭老师的rust web链接如下&#xff1a; https://www.bilibili.com/video/BV1RP4y1G7KFp1&vd_source8595fbbf160cc11a0cc07cadacf22951 本人默认读者已经学习了相关…...

[游戏开发][Unity]UnityWebRequest使用大全

首先记录个小问题 使用new UnityWebRequest的方式&#xff0c;最终的downloadHandler是个null 使用UnityWebRequest.Get的方式&#xff0c;最终的downloadHandler会是DownloadHandlerBuffer 从网站或本地下载内容&#xff0c;包括文本或二进制数据 IEnumerator downloadfile(st…...

如何使用Fiddler对手机进行弱网测试?(干货教程)

1.首先&#xff0c;fiddler连接手机 1)Tools->Options->Connections->设置端口8888&#xff0c;勾选Allow remote computers to connect 2)配置手机 注&#xff1a;手机和电脑需要在同一局域网下 手机进入网络详情&#xff0c;将代理改为手动 设置主机名、端口 主机…...

专业科普:什么是单片机?

一、什么是单片机 单片机诞生于20世纪70年代末&#xff0c;它是指一个集成在一块芯片上的完整计算机系统。单片机具有一个完整计算机所需要的大部分部件&#xff1a;CPU、内存、内部和外部总线系统&#xff0c;目前大部分还会具有外存。同时集成诸如通讯接口、定时器&#xff…...

深度学习-第T11周——优化器对比实验

深度学习-第T11周——优化器对比实验 深度学习-第T11周——优化器对比实验一、前言二、我的环境三、前期工作1、导入数据集2、查看图片数目3、查看数据 四、数据预处理1、 加载数据1、设置图片格式2、划分训练集3、划分验证集4、查看标签 2、数据可视化3、检查数据4、配置数据集…...

基于Dlib的疲劳检测系统

需要源码的朋友可以私信我 基于Dlib的疲劳检测系统 1、设计背景及要求2、系统分析3、系统设计3.1功能结构图3.2基于EAR、MAR和HPE算法的疲劳检测3.2.1基于EAR算法的眨眼检测3.2.2基于MAR算法的哈欠检测3.3.3基于HPE算法的点头检测 4、系统实现与调试4.1初步实现4.2具体实现过程…...

three.js通过CubeTexture加载环境贴图,和RGBELoader加载器加载hdr环境贴图

一、使用CubeTexture进行环境贴图 1.CubeTexture使用介绍 Three.js中可以通过使用CubeTexture进行环境贴图&#xff0c;CubeTexture需要将6张图片&#xff08;正面、反面、上下左右&#xff09;包装成一个立方体纹理。下面是一个简单的例子&#xff1a; 首先需要加载六张贴图…...

pycharm中Terminal输入sqlite3,出现无法将sqlite项识别为cmdlet**的解决方法

前提&#xff1a;本机上已安装sqlite3&#xff0c;安装详见&#xff1a;pycharm社区版中安装配置sqlite3_Sunshine_0426的博客-CSDN博客 问题&#xff1a; cmd命令行中或pycharm中Terminal行输入sqlite3 db.sqlite3命令后&#xff0c;出现“无法将“sqlite3”项识别为 cmdlet…...

VSCode 安装配置教程详解包含c++环境配置方法

vscode安装教程及c环境配置详解 vscode下载安装下载C扩展插件VScode C环境配置配置环境变量检查 MinGW 安装配置编译器&#xff1a;配置构建任务检查是否安装了编译器配置完毕 vscode下载安装 地址&#xff1a;官网下载地址 直接打开下载好的.exe文件进行安装即可&#xff0…...

Baumer工业相机堡盟工业相机如何通过BGAPISDK将图像放大缩小显示(C#)

Baumer工业相机堡盟工业相机如何通过BGAPISDK将图像放大缩小显示&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机BGAPISDK和图像放大缩小的技术背景Baumer工业相机通过BGAPISDK将相机图像图像放大缩小功能1.引用合适的类文件2.通过BGAPISDK将相机图像图像放大缩小功能…...

8.1 PowerBI系列之DAX函数专题-进阶-解决列排序对计算的影响

需求 下列矩阵中&#xff0c;在月份列不按照原始数据的month_no排列时&#xff0c;能正确计算销售额占比&#xff0c;但是当月份按照month_no排序时就会出错&#xff0c;需要解决这个问题。 实现 month % divide([amount],calculate([amount],all(date[month desc]))) //排…...

Java的第十二篇文章——集合

目录 第十二章 集合 学习目标 1. 集合框架的由来 2. 集合框架的继承体系 3. Collection接口 3.1 Collection接口的常用方法 4. Iterator接口 4.1 Iterator接口的抽象方法 4.2 获取迭代器接口实现类 4.3 迭代器的实现原理 4.4 并发修改异常 4.5 集合存储自定义对象并…...

docker 镜像制作 与 CI/CD

目录 镜像到底是什么&#xff1f; 使用docker创建镜像 步骤&#xff1a; 1、编辑Dockerfile&#xff08;Dockerfile是docker制作镜像的配方文件&#xff09; 2、编辑requirements.txt文件 3、编辑app.py文件&#xff0c;我们的程序文件 4、生成镜像文件 5、查看生成的镜…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...

在 Spring Boot 项目里,MYSQL中json类型字段使用

前言&#xff1a; 因为程序特殊需求导致&#xff0c;需要mysql数据库存储json类型数据&#xff0c;因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...