热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JavaScript中的事件处理机制

事件是程序各部分之间的一种通信方式,也是异步编程的一种实现形式。本文将详细介绍EventTarget接口及其相关方法,以及如何使用监听函数处理事件。

事件是程序各部分之间的一种通信方式,也是异步编程的一种实现形式。本文将详细介绍EventTarget接口及其相关方法,以及如何使用监听函数处理事件。

1. EventTarget接口

EventTarget接口用于接收和触发事件。所有的DOM节点对象都实现了这个接口。该接口提供了三个实例方法:

  • addEventListener: 绑定事件监听器
  • removeEventListener: 移除事件监听器
  • dispatchEvent: 触发事件

1.1 EventTarget.addEventListener()

EventTarget.addEventListener() 方法用于为节点或对象绑定一个事件监听器。一个对象或节点可以绑定多个监听器,但如果每个监听器的监听函数相同,则只会执行一次,其他相同的函数会被自动移除。

该方法接受三个参数:

target.addEventListener(type, listener[, options]);
  • type: 事件类型(如:click, focus),区分大小写。
  • listener: 监听函数(函数名)。当事件发生时,会调用此函数。
  • options: 可选参数,可以是布尔值或一个包含以下属性的对象:
  • capture: 布尔值,表示该事件是否在捕获阶段触发监听函数。默认值为 false(仅在冒泡阶段触发)。
  • once: 布尔值,表示监听函数只触发一次,然后自动移除。
  • passive: 布尔值,表示监听函数不会调用事件的 preventDefault 方法。如果监听函数调用了,浏览器会忽略该请求,并在控制台输出警告。

示例 1:

const oDiv = document.querySelector('.div1');
function eventFun() {
  console.log('事件监听器已触发');
}
oDiv.addEventListener('click', eventFun, false);

示例 2:

oDiv.addEventListener('click', {
  handleEvent: function() {
    console.log('handleEvent 方法已调用');
  }
});

1.2 EventTarget.removeEventListener()

EventTarget.removeEventListener() 方法用于移除通过 addEventListener 添加的事件监听器。该方法没有返回值,用法与 addEventListener 完全相同。

1.3 EventTarget.dispatchEvent()

EventTarget.dispatchEvent() 方法在当前节点上触发指定事件,从而调用相应的监听函数。该方法返回一个布尔值,如果任何一个监听函数调用了 Event.preventDefault(),则返回 false,否则返回 true

示例 3:

oDiv.addEventListener('click', eventFun, false);
const event = new Event('click');
oDiv.dispatchEvent(event); // 自动触发 click 事件

2. 监听函数

浏览器的事件模型通过监听函数来响应事件。当浏览器检测到某个事件时,会调用相应的监听函数。Javascript 中有三种方法可以为事件绑定监听函数:

2.1 HTML 的 on- 属性

// 这样绑定的是函数名 + (),当事件发生时会立即执行函数

2.2 元素节点的事件属性

div.Onclick= function() {
  console.log('节点事件已触发');
};

2.3 EventTarget.addEventListener()

使用方法同上一小节。

2.4 总结

第一种方法违反了HTML与Javascript代码分离的原则,不利于代码维护,不推荐使用。
第二种方法,同一个事件只能定义一个监听函数。如果多次定义,后面的会覆盖前面的。不推荐使用。
第三种方法是推荐且官方指定的监听函数方法,原因如下:

  • 同一个事件可以添加多个监听函数。
  • 可以指定在哪个阶段触发监听函数。
  • 除了DOM节点,其他对象(如:window, XMLHttpRequest 等)也实现了这个接口,它是整个Javascript中统一的监听函数接口。

推荐阅读
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 本文介绍了如何利用JavaScript或jQuery来判断网页中的文本框是否处于焦点状态,以及如何检测鼠标是否悬停在指定的HTML元素上。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
  • 在使用 MUI 框架进行应用开发时,开发者常常会遇到 mui.init() 和 mui.plusReady() 这两个方法。本文将详细解释它们的区别及其在不同开发环境下的应用。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 导航栏样式练习:项目实例解析
    本文详细介绍了如何创建一个具有动态效果的导航栏,包括HTML、CSS和JavaScript代码的实现,并附有详细的说明和效果图。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 本文介绍了如何使用JQuery实现省市二级联动和表单验证。首先,通过change事件监听用户选择的省份,并动态加载对应的城市列表。其次,详细讲解了使用Validation插件进行表单验证的方法,包括内置规则、自定义规则及实时验证功能。 ... [详细]
  • 解决PHP与MySQL连接时出现500错误的方法
    本文详细探讨了当使用PHP连接MySQL数据库时遇到500内部服务器错误的多种解决方案,提供了详尽的操作步骤和专业建议。无论是初学者还是有经验的开发者,都能从中受益。 ... [详细]
  • 利用存储过程构建年度日历表的详细指南
    本文将介绍如何使用SQL存储过程创建一个完整的年度日历表。通过实例演示,帮助读者掌握存储过程的应用技巧,并提供详细的代码解析和执行步骤。 ... [详细]
  • 本文详细介绍了macOS系统的核心组件,包括如何管理其安全特性——系统完整性保护(SIP),并探讨了不同版本的更新亮点。对于使用macOS系统的用户来说,了解这些信息有助于更好地管理和优化系统性能。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
author-avatar
xiaoge
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有