基础语法
事件机制是指当用户在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事件的两种不同机制。

- 事件捕获是从最外层的元素开始,逐步向内传播到目标元素。例如:从
window
到document
,再到html
、body
,最终到达div
- 事件冒泡则是从目标元素开始,逐步向外传播到最外层的元素。例如:从
div
到body
,再到html
、document
,最终到达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
函数后并执行得到VNode
,VNode
生成真实DOM
节点或者组件时候使用addEventListener
方法进行事件绑定。
下一篇会对 VUE 的事件系统将进行详细讲解......