深入理解Javascript事件处理机制

news/2024/10/18 2:25:20/

深入理解javascript事件处理机制

前言

在开发web应用程序时,事件处理机制是javascript中至关重要的一部分。许多高级特性,如事件冒泡、事件捕获和事件委托,都是通过事件处理来实现的。熟练掌握这些技术可以帮助我们更好地组织代码、提高代码效率并减少资源浪费

1️⃣事件捕获:

事件捕获是一种从根节点到目标节点的事件传递方式

2️⃣事件冒泡:

事件冒泡是一种从目标节点到根节点的事件传递方式

3️⃣事件流

JavaScript事件流是指当HTML页面中发生事件时,处理该事件的顺序和路径

通常情况下,事件流由三个阶段构成:捕获阶段,目标阶段和冒泡阶段

默认情况下,JavaScript事件执行顺序是:事件捕获—>目标阶段—>事件冒泡
在这里插入图片描述

4️⃣控制事件的处理

使用addEventListener()函数
用来控制事件是在事件捕获阶段还是在事件冒泡阶段响应

  • 当参数为 true 时,事件监听器将会在事件捕获阶段中执行
  • 当 参数为 false 时,事件监听器将会在事件冒泡阶段中执行

参数:

target.addEventListener(type, listener [, options]);

  • target:要添加事件的DOM节点。
  • type:要添加的事件类型,如click、keydown等。
  • listener:事件触发时要执行的函数(也称为回调函数)。可以是命名函数,也可以是匿名函数。
  • options:可以是对象,也可以是布尔值,是对象时有三个常用属性:captureoncepassive

使用 addEventListener() 函数来添加事件监听器的好处在于可以指定事件的各种特性,从而更好地控制事件的行为

案例:

 function handleClick(event) {//执行完后不再冒泡event.preventDefault();   event.stopPropagation();console.log("按钮被点击了!");}
const myButton = document.getElementById("myButton");
myButton.addEventListener("click", handleClick, {capture: false,    // true表示捕获,false表示冒泡  once: false,       // 监听器是否只调用一次,调用后自动销毁passive: false     // 监听器是否阻止默认操作或停止事件冒泡
});

5️⃣阻止冒泡和默认行为

默认行为:

例如:a标签会自动跳转了,停止了默认行为后就不会自动跳转了,就需要自行设置属性

不阻止冒泡和默认行为:

  • 事件堆积:大量事件执行
  • 延迟:大量事件执行
  • 不必要的操作:浏览器的自动操作,默认行为

案例:

const myButton = document.getElementById("myButton");
myButton.addEventListener('click', (event) => {console.log("按钮被点击了!");// 阻止事件冒泡event.stopPropagation();// 阻止默认行为event.preventDefault();//或者 return false,相当于同时执行阻止事件冒泡和默认行为,不过不建议使用
});

6️⃣避免事件泄漏

事件泄漏是指没有正确地添加或移除事件处理程序,导致页面上的事件处理函数被占用,从而引起内存泄漏的问题

方法:

  • 正确添加和删除事件处理程序:使用 addEventlistener() 方法来添加事件监听器,用完就移除
  • 使用事件委托:将事件处理函数添加到父元素,取而代之以通过父元素进行监听
  • 使用闭包注意回收:避免变量无法回收
  • 使用第三方库:如 React、Vue 等都针对事件管理提供了一些工具和 API

7️⃣事件委托

原理:

利用事件冒泡,将事件处理程序添加到父元素中,而不是在每个子元素上都添加处理程序

好处:

  • 代码更清晰,容易维护和修改
  • 提供代码性能,减少内容开销,降低页面加载事件

案例:

// 假如要给 ul#container 下所有 li 添加点击事件
const container = document.querySelector('ul#container');// 在 ul 上监听 click 事件,对 li 判断触发事件类型,并且执行事件交互方法
container.addEventListener('click', (event) => {if (event.target.tagName === 'LI') {// 在这里执行点击交互逻辑,对当前被点中的 li 进行操作}
});

结语

感谢读者阅读并关注博客文章,并对文章中提到的观点、建议或批评表示感谢


http://www.ppmy.cn/news/51119.html

相关文章

TryHackMe-M4tr1x: Exit Denied(boot2root)

M4tr1x: Exit Denied 大多数人只看到一个完美构建的系统。但你一直都是不同的。你不仅看到表面上的东西,还看到 它下面有什么统治;调节和调节的内部关联机制 几乎完美地管理其每个模块,以至于它试图隐藏所有模块 其多面设计中的微小孔。但是&#xff0c…

高频 编码快捷键

Ctrl ​​​​​​​Ctrl W 选中文本,连续按可以扩大选中范围(以单词为单位)Ctrl Y取消Ctrl ZCtrl 链接前往链接Ctrl D在下一行复制出当前行Ctrl Backspace删除整个单词Ctrl /添加注释 或 取消注释Ctrl F在当前文件中查找文本Ctr…

设计模式取舍之道:性能权衡

目录标题 前言正文详细分析单例模式(Singleton Pattern)工厂方法模式(Factory Method Pattern)职责链模式享元模式简单工厂模式抽象工厂模式(Abstract Factory Pattern)观察者模式(Observer Pat…

Data X

📑 DataX和dataX-web 一 . 安装前准备 DataX 是一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。 DataX 采用 框架 插件 的模式: …

低代码平台名声臭,用起来却真香——60%开发者不敢承认

群体盲从意识会淹没个体的理性,个体一旦将自己归入该群体,其原本独立的理性就会被群体的无知疯狂所淹没。——《乌合之众》 不知道从什么时候开始,“低代码不行”的论调充斥着整个互联网圈子,csdn、掘金、知乎、B站、脉脉……到处…

【SpringMVC源码三千问】DispatcherServlet源码解析

DispatcherServlet#doDispatch() 是 SpringMVC 处理请求分发的方法,只要是 spring mvc 处理的 http 请求,都会经过 DispatcherServlet 的请求分发处理,从而调用相应的 handler method。 DispatcherServlet#doDispatch() 源码分析&#xff1a…

【JeecgBoot】Redis 内存到达峰值 100%

文章目录 前言问题排查分析问题设置合理的最大内存限制设置过期时间扩展部分重写配置文件监听键空间事件参考文献前言 今天在访问本地配置的 JeecgBoot 项目发现前端页面一直转圈圈,前端和后端都没有卡死的情况,一般来说如果有死循环或阻塞了,电脑应该呼啦啦的转,开始散热…

后代选择器

知识点&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta http-equiv"X-UA-Compatible" content"IEedge"> <meta name"viewport" c…