深入理解Javascript事件处理机制

news2024/12/26 11:30:10

深入理解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.coloradmin.cn/o/458717.html

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

相关文章

腾讯多媒体实验室画质增强技术的前沿应用

全真互联时代,音视频技术内核不断更新迭代,LiveVideoStackCon 2022 北京站邀请到腾讯多媒体实验室视频技术研发负责人——夏珍,与大家分享画质增强技术的一些前沿探索和应用研究,在经典影像中非常重要的画质提升技术人脸修复和去压…

告别web.xml映射Servlet、Filter、Listener,解锁注解新方式开发

编译软件:IntelliJ IDEA 2019.2.4 x64 操作系统:win10 x64 位 家庭版 服务器软件:apache-tomcat-8.5.27 目录 一. Servlet、Filter、Listener的注解方式是什么?二. 为什么要使用Servlet、Filter、Listener的注解方式?三…

【架构】互联网应用开发架构演进历程

文章目录 一、背景二、技术架构演进史三、架构演进一: 早期雏形四、架构演进二: 数据库开发(LAMP特长)五、架构演进三: javaweb的雏形六、架构演进四: javaweb的集群发展​七、架构演进五: javaweb的分布式发展八、架构演进六: javaweb的微服务发展​8.1…

开源 AI 辅助编程工具 AutoDev 现已上架 Jetbrains 插件市场

我们非常高兴地宣布 AutoDev v0.2.0 的发布!AutoDev 是一款强大的 AI 辅助编程工具,可以与 Jetbrains 系列 IDE 无缝集成(VS Code 支持正在开发中)。通过与需求管理系统(如 Github Issue 等)直接对接&#…

WPF教程(八)--数据绑定(1)--基础概述

使用WPF可以很方便的设计出强大的用户界面,同时 WPF提供了数据绑定功能。WPF的数据绑定跟Winform与ASP.NET中的数据绑定功能类似,但也有所不同,在 WPF中以通过后台代码绑定、前台XAML中进行绑定,或者两者组合的方式进行数据绑定。…

用python制作剪刀石头布的小游戏

1 问题 在python中我们学习了条件语句,那么我们是否可以通过python中条件判断的功能来写出可以判断胜负的剪刀石头布小游戏呢? 2 方法 导入随机函数,保证胜负的随机性 设置对应数值,写好判断输赢的条件语句 运行并查看结果 代码清单 1 impor…

斯坦福| ChatGPT用于生成式搜索引擎的可行性

文|智商掉了一地 随着 ChatGPT 在文本生成领域迈出了重要一步,Bing 浏览器也接入了聊天机器人功能,因此如何保证 Bing Chat 等搜索引擎结果的精确率和真实性也成为了搜索领域的热门话题之一。 当我们使用搜索引擎时,往往希望搜索结…

教你如何进行DNS域名解析

目录 一:DNS系统介绍 1.DNS服务概述 2.DNS域名空间介绍 3.DNS 域名结构 4.DNS解析方式 5.DNS查询方式 (1)递归查询 (2)迭代查询 6.DNS服务器类型: (1)主域名服务器 (2)从域名服务器 (3)缓存域名服务器 (4)…

Android进阶宝典 -- 解读Handler机制核心源码,让ANR无处可藏

其实ANR核心本质就是让UI线程(主线程)等了太久,导致系统判定在主线程做了耗时操作导致ANR。当我们执行任何一个任务的时候,在Framework底层是通过消息机制来维护任务的分发,从下面这个日志可以看到, "…

thrift、go与php

学习一下thrift。 环境 mac m1,go 1.20,php 7.4,thrift 0.18.1 要学习thrift,第一步得先安装 $ brew install thrift学习的计划是用go作为server,php作为client,通过thrift的方式完成一次请求demo。 建…

Java语言的特点和八大基本类型

“byte和short两兄弟去找int问long去哪了” “int摇摇头说不知道” “此时float和double两兄弟也来凑热闹” “共同商议后决定去找char询问” “char面对五人的询问只好说boolean知道” “六人来到boolean的住处发现long竟然在玩猜真假游戏” Java语言的特点 1.简单易学…

个性化学习路径推荐综述

源自:软件学报 作者:云岳 代欢 张育培 尚学群 李战怀 摘 要 近年来, 伴随着现代信息技术的迅猛发展, 以人工智能为代表的新兴技术在教育领域得到了广泛应用, 引发了学习理念和方式的深刻变革. 在这种大背景下, 在线学习超越了时空的限制,…

2023年电信推出新套餐:月租19元=135G流量+长期套餐+无合约期!

在三大运营商推出的流量卡当中,电信可以说是性价比最高的一个,相对于其他两家运营商,完全符合我们低月租,大流量的要求,所以,今天小编介绍的还是电信流量卡。 在这里说一下,小编推荐的卡都是免…

教你怎样用PXE高效的批量网络装机

目录 一:PXE介绍 1.XPE概述 2.PXE批量部署的优点 3.搭建PXE各部作用 (1)PXE(Preboot eXcution Environment) (2)服务端 (3)客户端 二:部署PXE服务 1.安装并启用TFTP服务 2.安…

Tiktok/抖音旋转验证码

声明 本文以教学为基准、本文提供的可操作性不得用于任何商业用途和违法违规场景。 本人对任何原因在使用本人中提供的代码和策略时可能对用户自己或他人造成的任何形式的损失和伤害不承担责任。 如有侵权,请联系我进行删除。 抖音系的旋转验证码,跟得物一样,都是内外圈一起…

blast的-max_target_seqs?

Shah, N., Nute, M.G., Warnow, T., and Pop, M. (2018). Misunderstood parameter of NCBI BLAST impacts the correctness of bioinformatics workflows. Bioinformatics. 杂志Bioinformatics以letter to the editor的形式刊发了来自美国马里兰大学计算机系的Nidhi Shah等人…

基于html+css的图展示42

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

安卓设备远程管理软件

现在,安卓设备广泛应用于各类智能硬件,有时候我们需要远程管理这些安卓设备。远程管理软件使 IT 管理员能够从任何地方控制和管理安卓设备,确保它们安全、最新并以最佳水平运行。在本文中,我们将介绍一些当前主流的安卓设备远程管…

Automa函数学习(三)

从变量中获取数据 当我们想要用automa获取文本标签获取到网页的文本内容后,想要将获取到的文本内容当做参数往后面的标签里进行传递时就需要用到automa提供的传参格式 {{ variables.自定义参数名}} 举例: 先建立打开百度首页工作流 前面自定义的变量名为text,所以这里参数拼接…

云计算的未来发展趋势与优势,你是否了解?

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录 前言 一、企业痛点 1.企业信息技术应用痛点 二、云计算的基础概念 1.什么是云计…