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

news2025/1/30 10:47:27

日期: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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2284666.html

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

相关文章

Blazor-Blazor Web App项目结构

让我们还是从创建项目开始,来一起了解下Blazor Web App的项目情况 创建项目 呈现方式 这里我们可以看到需要选择项目的呈现方式,有以上四种呈现方式 ● WebAssembly ● Server ● Auto(Server and WebAssembly) ● None 纯静态界面静态SSR呈现方式 WebAs…

观察者模式和订阅发布模式

有人把观察者模式等同于发布订阅模式,也有人认为这两种模式存在差异,本质上就是调度的方法不同。 相比较,发布订阅将发布者和观察者之间解耦。(发布订阅有调度中心处理)

16【中文编程10年内或将占领国内应用市场】

这同样是一篇较为犀利的文章,看过我分析辩论性文章的都知道,角度犀利,与大多数人观点不同,这是因为大多数人赞同的观点,我觉得我也没必要再去探讨了 回归正题,在大多数人眼中中文编程的代表就是易语言&…

Niagara学习笔记

橙色 发射器 , 绿色 粒子, 红色 渲染器 Emitter State 发射器状态 Life Cycle Mode(生命周期模式) 选择Self就是发射器自身管理生命周期 Loop Behavior 决定粒子发射次数 一次(Once):发射器只播放一次多次&#…

Linux(NTP配置)

后面也会持续更新,学到新东西会在其中补充。 建议按顺序食用,欢迎批评或者交流! 缺什么东西欢迎评论!我都会及时修改的! NTP环境搭建 服务端客户端192.168.111.10192.168.111.11Linux MySQL5.7 3.10.0-1160.el7.x86_…

具身智能体俯视全局的导航策略!TopV-Nav: 解锁多模态语言模型在零样本目标导航中的顶视空间推理潜力

作者:Linqing Zhong, Chen Gao, Zihan Ding, Yue Liao, Si Liu 单位:北京航空航天大学,新加坡国立大学,香港中文大学多模态实验室 论文标题:TopV-Nav: Unlocking the Top-View Spatial Reasoning Potential of MLLM …

可以称之为“yyds”的物联网开源框架有哪几个?

有了物联网的发展,我们的生活似乎也变得更加“鲜活”、有趣、便捷,包具有科技感的。在物联网(IoT)领域中,也有许多优秀的开源框架支持设备连接、数据处理、云服务等,成为被用户们广泛认可的存在。以下给大家…

智能调度体系与自动驾驶技术优化运输配送效率的研究——兼论开源AI智能名片2+1链动模式S2B2C商城小程序的应用潜力

摘要:随着全球化和数字化进程的加速,消费者需求日益呈现出碎片化和个性化的趋势,这对物流运输行业提出了前所未有的挑战。传统的物流调度体系与调度方式已难以满足当前复杂多变的物流需求,因此,物流企业必须积极引入大…

图漾相机-ROS2-SDK-Ubuntu版本编译(新版本)

官网编译文档链接: https://doc.percipio.xyz/cam/latest/getstarted/sdk-ros2-compile.html 国内gitee下载SDK链接: https://gitee.com/percipioxyz 国外github下载SDK链接: https://github.com/percipioxyz 1.Camport ROS2 SDK 介绍 1.1 …

【Samba】Ubuntu20.04 Windows 共享文件夹

【Samba】Ubuntu20.04 Windows 共享文件夹 前言整体思路检查 Ubuntu 端 和 Windows 网络通信是否正常创建共享文件夹安装并配置 Samba 服务器安装 Samba 服务器创建 Samba 用户编辑 Samba 配置文件重启 Samba 服务器 在 Windows 端 访问 Ubuntu 的共享文件夹 前言 本文基于 Ub…

RAG是否被取代(缓存增强生成-CAG)吗?

引言: 本文深入研究一种名为缓存增强生成(CAG)的新技术如何工作并减少/消除检索增强生成(RAG)弱点和瓶颈。 LLMs 可以根据输入给他的信息给出对应的输出,但是这样的工作方式很快就不能满足应用的需要: 因…

[MySQL]MySQL数据库的介绍和库相关操作

目录 一、数据库介绍 1.什么是数据库 2.为什么使用数据库 3.数据库的操作运行逻辑 4.MySQL架构 5.SQL语句的分类 二、数据库的操作 1.数据库的连接 2.数据库的操作 创建数据库 查看数据库 显示数据库的创建语句 删除数据库 修改数据库 3.字符集和校验集 查看系…

LLM幻觉(Hallucination)缓解技术综述与展望

LLMs 中的幻觉问题(LLM 幻觉:现象剖析、影响与应对策略)对其可靠性与实用性构成了严重威胁。幻觉现象表现为模型生成的内容与事实严重不符,在医疗、金融、法律等对准确性要求极高的关键领域,可能引发误导性后果&#x…

基于物联网设计的疫苗冷链物流监测系统

一、前言 1.1 项目开发背景 随着全球经济的发展和物流行业的不断创新,疫苗和生物制品的运输要求变得越来越高。尤其是疫苗的冷链物流,温度、湿度等环境因素的控制直接关系到疫苗的质量和效力,因此高效、可靠的冷链监控系统显得尤为重要。冷…

C++的类Class

文章目录 一、C的struct和C的类的区别二、关于OOP三、举例:一个商品类CGoods四、构造函数和析构函数1、定义一个顺序栈2、用构造和析构代替s.init(5);和s.release();3、在不同内存区域构造对象4、深拷贝和浅拷贝5、构造函数和深拷贝的简单应用6、构造函数的初始化列…

接口 V2 完善:分布式环境下的 WebSocket 实现与 Token 校验

🎯 本文档详细介绍了如何使用WebSocket协议优化客户端与服务端之间的通信,特别是在处理异步订单创建通知的场景中。通过引入WebSocket代替传统的HTTP请求-响应模式,实现了服务器主动向客户端推送数据的功能,极大地提高了实时性和效…

2025年数学建模美赛:A题分析(1)Testing Time: The Constant Wear On Stairs

2025年数学建模美赛 A题分析(1)Testing Time: The Constant Wear On Stairs 2025年数学建模美赛 A题分析(2)楼梯磨损分析模型 2025年数学建模美赛 A题分析(3)楼梯使用方向偏好模型 2025年数学建模美赛 A题分…

使用Vue3实现可拖拽的九点导航面板

开篇 本文使用Vue3实现了一个可拖拽的九宫导航面板。这个面板在我这里的应用场景是我个人网站的首页的位置,九宫导航对应的是用户最后使用或者最多使用的九个功能,正常应该是由后端接口返回的,不过这里为了简化,写的是固定的数组数…

68-《贝壳花》

贝壳花 贝壳花(学名:Moluccella laevis Linn.)是属于唇形科,贝壳花是一、二年的草本。植株高5至60cm,茎四棱,不分枝。叶对生,心脏状圆形,边缘疏生齿牙;叶柄和叶近等长。花…

【自然语言处理(NLP)】深度循环神经网络(Deep Recurrent Neural Network,DRNN)原理和实现

文章目录 介绍深度循环神经网络(DRNN)原理和实现结构特点工作原理符号含义公式含义 应用领域优势与挑战DRNN 代码实现 个人主页:道友老李 欢迎加入社区:道友老李的学习社区 介绍 **自然语言处理(Natural Language Pr…