【qwen3vsglm4.5】JavaScript 与浏览器事件分类

mouse相关,keyboard相关,表单事件,窗口事件(DomContentLoaded), paster事件,media事件,drapanddrop事件,animation and transition事件,touch事件
千万不能死记硬背呀,而是要理解。
事件(Event):表示某个动作或状态变化,如点击、键盘输入、页面加载等。
事件流

我之前犯的错误就是我把捕获和监听混淆了。
capture阶段(addEventLister的第三个参数设置为true,可以捕获)
target阶段
bubbing阶段

event.stopPropagation() 组织继续传播
qwen3的回答
JavaScript 与浏览器事件是 Web 开发中的核心内容之一。理解事件机制和事件分类,有助于开发者实现用户交互、动态响应页面行为。以下是关于 JavaScript 与浏览器事件分类 的详细说明:
一、什么是浏览器事件?
浏览器事件 是指用户或浏览器在网页上执行某些操作时触发的“信号”。JavaScript 可以监听这些事件,并在事件发生时执行相应的代码(事件处理程序)。
例如:
- 点击按钮
- 鼠标移动
- 键盘输入
- 页面加载完成
- 表单提交
二、事件处理方式
1. HTML 内联事件处理(不推荐)
<button onclick="alert('点击了')">点击我</button>
2. DOM 元素属性绑定
const btn = document.getElementById('myBtn');
btn.onclick = function() {
alert('按钮被点击');
};
3. 使用 addEventListener(推荐)
btn.addEventListener('click', function() {
alert('按钮被点击');
});
优点:可绑定多个事件、解绑方便、结构清晰。
三、事件流(事件传播机制)
事件在 DOM 中的传播分为三个阶段:
- 捕获阶段(Capture Phase):从
window→document→ 目标元素的祖先,逐层向下 - 目标阶段(Target Phase):到达目标元素
- 冒泡阶段(Bubbling Phase):从目标元素逐层向上传播到
window
element.addEventListener('click', handler, useCapture);
// useCapture 为 true:在捕获阶段触发
// useCapture 为 false(默认):在冒泡阶段触发
四、浏览器事件分类
浏览器事件种类繁多,主要分为以下几类:
1. 鼠标事件(Mouse Events)
| 事件 | 触发时机 |
|---|---|
click | 点击(按下 + 释放) |
dblclick | 双击 |
mousedown | 鼠标按键按下 |
mouseup | 鼠标按键释放 |
mousemove | 鼠标移动 |
mouseover | 鼠标进入元素(包括子元素) |
mouseout | 鼠标离开元素(包括子元素) |
mouseenter | 鼠标进入元素(不冒泡) |
mouseleave | 鼠标离开元素(不冒泡) |
contextmenu | 右键菜单触发前 |
mouseenter/mouseleave不冒泡,适合用于悬停效果。
2. 键盘事件(Keyboard Events)
| 事件 | 触发时机 |
|---|---|
keydown | 按下任意键(重复触发) |
keyup | 释放按键 |
keypress | 输入字符(已废弃,建议用 keydown) |
document.addEventListener('keydown', function(e) {
if (e.key === 'Enter') {
console.log('按下了回车');
}
});
3. 表单事件(Form Events)
| 事件 | 触发时机 |
|---|---|
submit | 表单提交(可阻止默认行为) |
reset | 表单重置 |
input | 输入框内容改变(实时) |
change | 元素值改变并失去焦点(如 select、input[type=text]) |
focus | 元素获得焦点 |
blur | 元素失去焦点 |
focusin | 获得焦点(冒泡) |
focusout | 失去焦点(冒泡) |
4. 窗口事件(Window Events)
| 事件 | 触发时机 |
|---|---|
load | 页面及资源(图片、CSS、JS)完全加载完成 |
DOMContentLoaded | HTML 文档解析完成,无需等待资源 |
beforeunload | 页面即将卸载(可弹出确认框) |
unload | 页面已卸载 |
resize | 浏览器窗口大小改变 |
scroll | 滚动页面或元素 |
window.addEventListener('resize', () => {
console.log('窗口大小变了:', window.innerWidth);
});
5. 拖放事件(Drag and Drop)
| 事件 | 触发元素 | 说明 |
|---|---|---|
dragstart | 被拖动元素 | 开始拖拽 |
drag | 被拖动元素 | 拖拽中 |
dragend | 被拖动元素 | 拖拽结束 |
dragenter | 目标区域 | 拖入目标 |
dragover | 目标区域 | 拖动在目标上方(需阻止默认行为允许放置) |
dragleave | 目标区域 | 拖出目标 |
drop | 目标区域 | 放置完成 |
dropZone.addEventListener('dragover', e => e.preventDefault());
dropZone.addEventListener('drop', e => {
e.preventDefault();
console.log('文件已放置');
});
6. 剪贴板事件(Clipboard Events)
| 事件 | 触发时机 |
|---|---|
copy | 执行复制操作 |
cut | 执行剪切操作 |
paste | 执行粘贴操作 |
input.addEventListener('paste', e => {
const text = e.clipboardData.getData('text');
console.log('粘贴内容:', text);
});
7. 媒体事件(Media Events)
用于 <audio> 和 <video> 元素:
| 事件 | 说明 |
|---|---|
play | 开始播放 |
pause | 暂停 |
ended | 播放结束 |
volumechange | 音量变化 |
timeupdate | 播放时间更新 |
loadedmetadata | 媒体元数据加载完成 |
8. 自定义事件(Custom Events)
可以创建并触发自定义事件,用于组件通信:
const event = new CustomEvent('myEvent', {
detail: { message: 'Hello' }
});
element.dispatchEvent(event);
element.addEventListener('myEvent', e => {
console.log(e.detail.message);
});
五、事件对象(Event Object)
每个事件处理函数都会接收到一个 event 对象,包含事件相关信息:
element.addEventListener('click', function(e) {
e.target // 触发事件的元素
e.currentTarget // 绑定事件的元素
e.preventDefault() // 阻止默认行为
e.stopPropagation() // 阻止冒泡
e.stopImmediatePropagation() // 阻止其他监听器执行
e.clientX / e.clientY // 鼠标坐标
e.key / e.code // 键盘事件键值
});
六、事件委托(Event Delegation)
利用事件冒泡机制,将事件监听绑定到父元素,处理子元素的事件,尤其适用于动态内容。
document.getElementById('list').addEventListener('click', function(e) {
if (e.target.tagName === 'LI') {
console.log('点击了列表项:', e.target.textContent);
}
});
七、常见事件使用场景
| 场景 | 推荐事件 |
|---|---|
| 实时输入监听 | input |
| 表单提交验证 | submit |
| 按键控制 | keydown |
| 响应式布局 | resize |
| 图片加载完成 | load(img) |
| DOM 结构就绪 | DOMContentLoaded |
| 拖拽上传 | dragover, drop |
总结
| 分类 | 主要事件举例 |
|---|---|
| 鼠标事件 | click, mousemove, mousedown |
| 键盘事件 | keydown, keyup |
| 表单事件 | input, change, submit |
| 窗口事件 | load, resize, scroll |
| 拖放事件 | dragstart, drop |
| 剪贴板事件 | copy, paste |
| 媒体事件 | play, ended |
| 自定义事件 | CustomEvent |
掌握这些事件分类和使用方式,是构建交互式 Web 应用的基础。
如需进一步学习,可查阅:
- MDN Web Docs - Events
- 《JavaScript 高级程序设计》(红宝书)第13章
如有具体事件使用问题,欢迎继续提问!
==========
====================我是分割线 ==================
GML4.5的回答
JavaScript 与浏览器事件分类
JavaScript 事件基础
事件流
事件流描述的是从页面中接收事件的顺序,主要包括三种模型:
- 事件冒泡:事件从最具体的元素开始,逐级向上传播到较不具体的节点
- 事件捕获:事件从较不具体的节点开始,逐级向下传播到最具体的元素
- DOM事件流:包括事件捕获阶段、目标阶段和事件冒泡阶段
事件处理程序绑定方式
-
HTML事件处理程序:
<button onclick="alert('Clicked!')">Click me</button> -
DOM0级事件处理程序:
const btn = document.getElementById('myButton'); btn.onclick = function() { alert('Clicked!'); }; -
DOM2级事件处理程序:
const btn = document.getElementById('myButton'); btn.addEventListener('click', function() { alert('Clicked!'); }, false);
事件对象
事件触发时创建的对象,包含与事件相关的信息:
type:事件类型target:事件目标currentTarget:当前处理事件的元素preventDefault():取消事件的默认行为stopPropagation():阻止事件冒泡或捕获
浏览器事件分类
1. 用户界面事件(UI Events)
load:页面完全加载后触发unload:页面完全卸载后触发resize:窗口或框架大小改变时触发scroll:用户滚动带滚动条的元素时触发error:发生JavaScript错误或资源加载失败时触发
2. 焦点事件(Focus Events)
focus:元素获得焦点时触发(不冒泡)blur:元素失去焦点时触发(不冒泡)focusin:元素获得焦点时触发(冒泡)focusout:元素失去焦点时触发(冒泡)
3. 鼠标事件(Mouse Events)
click:单击鼠标主键时触发dblclick:双击鼠标主键时触发mousedown:按下鼠标键时触发mouseup:释放鼠标键时触发mousemove:鼠标指针移动时触发mouseenter:鼠标指针进入元素边界时触发(不冒泡)mouseleave:鼠标指针离开元素边界时触发(不冒泡)mouseover:鼠标指针进入元素边界时触发(冒泡)mouseout:鼠标指针离开元素边界时触发(冒泡)contextmenu:尝试打开上下文菜单时触发(通常是右键单击)
4. 键盘事件(Keyboard Events)
keydown:按下键盘上的任意键时触发keyup:释放键盘上的键时触发keypress:按下键盘上的字符键时触发(已废弃)
5. 触摸事件(Touch Events)
touchstart:手指触摸屏幕时触发touchmove:手指在屏幕上滑动时触发touchend:手指从屏幕上移开时触发touchcancel:系统取消触摸时触发
6. 表单事件(Form Events)
submit:用户提交表单时触发reset:用户重置表单时触发change:表单控件的值改变时触发input:表单控件的值改变时立即触发invalid:表单控件验证失败时触发
7. 拖放事件(Drag and Drop Events)
dragstart:开始拖动元素时触发drag:元素被拖动时持续触发dragend:拖动操作结束时触发dragenter:被拖动的元素进入有效放置目标时触发dragover:元素被拖动到有效放置目标上时触发dragleave:被拖动的元素离开有效放置目标时触发drop:元素被放置到有效放置目标上时触发
8. 剪贴板事件(Clipboard Events)
cut:将内容剪切到剪贴板时触发copy:将内容复制到剪贴板时触发paste:从剪贴板粘贴内容时触发
9. 媒体事件(Media Events)
play:媒体开始播放时触发pause:媒体暂停时触发ended:媒体播放完毕时触发timeupdate:媒体播放位置改变时触发volumechange:媒体音量改变时触发
10. 进度事件(Progress Events)
loadstart:浏览器开始加载资源时触发progress:浏览器正在加载资源时触发load:资源加载完成时触发error:资源加载出错时触发abort:资源加载被中止时触发
11. 页面生命周期事件
DOMContentLoaded:DOM完全加载和解析完成时触发beforeunload:窗口、文档或其资源即将卸载时触发pageshow:用户导航到网页时触发pagehide:用户导航离开网页时触发
12. 设备事件(Device Events)
deviceorientation:设备方向改变时触发devicemotion:设备移动或旋转时触发orientationchange:设备方向(横屏/竖屏)改变时触发
13. 网络事件(Network Events)
online:浏览器连接到网络时触发offline:浏览器断开网络连接时触发
14. 存储事件(Storage Events)
storage:存储区域(localStorage或sessionStorage)发生变化时触发
15. 动画和过渡事件
animationstart:CSS动画开始时触发animationend:CSS动画结束时触发transitionend:CSS过渡结束时触发
16. 其他重要事件
hashchange:URL的片段标识符(#号后的部分)改变时触发popstate:活动历史记录条目更改时触发visibilitychange:文档可见性改变时触发
事件委托
事件委托是一种利用事件冒泡的技术,通过在父元素上设置事件监听器来管理多个子元素上的事件:
document.getElementById('parent-list').addEventListener('click', function(e) {
if (e.target && e.target.tagName === 'LI') {
console.log('List item', e.target.id, 'was clicked!');
}
});
自定义事件
JavaScript允许创建和触发自定义事件:
// 创建自定义事件
const event = new CustomEvent('myEvent', {
detail: { message: 'Hello, world!' }
});
// 监听自定义事件
document.addEventListener('myEvent', function(e) {
console.log(e.detail.message);
});
// 触发自定义事件
document.dispatchEvent(event);
理解这些事件类型和机制对于构建交互丰富、响应迅速的Web应用至关重要。
更多推荐


所有评论(0)