JS中addEventListener作用及使用场景
时间:2025-09-12 12:10:43 480浏览 收藏
来到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学习网公众号了解相关技术文章。
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
133 收藏
-
417 收藏
-
208 收藏
-
112 收藏
-
292 收藏
-
222 收藏
-
377 收藏
-
194 收藏
-
353 收藏
-
179 收藏
-
375 收藏
-
190 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 514次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 499次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习