深入理解Javascript事件处理机制

深入理解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.mfbz.cn/a/14092.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

pwlink用作USB转TTL,进入HC-05的AT模式

不说废话的文章概括: 直接连接PWLINK与HC-05,无法进入AT模式,因为蓝牙模块的VCC只能接5V,不能接3.3V,而且PWLINK有两个VDD引脚,且两个VDD引脚初始默认输出电压都是3.3V,所以需要将3.3V改为5V的…

Centos8编译安装内核

首先下载kernel,5.x版本的内核,下载地址: https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/ 系统安装相关包: # yum install -y bc gcc make python3 ncurses-devel flex bison openssl-devel elfutils-libelf-devel将内…

大数据数仓维度建模

目录 维度建模分为三种: 1、星型模型: 2、雪花模型: 3、星座模型: 模型的选择: 维度表和事实表: 维度表: 维度表特性 : 事实表: 事实表特性: 事务型…

2023年定向增发研究报告

第一章 行业概况 定向增发是增发的一种,是指上市公司向符合条件的少数特定投资者非公开发行股份的行为,有时也称“定向募集”或“私募”。定向增发的发行价格由参与增发的投资者竞价决定,发行程序与公开增发相比较为灵活。一般认为&#xff…

亿发软件:中大型仓库进出货管理系统解决方案,定制软件让仓储作业高效便捷

中大型仓库出入库管理是传统厂家供应链管理流程的重要部分,直接关乎货物在仓库当中存储的安全,和员工工作的效率。一旦仓库管理当中出现了疏漏,那么货物的信息数据就会发生变动,导致实际与账目不符。人工带来的低效与不可控是传统…

Dcoekr 部署前后端分离项目SpringBoot +Vue

1.docker 部署vue docker 安装 nginx的镜像 niginx 配置文件 nginx.conf #user nobody; worker_processes 1;#error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info;#pid logs/nginx.pid;events {worker_connections…

【原创】用Matplotlib绘制的图表,真的是太惊艳了!!

当我们谈论Python中的数据可视化,Matplotlib是一个不可或缺的库。它强大的功能和灵活性使我们能够以各种方式轻松地呈现数据。然而,有时候,我们可能会忽视Matplotlib在创建视觉上令人惊叹的图像方面的潜力。在本文中,我们将探讨如…

搜索引擎找外贸客户

说起搜索引擎,我们每个人都不陌生,也许第一时间就能想到平日经常使用的“百度一下”和凭借强大算法及丰富功能占据近85%市场份额的谷歌搜索(Statista 2023年1月数据)这些耳熟能详的搜索引擎。对于外贸人而言搜索引擎也是非常实用的…

快速部署和测试API:使用APIfox的实战经验分享

最近发现一款接口测试工具--apifox,我我们很难将它描述为一款接口管理工具 或 接口自测试工具。 官方给了一个简单的公式,更能说明apifox可以做什么。 20分钟学ApiFox接口测试工具,结合30个项目实战讲解!_哔哩哔哩_bilibili20分…

进程间通信,有名管道(pipe)与无名管道(fifo)的解析与运用,以及代码实现

🎊【进程通信与并发】专题正在持续更新中,进程,线程,IPC,线程池等的创建原理与运用✨,欢迎大家前往订阅本专题,获取更多详细信息哦🎏🎏🎏 🪔本系列…

命令执行漏洞概述

命令执行漏洞概述 命令执行定义命令执行条件命令执行成因命令执行漏洞带来的危害远程命令执行漏洞相关函数assert()preg_replace()call_user_func() a ( a( a(b)可变函数远程命令执行漏洞的利用系统命令执行漏洞相关函数system()exec()shell_exec()passthru(&#x…

Node【Global全局对象】之【Process】

文章目录 🌟前言🌟Process🌟process属性🌟process.env 🌟process方法🌟process事件🌟uncaughtException 🌟写在最后 🌟前言 哈喽小伙伴们,新的专栏 Node 已开…

八、vue-基础之列表渲染v-for、v-for中的key属性的作用

一、v-for列表渲染 在真实开发中,我们往往会从服务器拿到一组数据,并且需要对其进行渲染。 这个时候我们可以使用v-for来完成;v-for类似于JavaScript的for循环,可以用于遍历一组数据; 二、v-for基本使用 &#xff0…

轻松掌握k8s的kubectl使用命令行操作Service知识点02

1、Service将同类型一组应用统一IP访问 将一组 Pods 网络服务的抽象方法。统一Ip后,默认就实现了负载均衡。 1、只在Pod内部任意机器访问的ClusterIp类型 在命令行操作生成一个ClusterIp地址。这种ClusterIp只能在Pod内部访问。 生成了ClusterIp之后&#xff0…

学生成绩管理系统【GUI/Swing+MySQL】(Java课设)

系统类型 Swing窗口类型Mysql数据库存储数据 使用范围 适合作为Java课设!!! 部署环境 jdk1.8Mysql8.0Idea或eclipsejdbc 运行效果 本系统源码地址:https://download.csdn.net/download/qq_50954361/87700420 更多系统资源库…

【机智云物联网低功耗转接板】+模拟MCU快速上手

GE211是机智云自研的定制化转接板,使用 ESP32-C3-WROOM-02 通讯模块,适用于白色智能家电等设备应用。 转接板已经烧录了机智云连云的最新GAgent固件,所以不需要烧写任何软件就可以快速上手使用。 GE211板卡带有一个串口,一般是把这…

58 openEuler搭建Mariadb数据库服务器-管理数据库

文章目录 58 openEuler搭建Mariadb数据库服务器-管理数据库58.1 创建数据库58.2 查看数据库58.3 选择数据库58.4 删除数据库58.5 备份数据库58.6 恢复数据库 58 openEuler搭建Mariadb数据库服务器-管理数据库 58.1 创建数据库 可以使用CREATE DATABASE语句来创建数据库。 CR…

多线程并发编程学习笔记9(小滴课堂)------线程池及Executor框架

它只会使用10个线程。因为我们设置了它的容量。 我们现在把这个队列容量设置为20. 我们可以看到这里它使用了20个线程。但是出了异常,这个后面我们会学习。 我们现在使用一下我们的callable: 一般我们如果是想在线程执行完以后,获得一个返回…

SpringBoot第 17 讲:SpringBoot+JWT

关于JWT的讲解请参考:SpringCloud第14讲:(番外篇)JWT 一、项目演示 没有登陆直接请求列表接口,系统会要求先进行登录 登录成功后请求列表接口,可以正常响应数据 二、后台开发 2.1、pom.xml 添加redis…

网口通讯与串口通讯

目录 一、简介以及数据格式: 二、网口通讯与串口通讯主要区别: 三、工具小助手: 一、简介以及数据格式: 网口通讯(Ethernet)和串口通讯(Serial)都是用于数据传输的通信协议。 1、…
最新文章