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

JavaScript事件

本文详细介绍JavaScript事件机制。

本文目录

        • 1. 事件类型分类
        • 2. 事件绑定方式
        • 3. 事件对象
        • 4. 事件冒泡与捕获
        • 5. 事件委托
        • 6. 自定义事件
        • 7. 事件应用场景

JavaScript 事件是浏览器与用户交互的基础机制,允许代码对用户行为,如点击、滚动或浏览器状态变化,如页面加载完成做出响应。下面详细介绍关于 JavaScript 事件的核心概念和使用方法。

1. 事件类型分类

JavaScript 支持多种事件类型,常见的分为以下几类:

// 鼠标事件
document.addEventListener('click', function() { /* 点击事件 */ });
document.addEventListener('dblclick', function() { /* 双击事件 */ });
document.addEventListener('mouseover', function() { /* 鼠标悬停 */ });
document.addEventListener('mouseout', function() { /* 鼠标移出 */ });// 键盘事件
document.addEventListener('keydown', function(e) { /* 按键按下 */ });
document.addEventListener('keyup', function(e) { /* 按键释放 */ });
document.addEventListener('keypress', function(e) { /* 字符输入 */ });// 表单事件
document.querySelector('form').addEventListener('submit', function(e) {e.preventDefault(); /* 阻止表单提交 */
});
document.querySelector('input').addEventListener('change', function() { /* 值变更 */ });
document.querySelector('input').addEventListener('focus', function() { /* 获得焦点 */ });// DOM 加载事件
window.addEventListener('load', function() { /* 页面完全加载 */ });
document.addEventListener('DOMContentLoaded', function() { /* DOM 解析完成 */ });// 窗口事件
window.addEventListener('resize', function() { /* 窗口大小改变 */ });
window.addEventListener('scroll', function() { /* 页面滚动 */ });
window.addEventListener('beforeunload', function(e) { /* 页面即将卸载 */ });
2. 事件绑定方式

有三种主要的事件绑定方式:

// 1. HTML 内联事件(不推荐,结构与行为耦合)
<button onclick="handleClick()">点击我</button>// 2. DOM0 级事件
const button = document.querySelector('button');
button.onclick = function() {console.log('按钮被点击');
};// 3. DOM2 级事件
button.addEventListener('click', function() {console.log('事件处理函数1');
});
button.addEventListener('click', function() {console.log('事件处理函数2'); // 可以添加多个处理函数
});
3. 事件对象

事件处理函数接收一个事件对象,包含事件相关信息:

document.addEventListener('click', function(event) {// 事件基本信息console.log(event.type);      // 事件类型(如"click")console.log(event.target);    // 触发事件的原始元素console.log(event.currentTarget); // 绑定事件的元素// 鼠标事件特有属性console.log(event.clientX, event.clientY); // 鼠标相对于视口的坐标console.log(event.pageX, event.pageY);     // 鼠标相对于页面的坐标// 键盘事件特有属性console.log(event.key);       // 按下的键名console.log(event.code);      // 键码console.log(event.ctrlKey);   // Ctrl 键是否按下// 阻止默认行为(如链接跳转、表单提交)event.preventDefault();// 阻止事件冒泡event.stopPropagation();
});
4. 事件冒泡与捕获

事件在 DOM 树中有两种传播方式:

// 事件冒泡(默认):从触发元素向上传播到父元素
document.querySelector('div').addEventListener('click', function() {console.log('DIV 被点击');
});
document.querySelector('button').addEventListener('click', function() {console.log('BUTTON 被点击'); // 先触发// 事件会继续冒泡到 DIV 和 document
});// 事件捕获(第三个参数设为 true):从 document 向下传播到触发元素
document.querySelector('div').addEventListener('click', function() {console.log('DIV 捕获阶段'); // 先触发
}, true);
document.querySelector('button').addEventListener('click', function() {console.log('BUTTON 被点击');
}, false); // 默认冒泡阶段
5. 事件委托

利用事件冒泡,将事件处理程序绑定到父元素:

// 为动态添加的元素绑定事件
document.querySelector('ul').addEventListener('click', function(event) {if (event.target.tagName === 'LI') {console.log('点击了列表项:', event.target.textContent);}
});// 动态添加的 LI 也会触发事件
const newLi = document.createElement('li');
newLi.textContent = '新项目';
document.querySelector('ul').appendChild(newLi);
6. 自定义事件

创建和触发自定义事件:

