JavaScript基础-事件对象

一、前言

在前端开发中,用户与页面的交互行为(如点击按钮、输入文本、滚动页面等)都会触发相应的事件。而这些事件发生时,浏览器会自动创建一个 事件对象(Event Object),它包含了当前事件的所有信息。

掌握事件对象是实现复杂交互逻辑的基础技能之一。本文将带你深入了解:

  • 什么是事件对象;
  • 事件对象的常见属性与方法;
  • 如何阻止默认行为与事件传播;
  • 实际开发中的典型使用场景;
  • 推荐的最佳实践;

通过这篇文章,你将能够熟练地使用 event 对象来增强网页的交互体验。

二、什么是事件对象?

当一个事件被触发时(例如点击、键盘按下、鼠标移动等),浏览器会自动为该事件创建一个事件对象(Event 或其子类实例),并将其作为参数传递给事件处理函数。

document.addEventListener('click', function(event) {console.log(event)
})

📌 事件对象包含的信息有:

  • 触发事件的目标元素(target)
  • 鼠标位置坐标(clientX / clientY)
  • 键盘按键值(keyCode)
  • 是否按下了 Ctrl/Shift 等修饰键
  • 阻止默认行为的方法(preventDefault)
  • 阻止事件传播的方法(stopPropagation)

三、事件对象的主要属性和方法

属性/方法描述
target触发事件的真实元素(原始触发者)
currentTarget绑定事件监听器的元素(this 指向的对象)
type事件类型(如 'click'、'keydown' 等)
preventDefault()阻止浏览器的默认行为(如链接跳转、表单提交)
stopPropagation()阻止事件继续传播(捕获或冒泡)
stopImmediatePropagation()阻止该事件的所有后续监听器执行
bubbles表示该事件是否会冒泡
cancelable表示是否可以取消该事件的默认行为
eventPhase当前事件所处的阶段(捕获、目标、冒泡)

✅ 示例:获取事件对象的基本信息

<a href="https://example.com" id="link">点击我</a><script>
document.getElementById('link').addEventListener('click', function(event) {console.log('事件类型:', event.type) // clickconsole.log('目标元素:', event.target) // <a> 元素console.log('绑定事件的元素:', event.currentTarget) // 同上console.log('是否可阻止默认:', event.cancelable) // trueconsole.log('是否冒泡:', event.bubbles) // trueconsole.log('事件阶段:', event.eventPhase) // 2(目标阶段)
})
</script>

四、target 与 currentTarget 的区别

这是开发者最容易混淆的一组属性。

🧠 理解差异:

  • event.target:真正触发事件的 DOM 元素(可能是子元素)。
  • event.currentTarget:绑定事件监听器的那个元素(即 this)。

✅ 示例说明:

<div id="container"><button id="btn">点击我</button>
</div><script>
document.getElementById('container').addEventListener('click', function(event) {console.log('event.target:', event.target) // 可能是 button 或 divconsole.log('event.currentTarget:', event.currentTarget) // 始终是 container
})
</script>

📌 场景总结:

使用场景推荐属性
获取真正点击的元素event.target
获取绑定事件的元素event.currentTarget

五、阻止默认行为:preventDefault()

有些 HTML 元素自带默认行为,比如:

  • <a> 标签点击会跳转;
  • <form> 提交会刷新页面;
  • <input type="checkbox"> 点击会切换状态;

我们可以使用 event.preventDefault() 来阻止这些默认行为。

✅ 示例:阻止链接跳转

document.querySelector('a').addEventListener('click', function(event) {event.preventDefault()alert('链接被点击,但没有跳转')
})

📌 注意事项:

  • 不会影响事件传播;
  • 适用于自定义行为替代默认行为的场景。

六、阻止事件传播:stopPropagation()

默认情况下,事件会在 DOM 树中进行传播(捕获 → 目标 → 冒泡)。我们可以通过 stopPropagation() 来阻止事件继续传播到其他节点。

✅ 示例:阻止父级元素响应事件

<div id="parent">父容器<button id="child">点击我</button>
</div><script>
document.getElementById('parent').addEventListener('click', () => {console.log('父元素被点击')
})document.getElementById('child').addEventListener('click', function(event) {console.log('子元素被点击')event.stopPropagation()
})
</script>

📌 输出结果:

子元素被点击

父元素不会收到事件通知。

七、彻底阻止事件:stopImmediatePropagation()

如果你希望不仅阻止事件传播,还想阻止当前元素上的其它监听器执行,可以使用这个方法。

✅ 示例:

const btn = document.getElementById('btn')btn.addEventListener('click', function (e) {console.log('第一个监听器')e.stopImmediatePropagation()
})btn.addEventListener('click', function () {console.log('第二个监听器') // 不会执行
})

