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

【JS|第28期】new Event():前端事件处理的利器

日期:2025年1月24日
作者:Commas
签名:(ง •_•)ง 积跬步以致千里,积小流以成江海……
注释:如果您觉得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方,还望各位大佬不吝赐教,谢谢^ - ^
1.01365 = 37.7834;0.99365 = 0.0255
1.02365 = 1377.4083;0.98365 = 0.0006


文章目录

  • 一、前言
  • 二、new Event 的前世今生
    • (1)早期实现方式
    • (2)现代实现方式
  • 三、new Event 的基本用法
  • 四、new Event 与 CustomEvent 的区别
  • 五、实际案例:模拟输入 input 值
    • (1)普通的 input 场景
    • (2)框架的 input 场景
    • (3)框架的 div+ input 场景
  • 六、结语


在这里插入图片描述


一、前言


在前端开发中,事件机制是实现用户交互和动态效果的核心。Event 对象是浏览器中用于处理事件的核心接口,而 new Event 是创建自定义事件的一种方式。本文将带你深入了解 new Event 的前世今生、用法、参数含义及参数值,并结合实际案例进行详细讲解。

二、new Event 的前世今生


在早期的 Web 开发中,事件主要局限于浏览器原生提供的一些简单交互,如点击、鼠标移动等。随着 Web 应用的复杂性不断增加,开发者对于自定义事件的需求日益迫切。new Event() 正是在这样的背景下诞生,它是 W3C DOM 规范的重要组成部分。随着 HTML5 等规范的不断演进,new Event() 也在持续完善,兼容性和功能都得到了显著提升,如今已成为前端开发中不可或缺的工具。

(1)早期实现方式

DOM Level 2 规范中,浏览器引入了 document.createEvent 方法来创建事件对象,并通过 initEvent 方法初始化事件。这种方式虽然可以实现自定义事件,但语法较为繁琐。

var event = document.createEvent('Event');
event.initEvent('myEvent', true, true);
element.dispatchEvent(event);

这种方式虽然在过去被广泛使用,但已经逐渐被现代浏览器所淘汰。

(2)现代实现方式

随着 DOM Level 4 规范的推出,new Event 构造函数被引入,简化了自定义事件的创建过程。现在,我们可以通过 new Event 直接创建一个事件对象,并使用 dispatchEvent 方法触发事件。

// var event = new Event('myEvent', { bubbles: true, cancelable: true });
let event = new Event('myEvent', { bubbles: true, cancelable: true });
element.dispatchEvent(event);

这种方式不仅简化了代码,还提高了可读性和可维护性,更符合面向对象的设计理念。

三、new Event 的基本用法


new Event 用于创建一个新的事件对象,其基本语法如下:

let event = new Event(type, options);
  • type: 事件类型名称(字符串),例如 'click''blur'myEvent'等。更多事件可看我的另一篇文章《【JS|第29期】JavaScript中的事件类型》;

  • options: 可选参数,一个对象,用于指定事件的属性:

    键名说明truefalse
    bubbles布尔值,指示事件是否冒泡。默认值为 false事件会向上冒泡到父元素。事件不会冒泡。
    cancelable布尔值,指示事件是否可以被取消。默认值为 false事件可以被取消,例如通过 event.preventDefault()。事件不能被取消。
    composed布尔值,指示事件是否会穿过影子 DOMShadow DOM)。默认值为 false事件会穿过影子 DOM事件不会穿过影子 DOM

示例:

// 创建一个名为 'myEvent' 的事件
let event = new Event('myEvent', { bubbles: true, cancelable: true });// 触发事件
document.dispatchEvent(event);

四、new Event 与 CustomEvent 的区别


虽然 new Event 可以满足大部分自定义事件的需求,但在某些情况下,CustomEvent 提供了更强大的功能。CustomEvent 允许开发者为事件添加自定义数据。

使用 CustomEvent 的示例:

