JS中addEventListener作用及使用场景
来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习文章相关编程知识。下面本篇文章就来带大家聊聊《JS 中 addEventListener 作用及使用场景》,介绍一下,希望对大家的知识积累有所帮助,助力实战开发!
使用 addEventListener 而不是直接在 HTML 中绑定事件,是因为它能解耦 JavaScript 代码与 HTML 结构,支持为同一元素添加多个同类型事件监听器而不覆盖,提升代码的可维护性和灵活性;1. 直接在 HTML 中使用 onclick 等属性会导致结构与行为耦合,不利于复用和管理;2. addEventListener 允许绑定多个事件处理函数,执行时按添加顺序依次触发;3. 常见使用场景包括表单提交处理、鼠标与键盘事件响应、页面加载初始化及事件委托优化性能;4. 移除事件监听器需使用 removeEventListener,并传入相同的事件类型、函数引用和 useCapture 参数,因此通常需将监听函数定义为变量以便移除;5. 第三个参数 useCapture 为布尔值,默认 false 表示事件在冒泡阶段执行,设为 true 则在捕获阶段执行,控制事件触发顺序,适用于需要提前拦截或阻止事件传播的场景。

addEventListener 方法允许你向 HTML 元素添加事件监听器,从而在特定事件发生时执行指定的函数。它比直接在 HTML 标签中使用 onclick 等属性更加灵活和强大。

addEventListener 方法的主要作用是解耦事件处理逻辑和 HTML 结构,使得代码更易于维护和扩展。你可以为一个元素添加多个事件监听器,而不会覆盖之前的监听器。
为什么使用 addEventListener 而不是直接在 HTML 中绑定事件?
直接在 HTML 标签中绑定事件,例如 ,虽然简单,但存在一些问题。首先,它将 HTML 结构和 JavaScript 代码紧密耦合在一起,不利于代码的维护和复用。其次,一个元素只能绑定一个同类型的事件处理函数,如果需要绑定多个,后面的会覆盖前面的。

addEventListener 方法解决了这些问题。它可以为一个元素添加多个相同类型的事件监听器,并且可以将事件处理逻辑与 HTML 结构分离,提高代码的可读性和可维护性。例如:
const button = document.getElementById('myButton');
button.addEventListener('click', function() {
console.log('Button clicked (first listener)');
});
button.addEventListener('click', function() {
console.log('Button clicked (second listener)');
});在这个例子中,当点击按钮时,两个事件监听器都会被执行,分别输出不同的信息。