📌 效果:

  • 第一个监听器调用 stopImmediatePropagation() 后,所有后续监听器都不会执行。

八、事件对象的实际应用场景

场景描述
表单验证在 submit 事件中使用 preventDefault() 自定义提交逻辑
弹窗关闭点击遮罩层关闭弹窗,使用 target 判断是否点击了遮罩区域
表格行点击获取点击的具体行数据
鼠标坐标获取记录用户点击的位置
多个监听器控制使用 stopImmediatePropagation() 控制优先级
动态加载内容通过 target 判断点击的是哪个动态生成的元素

九、事件对象的兼容性注意事项

虽然现代浏览器都支持标准的 Event API,但在一些旧版本浏览器(如 IE)中可能会存在兼容问题。

方法/属性IE 支持情况解决方案
event.target✅ IE9+
event.currentTarget❌ IE8 及以下不支持
event.preventDefault()✅ IE9+
event.stopPropagation()✅ IE9+
event.stopImmediatePropagation()❌ IE 不支持
event.clientX / Y✅ 支持良好

📌 推荐做法:

  • 使用现代浏览器开发;
  • 若需兼容旧版浏览器,建议使用框架(如 jQuery)封装兼容性处理;
  • 或自行封装 polyfill。

十、总结对比表

特性推荐方式
获取触发元素event.target
获取绑定元素event.currentTarget
阻止默认行为event.preventDefault()
阻止事件传播event.stopPropagation()
彻底阻止事件event.stopImmediatePropagation()
获取鼠标坐标event.clientX / clientY
推荐程度✅ 所有开发者必须掌握

十一、结语

感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!

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

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

相关文章

蓝桥杯_染色_bfs_Java

临时抱抱佛脚&#xff0c;太浮躁了&#xff0c;蓝桥杯已经快1个半月没做题了。 本人比较菜&#xff0c;感觉这个时间节点也只能把暴力题给尽量多做做&#xff0c;找找做题手感&#xff0c;其他就纯凭运气了吧。T-T。 题目 问题描述 小蓝有一个 n 行 m 列的白色棋盘, 棋盘的每一…

MySQL 究极奥义·动态乾坤大挪移·无敌行列转换术

导入大SQL文件 [mysqld] # 大批量导入优化 bulk_insert_buffer_size1G max_allowed_packet1G innodb_autoextend_increment512M innodb_buffer_pool_size4G innodb_log_buffer_size4G innodb_log_file_size4G动态行列转换 DROP TABLE IF EXISTS tb_score;CREATE TABLE tb_sco…

Excel大厂自动化报表实战(互联网金融-数据分析周报制作中)

这是Excel大厂自动化报表实战第三期--互联网金融-数据分析周报制作中 数据资源已经与这篇博客捆绑&#xff0c;有需要者可以下载通过网盘分享的文件&#xff1a;2.4自动化报表-8月成交数据.xlsx&#xff0c;2.4自动化报表-8月获客数据.csv等2个文件 链接: https://pan.baidu.c…

langchain从入门到精通(七)——利用回调功能调试链应用 - 让过程更透明

1. Callback 功能介绍 Callback 是 LangChain 提供的回调机制&#xff0c;允许我们在 LLM 应用程序的各个阶段使用 hook &#xff08;钩子&#xff09;。钩子的含义也非常简单&#xff0c;我们把应用程序看成一个一个的处理逻辑&#xff0c;从开始到结束&#xff0c;钩子就是在…

如何使用Postman做接口自动化测试

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 本文适合已经掌握 Postman 基本用法的读者&#xff0c;即对接口相关概念有一定了解、已经会使用 Postman 进行模拟请求等基本操作。 工作环境与版本&#xff1a; …

ELK日志文件分析系统——E(Elasticsearch)

目录 基本概念 一、架构设计 二、核心原理 三、关键特性 四、应用意义 部署步骤 ‌一、环境准备‌ ‌二、安装 Elasticsearch‌ ‌三、关键配置&#xff08;elasticsearch.yml&#xff09;‌ ‌四、启动与验证‌ ‌五、集群扩展&#xff08;新增节点&#xff09;‌ …

融智学教育观及其数学公式体系凝练汇总

摘要&#xff1a;本文系统阐述了邹晓辉教授的融智学教育观&#xff0c;通过原创数学公式体系构建了人机协同教育模型。核心内容包括&#xff1a;认知本体论&#xff08;文明智慧当量方程&#xff09;、方法论&#xff08;七遍通训练算子&#xff09;、生态位控制论&#xff08;…

互联网大厂Java求职面试:AI大模型应用实践中的架构挑战与实战