// 创建一个名为 'myEvent' 的自定义事件,并携带数据
var event = new CustomEvent('myEvent', { detail: { message: 'Hello Commas' }, bubbles: true, cancelable: true });// 触发事件
document.dispatchEvent(event);// 监听事件
document.addEventListener('myEvent', function(e) {console.log(e.detail.message); // 输出: Hello, Commas
});

如果需要为事件传递额外的数据,建议使用 CustomEvent;如果只是简单地触发一个事件,new Event 即可满足需求。

五、实际案例:模拟输入 input 值


(1)普通的 input 场景

一般情况,我们只要改变 value ,就可以改变 input 的值,如下:

// 获取 id 为 star_num 的input元素
let eInput = document.querySelector('#star_num');
eInput.value = 100;

(2)框架的 input 场景

当我们不以为然,说这不是小儿科的事情的时候,我们或许会发现一些使用 前端框架 的网页中的 input 却只是 “面改心不改”,还是原来的值。这是因为我们给 eInput.value 赋值,并不会触发 inputchange 事件,从而框架并不知道 eInput.value 发生了改变,这才导致并非我们预期的结果。

那么接下来,我们就主动触发一下 change 事件:

// 创建事件
let changeEvent = new Event("change", { bubbles: true });
// 触发事件
eInput.dispatchEvent(changeEvent);

既然 eInput.value 真的改变了,那么我们就做一个封装函数:

changeInputValue(eInput, newText) {// 旧值let lastValue = eInput.value;// 新值eInput.value = newText;// 创建事件let changeEvent = new Event("change", { bubbles: true });// 标识该事件通过编程方式模拟的event.simulated = true; // 某些框架(如:React)提供的内部属性,并非标准的 DOM 属性,用于跟踪和管理输入元素的值。let tracker = eInput._valueTracker;if (tracker) {// 通过调用这个方法,代码将输入元素的值恢复到旧值,确保框架内部的跟踪机制与 DOM 的实际值保持一致。// 这在模拟事件时尤为重要,因为框架可能需要知道输入值的变化是由用户操作还是由代码模拟的。tracker.setValue(lastValue);}// 触发事件eInput.dispatchEvent(changeEvent);
},

// 调用

let eInput = document.querySelector('#star_num');
changeInputValue(eInput,100);

(3)框架的 div+ input 场景

本以为这就完事了,没想到居然还有 div + input 组合的场景。整个输入过程中 input 不过是昙花一现,可分为三个阶段:

  • 输入前:当用户点击 div 的时候,会自动创建一个 input 作为 div 的子元素,并聚焦 input
  • 输入中:用户在 input 中输入新值;
  • 输入后input 失焦后,input.value 数据会回填到 div.innerText,并且销毁 input

我们了解原理后,只需要照着步骤实现就好啦

// (1)输入前
let eInputParent = document.querySelector('#star_num_parent');
eInputParent.click();
// 为了给创建input元素预留时间,等待0.5秒后再往下执行,
await waitForSeconds(0.5);// (2)输入中
let eInput= eInputParent.querySelector('input');
changeInputValue(eInput,100);// (3)输入后
let blurEvent = new Event("blur",{ bubbles: true });
inputDom.dispatchEvent(blurEvent);

其中 waitForSeconds() 是自定义函数,如下:

async function waitForSeconds(seconds) {return new Promise((resolve) => {setTimeout(() => {resolve("等待时间已过");}, seconds * 1000); // 毫秒为单位});
},

六、结语


new Event() 作为前端事件处理的强大工具,为开发者提供了创建和管理自定义事件的简便方法。通过了解其参数及常用值,我们可以更加灵活地运用它,构建出更加丰富和交互性强的用户界面。同时,对于需要传递数据的场景,CustomEvent 提供了更强大的功能。


参考文章:

  • 《MDN Web docs》- Event()
  • 《MDN Web docs》- CustomEvent:CustomEvent() 构造函数
  • 《DOM Level 2 Events Specification》

版权声明:本文为博主原创文章,如需转载,请给出:
原文链接:https://blog.csdn.net/qq_35844043/article/details/145321660

相关文章:

【JS|第28期】new Event():前端事件处理的利器

日期:2025年1月24日 作者:Commas 签名:(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释:如果您觉得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方&#xf…...

Spring Boot 中的事件发布与监听:深入理解 ApplicationEventPublisher(附Demo)

目录 前言1. 基本知识2. Demo3. 实战代码 前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 基本的Java知识推荐阅读: java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全&am…...

【Spring】Spring启示录

目录 前言 一、示例程序 二、OCP开闭原则 三、依赖倒置原则DIP 四、控制反转IOC 总结 前言 在软件开发的世界里,随着项目的增长和需求的变化,如何保持代码的灵活性、可维护性和扩展性成为了每个开发者必须面对的问题。传统的面向过程或基于类的设计…...

ospf动态路由配置,cost路径调整,ospf认证实验

一、实验拓扑如图: 接口ip配置网络 :10.17.12.* 10.17.13.* ,10.17.23.* 回环接口配置分别为 10.0.1.1 ,10.0.1.2,10.0.1.3对应三台路由器 ar1配置接口ip interface GigabitEthernet0/0/0 ip address 10.17.12.1…...

在Rust应用中访问.ini格式的配置文件

在Rust应用中访问.ini格式的配置文件,你可以使用第三方库,比如 ini 或 config. 下面是一个使用 ini 库的示例,该库允许你读取和解析.ini文件。 使用 ini 库 添加依赖 首先,你需要在你的 Cargo.toml 文件中添加 ini 库的依赖&am…...

批量处理多个模型的预测任务

#!/bin/bash# 检查是否传入必要的参数&#xff0c;若未传入参数则打印用法并退出 if [ "$#" -lt 1 ]; thenecho "用法: $0 <file_path>"echo "示例: $0 /home/aistudio/work/PaddleSeg/city/cityscapes_urls_extracted.txt"exit 1 fi# 读取…...

Java 编程初体验

Java学习资料 Java学习资料 Java学习资料 一、引言 在当今数字化的时代&#xff0c;编程已然成为一项极具价值的技能。而 Java 作为一门广泛应用于企业级开发、移动应用、大数据等众多领域的编程语言&#xff0c;吸引着无数初学者投身其中。当我们初次踏入 Java 编程的世界&…...

element-plus 的table section如何实现单选

如果是单选那么全新的按钮应该隐藏或者不可编辑的状态。但是我没找到改变成不可编辑的方法&#xff0c;只能采取隐藏 <template><!-- 注意要包一层div根元素&#xff0c;否则css样式可能会不生效&#xff0c;原因不详 --><div><el-table ref"proTab…...

【JavaEE进阶】图书管理系统 - 壹

目录 &#x1f332;序言 &#x1f334;前端代码的引入 &#x1f38b;约定前后端交互接口 &#x1f6a9;接口定义 &#x1f343;后端服务器代码实现 &#x1f6a9;登录接口 &#x1f6a9;图书列表接口 &#x1f384;前端代码实现 &#x1f6a9;登录页面 &#x1f6a9;…...

牛客周赛 Round 77 题解

文章目录 A-时间表B-数独数组D-隐匿社交网络E-1or0 A-时间表 签到题 #include <bits/stdc.h> using namespace std;int main() {int a[6] {20250121,20250123,20250126,20250206,20250208,20250211};int n; cin >> n;cout << a[n - 1];return 0; }B-数独数…...

Mybatis配置文件详解

MyBatis通过XML或注解的方式将Java对象与数据库中的记录进行映射&#xff0c;极大地简化了数据访问层的开发。而在MyBatis的核心组成部分中&#xff0c;配置文件扮演着举足轻重的角色。它不仅定义了MyBatis的运行环境&#xff0c;还配置了数据源、事务管理、映射器等关键元素&a…...

《深度揭秘:TPU张量计算架构如何重塑深度学习运算》

在深度学习领域&#xff0c;计算性能始终是推动技术发展的关键因素。从传统CPU到GPU&#xff0c;再到如今大放异彩的TPU&#xff08;张量处理单元&#xff09;&#xff0c;每一次硬件架构的革新都为深度学习带来了质的飞跃。今天&#xff0c;就让我们深入探讨TPU的张量计算架构…...

Java基础知识总结(二十二)--List接口

List本身是Collection接口的子接口&#xff0c;具备了Collection的所有方法。现在学习List体系特有的共性方法&#xff0c;查阅方法发现List的特有方法都有索引&#xff0c;这是该集合最大的特点。 List&#xff1a;有序(元素存入集合的顺序和取出的顺序一致)&#xff0c;元素都…...

[STM32 - 野火] - - - 固件库学习笔记 - - -十二.基本定时器

一、定时器简介 STM32 中的定时器&#xff08;TIM&#xff0c;Timer&#xff09;是其最重要的外设之一&#xff0c;广泛用于时间管理、事件计数和控制等应用。 1.1 基本功能 定时功能&#xff1a;TIM定时器可以对输入的时钟进行计数&#xff0c;并在计数值达到设定值时触发中…...

算法随笔_27:最大宽度坡

上一篇:算法随笔_26: 按奇偶排序数组-CSDN博客 题目描述如下: 给定一个整数数组 nums&#xff0c;坡是元组 (i, j)&#xff0c;其中 i < j 且 nums[i] < nums[j]。这样的坡的宽度为 j - i。 找出 nums 中的坡的最大宽度&#xff0c;如果不存在&#xff0c;返回 0 。 …...

无公网IP 外网访问本地部署 llamafile 大语言模型

llamafile 是一种AI大模型部署&#xff08;或者说运行&#xff09;的方案&#xff0c;它的特点就是可以将模型和运行环境打包成一个独立的可执行文件&#xff0c;这样就简化了部署流程。用户只需要下载并执行该文件&#xff0c;无需安装运行环境或依赖库&#xff0c;这大大提高…...

使用PC版本剪映制作照片MV

目录 制作MV模板时长调整拖动边缘缩短法分割删除法变速法整体调整法 制作MV 导入音乐 导入歌词 点击歌词 和片头可以修改字体&#xff1a; 还可以给字幕添加动画效果&#xff1a; 导入照片&#xff0c;自动创建照片轨&#xff1a; 修改片头字幕&#xff1a;增加两条字幕轨&…...

搭建 docxify 静态博客教程

首先&#xff0c;安装 node 环境安装 docxify &#xff0c;参考官网&#xff1a;https://docsify.js.org/#/zh-cn/ npm i docsify-cli -g新建docs文件夹专门用来放文章&#xff0c;初始化命令 docsify init ./docs就会生成如下两个文件&#xff0c;index.html 入口文件&#…...

汽车OEMs一般出于什么目的来自定义Autosar CP一些内容

汽车OEMs在使用AUTOSAR CP(Classic Platform)协议时,可能会根据自身的特定需求对标准协议进行修改,形成自己的企业标准(企标)。这种修改通常是为了满足特定的硬件平台、功能需求、安全要求或优化性能。以下是一些常见的修改场景和例子: 1. 硬件平台适配 企业可能会根据…...

Vue.js Vuex 模块化管理

Vue.js Vuex 模块化管理 今天咱们来聊聊如何在 Vuex 中进行模块化管理。当你的 Vue.js 应用变得越来越庞大时&#xff0c;单一的状态管理可能会让人头疼。这时候&#xff0c;Vuex 的模块化功能就派上用场了。 为什么需要模块化&#xff1f; 想象一下&#xff0c;如果把所有的…...

分布式光纤应变监测是一种高精度、分布式的监测技术

一、土木工程领域 桥梁结构健康监测 主跨应变监测&#xff1a;在大跨度桥梁的主跨部分&#xff0c;如悬索桥的主缆、斜拉桥的斜拉索和主梁&#xff0c;分布式光纤应变传感器可以沿着这些关键结构部件进行铺设。通过实时监测应变情况&#xff0c;能够精确捕捉到车辆荷载、风荷…...

用Devc++与easyx一步一步做游戏[启动界面部分]-解决hover闪烁问题及优化

在之前的博文中《用Devc与easyx一步一步做游戏[启动界面部分]-之按钮制作》&#xff0c;我们利用Devc和easyx完成了游戏启动界面按钮的基本制作&#xff0c;实现了按钮的绘制以及鼠标悬停时的信息提示功能。然而&#xff0c;目前还存在一个问题&#xff0c;即鼠标移动时&#x…...

mysql 学习3 SQL语句--整体概述。SQL通用语法;DDL创建数据库,查看当前数据库是那个,删除数据库,使用数据库;查看当前数据库有哪些表

SQL通用语法 SQL语句分类 DDL data definition language : 用来创建数据库&#xff0c;创建表&#xff0c;创建表中的字段&#xff0c;创建索引。因此成为 数据定义语言 DML data manipulation language 有了数据库和表以及字段后&#xff0c;那么我们就需要给这个表中 添加数…...

【数据结构】_链表经典算法OJ:分割链表(力扣—中等)

目录 1. 题目描述及链接 2. 解题思路 2.1 思路1 2.2 思路2 2.3 思路3&#xff08;本题采取该解法&#xff09; 3. 题解程序 1. 题目描述及链接 题目链接&#xff1a;面试题 02.04. 分割链表 - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 给你一个链表…...

k8s支持自定义field-selector spec.hostNetwork过滤

好久没写博客啦&#xff0c;年前写一个博客就算混过去啦&#x1f602; 写一个小功能&#xff0c;对于 Pod&#xff0c;在没有 label 的情况下&#xff0c;支持 --field-selector spec.hostNetwork 查询 Pod 是否为 hostNetwork 类型&#xff0c;只为了熟悉 APIServer 是如何构…...

ICSE‘25 LLM Assistance for Memory Safety

不知道从什么时候开始&#xff0c;各大技术社区&#xff0c;技术群聊流行着 “用Rust重写!” &#xff0c;放一张图(笑死… 这不, 随着大模型技术的流行&#xff0c;大家都在探索如何让大模型自动完成仓库级别(全程序)的代码重构&#xff0c;代码变换&#xff08;Refactor&…...

《十七》浏览器基础

浏览器&#xff1a;是安装在电脑里面的一个软件&#xff0c;能够将页面内容渲染出来呈现给用户查看&#xff0c;并让用户与网页进行交互。 常见的主流浏览器&#xff1a; 常见的主流浏览器有&#xff1a;Chrome、Safari、Firefox、Opera、Edge 等。 输入 URL&#xff0c;浏览…...

TikTok 推出了一款 IDE,用于快速构建 AI 应用

字节跳动(TikTok 的母公司)刚刚推出了一款名为 Trae 的新集成开发环境(IDE)。 Trae 基于 Visual Studio Code(VS Code)构建,继承了这个熟悉的平台,并加入了 AI 工具,帮助开发者更快、更轻松地构建应用——有时甚至无需编写任何代码。 如果你之前使用过 Cursor AI,T…...

阅读springboot源码 记录

关于 :: 双冒号 用stream的map简洁提取id&#xff0c;类似代码1 // 代码1 List<String> Ids list.stream().map(Student::getId).collect(Collectors.toList())// 代码2 List<String> Ids list.stream().map(use->{return use.getId(); }).collect(Collector…...

Linux之内存管理前世今生(一)

一个程序&#xff08;如王者荣耀&#xff09;平常是存储在硬盘上的&#xff0c;运行时才把这个程序载入内存&#xff0c;CPU才能执行。 问题&#xff1a; 这个程序载入内存的哪个位置呢&#xff1f;载入内核所在的空间吗&#xff1f;系统直接挂了。 一、虚拟内存 1.1 内存分…...