🔍 从简单到复杂:JavaScript 事件处理的全方位解读

基础语法

事件机制是指当用户在DOM元素上执行特定操作(例如点击按钮、移动鼠标等)时,会触发相应的事件。JavaScript通过监听这些事件,并将对应的处理函数绑定到事件上,从而对用户的交互做出响应。

javascript 复制代码
// 1. HTML属性方式(内联方式)
<div class="event-box" onclick="alert('HTML属性方式')">HTML属性方式</div>


// 2. DOM属性方式绑定事件
<div class="event-box" id="domPropertyBox">DOM属性方式</div>
domPropertyBox.onclick = function () {
  logEvent('DOM属性方式触发了点击事件')
}

// 3. addEventListener方式绑定事件(推荐)
<div class="event-box" id="listenerBox">addEventListener方式</div>
listenerBox.addEventListener('click', function () {
  logEvent('addEventListener方式触发了点击事件')
})

不同事件绑定方式的特性如下:

特性 HTML属性方式 DOM属性方式 addEventListener
多个事件处理器
控制事件阶段 ❌ (只冒泡) ❌ (只冒泡) ✅ (可选捕获/冒泡)
移除事件 困难 设置为null removeEventListener
代码组织 混合在HTML中 分离 完全分离
this指向 window 元素本身 元素本身

可列举的事件类型:

事件类型 事件名称 描述
鼠标事件 click 单击事件
dblclick 双击事件
contextmenu 右键点击事件
mousedown 鼠标按下事件
mouseup 鼠标释放事件
mouseover 鼠标移入元素事件
mouseout 鼠标移出元素事件
mousemove 鼠标在元素上移动事件
键盘事件 keydown 键盘按键按下事件
keyup 键盘按键释放事件
keypress 键盘按压事件(字符键)
表单事件 submit 表单提交事件
reset 表单重置事件
focus 获得焦点事件
blur 失去焦点事件
input 输入内容变化事件
change 内容改变且失去焦点事件
拖放事件 dragstart 开始拖动元素
drag 拖动元素过程中
dragend 拖动操作结束
dragenter 拖动元素进入目标区域
dragover 拖动元素在目标区域上方
dragleave 拖动元素离开目标区域
drop 在目标区域放置被拖元素
滚动事件 scroll 元素或文档被滚动
剪贴板事件 copy 复制操作
cut 剪切操作
paste 粘贴操作
触摸事件 (移动端) touchstart 触摸开始
touchmove 触摸移动
touchend 触摸结束
touchcancel 触摸被系统中断
窗口/文档事件 resize 窗口大小改变
load 页面加载完成

事件捕获与冒泡

在JavaScript中,事件的传播过程遵循事件流机制,事件流的顺序包括捕获和冒泡两种方式。整个事件流可以分为三个阶段:首先是 捕获阶段 ,然后是 目标阶段 ,最后是 冒泡阶段。事件捕获和事件冒泡是处理DOM事件的两种不同机制。

  • 事件捕获是从最外层的元素开始,逐步向内传播到目标元素。例如:从windowdocument,再到htmlbody,最终到达div
  • 事件冒泡则是从目标元素开始,逐步向外传播到最外层的元素。例如:从divbody,再到htmldocument,最终到达window
javascript 复制代码
element.addEventListener(event, handler, useCapture);
// event:具体的事件
// handler:处理的函数
// 指定什么事件:默认为false,事件在冒泡阶段处理

event.preventDefault() // 阻止浏览器对事件的默认行为,
// 如:阻止链接的跳转、表单的提交、输入框的默认行为
event.stopPropagation() //阻止事件冒泡,同级不阻止
event.stopImmediatePropagation() //阻止事件冒泡,同级阻止

案例如下

事件委托

  • 事件委托(Event Delegation) 是一种基于事件冒泡机制的优化技术。它允许我们将事件监听器添加到父元素,而不是直接添加到多个子元素上。
  • 当子元素的事件被触发时,事件会冒泡到父元素,然后由父元素上的监听器处理。通过检查事件的target属性,我们可以确定哪个具体的子元素触发了事件。
javascript 复制代码
//事件代理  节约内存 提升性能(不需要注销子节点)
let ul = document.getElementById("ul");
ul.addEventListener("click", (event) => {
    console.log(event.target.innerHTML);
})

案例如下

特性 事件委托 直接绑定
内存使用 ✅ 低(只有一个事件监听器) ❌ 高(每个元素一个监听器)
初始化时间 ✅ 快(只需绑定一次) ❌ 慢(需要为每个元素绑定)
动态元素处理 ✅ 自动支持新添加的元素 ❌ 需要手动为新元素绑定事件
事件处理时间 ⚠️ 稍慢(需要遍历确定目标元素) ✅ 稍快(直接知道目标元素)
代码复杂度 ✅ 简洁 ❌ 冗余
元素移除 ✅ 不需要手动解绑 ❌ 需要手动解绑避免内存泄漏
点击性能测试 ⚠️ 稍慢(需要判断目标元素) ✅ 稍快(直接绑定到目标元素)

VUE 事件系统

www.cnblogs.com/WindrunnerM...

Vue中通过 v-on 或其语法糖 @ 指令来给元素绑定事件并且提供了事件修饰符,基本流程是进行模板编译生成 AST ,生成render函数后并执行得到VNodeVNode 生成真实DOM 节点或者组件时候使用addEventListener方法进行事件绑定。

下一篇会对 VUE 的事件系统将进行详细讲解......

相关推荐
烬头882121 小时前
React Native鸿蒙跨平台实现二维码联系人APP(QRCodeContactApp)
javascript·react native·react.js·ecmascript·harmonyos
pas13621 小时前
40-mini-vue 实现三种联合类型
前端·javascript·vue.js
摇滚侠21 小时前
2 小时快速入门 ES6 基础视频教程
前端·ecmascript·es6
2601_949833391 天前
flutter_for_openharmony口腔护理app实战+预约管理实现
android·javascript·flutter
珑墨1 天前
【Turbo】使用介绍
前端
军军君011 天前
Three.js基础功能学习十三:太阳系实例上
前端·javascript·vue.js·学习·3d·前端框架·three
xiaoqi9221 天前
React Native鸿蒙跨平台如何实现分类页面组件通过searchQuery状态变量管理搜索输入,实现了分类的实时过滤功能
javascript·react native·react.js·ecmascript·harmonyos
打小就很皮...1 天前
Tesseract.js OCR 中文识别
前端·react.js·ocr
血小板要健康1 天前
Java基础常见面试题复习合集1
java·开发语言·经验分享·笔记·面试·学习方法
qq_177767371 天前
React Native鸿蒙跨平台实现应用介绍页,实现了应用信息卡片展示、特色功能网格布局、权限/联系信息陈列、评分展示、模态框详情交互等通用场景
javascript·react native·react.js·ecmascript·交互·harmonyos