互联网大厂Java求职面试&#xff1a;AI大模型应用实践中的架构挑战与实战 引言 在当今技术飞速发展的时代&#xff0c;AI大模型已成为企业数字化转型的重要引擎。无论是内容生成、智能客服、个性化推荐&#xff0c;还是知识图谱构建和语义理解&#xff0c;大模型的应用场景正在…

龟兔赛跑算法(Floyd‘s Cycle-Finding Algorithm)寻找重复数

龟兔赛跑算法&#xff08;Floyd’s Cycle-Finding Algorithm&#xff09;寻找重复数 问题描述 给定一个长度为 N1 的数组 nums&#xff0c;其中每个元素的值都在 [1, N] 范围内。根据鸽巢原理&#xff0c;至少有一个数字是重复的。请找出这个重复的数字。 要求&#xff1a; …

紫光展锐T8300以创新音频技术重塑感知世界

数字化时代&#xff0c;从语音通话到智能交互&#xff0c;从聆听音乐到创作Vlog&#xff0c;声音已成为隐形的基础措施。日益发展的音频技术正在重构用户感知世界的方式&#xff0c;重塑用户的听觉体验。 T8300是紫光展锐专为全球主流用户打造的5G SoC&#xff0c;采用了紫光展…

写作词汇积累(A):颇有微词、微妙(“微”字的学习理解)

一、颇有微词 1、基本介绍 【颇有微词】指对某人或某事有轻微的批评、不满或不同意见&#xff0c;但表达得含蓄委婉 【颇】表示程度较深&#xff0c;【微词】表示隐晦的批评 【微】表示隐晦的、不直白的&#xff0c;强调批评的委婉性 2、使用实例 1、尽管公司的新考勤制度…

flowable工作流的学习demo

1.spring 部署流程 删除部署 查看历史信息 加载一个默认的配置文件 里面包含用户名和数据库信息 加载自定义的配置文件 flowable.cfg.xml <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance…

XCTF-misc-can_has_stdio?

下载得到一个文件 ┌──(kali㉿kali)-[~] └─$ file misc50 misc50: ASCII text, with very long lines (536)┌──(kali㉿kali)-[~] └─$ cat misc50 …

【编译工具】(自动化)AI 赋能的自动化测试工具:如何让测试效率提升 500% 并实现智能质检?

#『编程工具』提升效率征文挑战赛# 目录 引言&#xff1a;AI 如何重塑自动化测试格局 一、新一代 AI 测试工具核心能力解析 二、实战演示&#xff1a;Testim 智能测试平台 &#xff08;1&#xff09;智能录制测试流程 ① 步骤演示 ② AI 元素定位原理 &#xff08…

毛纪逆向分析

文章目录 毛纪逆向分析前言知识系统整体架构概述模块分析模块0模块1模块2模块3模块4模块5总结毛纪逆向分析 对爬虫、逆向感兴趣的同学可以查看文章,一对一小班教学(系统理论和实战教程)、提供接单兼职渠道:https://blog.csdn.net/weixin_35770067/article/details/142514698…

【力扣 简单 C】141. 环形链表

目录 题目 解法一&#xff1a;哈希 解法二&#xff1a;快慢指针 题目 解法一&#xff1a;哈希 struct node {struct ListNode* val;struct node* next; };struct hashSet {struct node** bucket;int size; };struct hashSet* hashSetInit(int size) {struct hashSet* hashS…

Eureka 服务注册与发现原理和使用

1.Eureka 基础概念 Eureka 是 Netflix 开发的服务注册与发现组件&#xff0c;是 Spring Cloud 微服务架构中的核心模块&#xff0c;用于解决微服务间的自动发现与通信问题。其核心功能包括&#xff1a; 服务注册&#xff1a;服务实例将自身信息&#xff08;IP、端口、健康状态等…

create_react_agent + MCP tools

文章目录 MCP tools 调用结果输出MCP Tool 内容成功返回失败返回 普通工具调用 https://blog.csdn.net/2401_89025022/article/details/148629902 MCP tools 调用 import time import asyncio import json from langgraph.prebuilt import create_react_agent from langch…

提示词Prompts(1)

摘要&#xff1a; 本文介绍了langchain.prompts中基础的提示词模板的用法&#xff0c;包括基础的文本模板、对话模板、小样本模板、以及主要两种样本选择器的用法。 文章目录 1. prompts介绍&#xff1f;2. 提示词模板体系 Prompt Templates2.1 基础文本模板 PromptTemplate2.2…

如何在 Elementary OS 上安装最新版本的 VirtualBox

Elementary OS 是一个基于 Ubuntu Linux 的发行版&#xff0c;它易于使用&#xff0c;对初学者友好&#xff0c;并且在用户中非常受欢迎。如果你是 Elementary OS 的用户&#xff0c;并且想在上面虚拟运行和探索其他操作系统&#xff0c;那么 Oracle VirtualBox 是一个非常不错…