// 创建自定义事件
const myEvent = new Event('customEvent');// 绑定事件处理程序
document.addEventListener('customEvent', function() {console.log('自定义事件被触发');
});// 触发事件
document.dispatchEvent(myEvent);// 带数据的自定义事件
const dataEvent = new CustomEvent('dataEvent', {detail: { message: '这是自定义数据' }
});
document.addEventListener('dataEvent', function(event) {console.log('收到数据:', event.detail.message);
});
document.dispatchEvent(dataEvent);
7. 事件应用场景
// 1. 页面加载完成后执行代码
document.addEventListener('DOMContentLoaded', function() {// DOM 已加载,可安全操作
});// 2. 防止表单默认提交
document.querySelector('form').addEventListener('submit', function(e) {e.preventDefault(); // 阻止表单提交// 处理表单数据
});// 3. 滚动监听(实现回到顶部按钮)
window.addEventListener('scroll', function() {const scrollTop = window.pageYOffset || document.documentElement.scrollTop;if (scrollTop > 300) {document.querySelector('#backToTop').style.display = 'block';} else {document.querySelector('#backToTop').style.display = 'none';}
});// 4. 键盘快捷键
document.addEventListener('keydown', function(e) {if (e.ctrlKey && e.key === 's') {e.preventDefault(); // 阻止浏览器默认的保存行为saveDocument();}
});



← 上一篇 AngularJS知识快速入门(上)
记得点赞、关注、收藏哦!
下一篇 Ajax——在OA系统提升性能的局部刷新 →

文章转载自:
http://chalice.bdypl.cn
http://acopic.bdypl.cn
http://bookmark.bdypl.cn
http://berretta.bdypl.cn
http://bombasine.bdypl.cn
http://caecal.bdypl.cn
http://ancon.bdypl.cn
http://alumina.bdypl.cn
http://albata.bdypl.cn
http://abroad.bdypl.cn
http://apport.bdypl.cn
http://anadromous.bdypl.cn
http://axletree.bdypl.cn
http://awaken.bdypl.cn
http://antioxidant.bdypl.cn
http://bonanzagram.bdypl.cn
http://choroideremia.bdypl.cn
http://brochette.bdypl.cn
http://backwood.bdypl.cn
http://barabbas.bdypl.cn
http://and.bdypl.cn
http://ani.bdypl.cn
http://anodize.bdypl.cn
http://associateship.bdypl.cn
http://calycinal.bdypl.cn
http://carbamate.bdypl.cn
http://captan.bdypl.cn
http://bribable.bdypl.cn
http://agronomy.bdypl.cn
http://amygdalate.bdypl.cn
http://www.dtcms.com/a/281039.html

相关文章:

  • 【数据同化案例1】ETKF求解 Lorenz-63 模型的同化系统(完整MATLAB实现)
  • Java-特殊文件、日志技术
  • CherryStudio配置DeepSeek调用MCP服务实现任务自动化
  • Elasticsearch 9.x 搜索执行过程(源码解析)
  • AOP简化MyBatis分页:高效自动化方案
  • 第二十篇 Word文档自动化:Python批量生成、模板填充与内容修改,告别繁琐排版!
  • Web3 支付系统:面向企业和消费者的全面概述
  • 时间序列挖掘及建模
  • Linux系统集群部署模块之Keepalived双机热备
  • 使用SQLMAP的文章管理系统CMS的sql注入渗透测试
  • Java全栈工程师面试实录:从电商系统到AIGC的层层递进
  • WSF70N10G N 沟道 MOSFET 在蓝牙耳机中的应用分析
  • Linux获取CPU/GPU的温度
  • docker部署gbase8s(数据持久化)并用可视化工具管理
  • NuGet01-安装及使用
  • gRPC实战指南:像国际快递一样调用跨语言服务 —— 解密Protocol Buffer与HTTP/2的完美结合
  • 【GPIO】从STM32F103入门GPIO寄存器
  • Video Python(Pyav)解码一
  • 面试150 完全二叉树的节点数
  • 力扣73:矩阵置零
  • 20250715_Sneak_neuro 靶机复盘
  • 三种深度学习模型(LSTM、CNN-LSTM、贝叶斯优化的CNN-LSTM/BO-CNN-LSTM)对北半球光伏数据进行时间序列预测
  • 【15】MFC入门到精通——MFC弹窗提示 MFC关闭对话框 弹窗提示 MFC按键触发 弹窗提示
  • C++(STL源码刨析/stack/queue/priority_queue)
  • Linux操作系统之信号:保存与处理信号
  • 23种设计模式--#1工厂模式
  • 运维打铁: 软件定义网络(SDN)的实践应用
  • tun2socks原理浅析
  • 在新闻资讯 APP 中添加不同新闻分类页面,通过 ViewPager2 实现滑动切换
  • 【LeetCode 热题 100】226. 翻转二叉树——DFS