addEventListener 的常见使用场景有哪些?
addEventListener 的使用场景非常广泛,几乎所有需要响应用户交互或特定事件的场景都可以使用它。一些常见的例子包括:
- 处理表单提交: 监听表单的
submit事件,在提交前进行数据验证或进行异步提交。
const form = document.getElementById('myForm');
form.addEventListener('submit', function(event) {
event.preventDefault(); // 阻止默认的表单提交行为
console.log('Form submitted');
// 在这里进行数据验证或异步提交
});- 响应鼠标事件: 监听元素的
click、mouseover、mouseout等鼠标事件,实现各种交互效果。
const element = document.getElementById('myElement');
element.addEventListener('mouseover', function() {
element.style.backgroundColor = 'red';
});
element.addEventListener('mouseout', function() {
element.style.backgroundColor = 'white';
});- 监听键盘事件: 监听
keydown、keyup、keypress等键盘事件,实现键盘快捷键或输入控制。
document.addEventListener('keydown', function(event) {
if (event.key === 'Enter') {
console.log('Enter key pressed');
}
});- 处理页面加载和卸载事件: 监听
DOMContentLoaded、load、beforeunload等事件,在页面加载完成或卸载前执行一些操作。
document.addEventListener('DOMContentLoaded', function() {
console.log('DOM loaded');
// 在这里进行初始化操作
});- 使用事件委托优化性能: 将事件监听器绑定到父元素上,利用事件冒泡机制处理子元素的事件,减少事件监听器的数量,提高性能。例如,监听
ul元素的点击事件,然后根据点击的li元素的不同,执行不同的操作。这样就避免了为每个li元素都绑定一个点击事件监听器。
const list = document.getElementById('myList');
list.addEventListener('click', function(event) {
if (event.target.tagName === 'LI') {
console.log('List item clicked:', event.target.textContent);
// 根据点击的 list item 执行不同的操作
}
});如何移除通过 addEventListener 添加的事件监听器?
可以使用 removeEventListener 方法来移除之前添加的事件监听器。需要注意的是,removeEventListener 方法需要传入与 addEventListener 方法相同的事件类型、监听函数和 useCapture 参数。因此,通常需要将监听函数保存到一个变量中,以便在移除时使用。
const button = document.getElementById('myButton');
function handleClick() {
console.log('Button clicked');
button.removeEventListener('click', handleClick); // 移除事件监听器
}
button.addEventListener('click', handleClick);在这个例子中,当点击按钮时,会输出 "Button clicked",然后移除该事件监听器。再次点击按钮时,不会再有任何输出。
addEventListener 的第三个参数 useCapture 有什么作用?
addEventListener 方法的第三个参数 useCapture 是一个布尔值,用于指定事件监听器是在捕获阶段还是冒泡阶段执行。默认值为 false,表示在冒泡阶段执行。
- 捕获阶段: 事件从根元素开始,沿着 DOM 树向下传播,直到到达目标元素。
- 冒泡阶段: 事件从目标元素开始,沿着 DOM 树向上传播,直到到达根元素。
如果 useCapture 设置为 true,则事件监听器会在捕获阶段执行,这意味着它会比在冒泡阶段执行的事件监听器更早地接收到事件。通常情况下,我们不需要使用捕获阶段,除非需要对事件进行一些特殊的处理,例如阻止事件继续传播。
const parent = document.getElementById('parent');
const child = document.getElementById('child');
parent.addEventListener('click', function() {
console.log('Parent clicked (bubbling)');
});
child.addEventListener('click', function(event) {
console.log('Child clicked (bubbling)');
//event.stopPropagation(); // 阻止事件冒泡
});
parent.addEventListener('click', function() {
console.log('Parent clicked (capturing)');
}, true);
child.addEventListener('click', function() {
console.log('Child clicked (capturing)');
}, true);在这个例子中,如果没有 event.stopPropagation(),点击 child 元素,输出顺序是:Child clicked (capturing),Parent clicked (capturing),Child clicked (bubbling),Parent clicked (bubbling)。如果 child 的 bubbling 阶段增加了 event.stopPropagation(),则只会输出:Child clicked (capturing),Parent clicked (capturing),Child clicked (bubbling)。
文中关于解耦,removeEventListener,addEventListener,DOM事件,事件流的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《JS中addEventListener作用及使用场景》文章吧,也可关注golang学习网公众号了解相关技术文章。
Gradle多模块依赖配置与错误规避指南
- 上一篇
- Gradle多模块依赖配置与错误规避指南
- 下一篇
- Golang反射判断方法是否存在方法
-
- 文章 · 前端 | 5小时前 |
- 前端 source map 发布怎样保护源码边界
- 194浏览 收藏
-
- 文章 · 前端 | 5小时前 | websocket · javascript · 前端工程 · websocket 自动重连 心跳 visibilitychange 后台标签页
- WebSocket 心跳怎样避免页面休眠后误判断线
- 483浏览 收藏
-
- 文章 · 前端 | 5小时前 | 前端 · 实时通信 WebTransport HTTP/3 双向流 Datagram
- WebTransport 怎样选择双向流和 Datagram
- 440浏览 收藏
-
- 文章 · 前端 | 5小时前 |
- Web Streams 怎样处理背压和取消
- 175浏览 收藏
-
- 文章 · 前端 | 5小时前 | VUE watch 响应式 Composition API reactive
- Vue watch 怎样只监听对象的一个字段
- 297浏览 收藏
-
- 文章 · 前端 | 5小时前 |
- React Suspense 数据加载怎样避免瀑布请求
- 368浏览 收藏
-
- 文章 · 前端 | 5小时前 | typescript · javascript · 前端开发 · 类型系统 · TypeScript any 类型收窄 UNKNOWN 类型守卫
- TypeScript unknown 和 any 怎样选择
- 230浏览 收藏
-
- 文章 · 前端 | 5小时前 | 数组 · typescript · 前端开发 · 类型系统 · TypeScript 数组索引 类型收窄 noUncheckedIndexedAccess
- TypeScript noUncheckedIndexedAccess 开启后的数组读取处理方案
- 435浏览 收藏
-
- 文章 · 前端 | 6小时前 | 环境变量 · javascript · 前端工程 · 环境变量 vite 运行时配置 前端构建 import.meta.env
- Vite 环境变量为什么不能在运行时直接修改
- 413浏览 收藏
-
- 文章 · 前端 | 6小时前 |
- Vite 依赖预构建缓存失效怎样定位
- 236浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 473次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 531次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 551次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 503次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 319次使用
-
- JavaScript函数定义及示例详解
- 2025-05-11 502浏览
-
- 智能体安全引领产业升级——国内AI安全产品市场深度分析
- 2026-08-21 501浏览
-
- CSS变量简化按钮悬停效果技巧
- 2026-05-31 501浏览
-
- JavaScript符号类型详解与应用
- 2026-05-31 501浏览
-
- HTML剪贴板复制粘贴怎么用
- 2026-05-26 501浏览
