热门标签 | 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中统一的监听函数接口。

推荐阅读
  • 本文深入探讨Java编程语言的关键特性,包括但不限于其简洁性、强大的面向对象能力、跨平台兼容性、安全机制、高效性能及多线程支持等方面。文章旨在为开发者提供全面理解Java特性的指导。 ... [详细]
  • 如何配置浏览器以阻止网页自动跳转及直接访问HTML文件
    本文介绍通过调整浏览器的安全设置来防止网页自动跳转的方法,同时提供了一些额外的技巧来增强网络安全性和用户体验。 ... [详细]
  • 本文档详细介绍了Scrapy框架中的信号系统,包括如何利用信号来增强爬虫的功能性和灵活性,以及各个内置信号的具体用途和参数。 ... [详细]
  • 本文将详细探讨 Linux 系统中的 netstat 命令,该命令用于查看网络状态和连接情况。通过了解 IP 地址和端口的基本概念,我们将更好地理解如何利用 netstat 命令来监控和管理网络服务。 ... [详细]
  • 深入理解Python中的sorted高阶函数
    排序是编程中常见的需求,无论是简单的数字排序还是复杂的对象排序,其核心都是比较两个元素。本文将探讨如何利用Python的高阶函数`sorted()`,通过自定义键函数来实现灵活多样的排序逻辑。 ... [详细]
  • Android中实现复合旋转动画效果
    本文将探讨如何在Android应用中实现动态且吸引人的旋转动画。通过结合多种动画类型,如透明度变化、旋转、缩放和位移,可以创造出更为复杂的视觉效果。我们将从XML布局和Java代码两个方面进行详细介绍。 ... [详细]
  • MapReduce原理是怎么剖析的
    这期内容当中小编将会给大家带来有关MapReduce原理是怎么剖析的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1 ... [详细]
  • Android商城应用开发指南(第二部分):创建启动欢迎页
    大多数商城应用程序在启动时会显示一个欢迎页面,以提升用户体验。本文将指导您如何实现一个基本的欢迎页,该页面会在用户打开应用后短暂展示,随后自动跳转至主界面。 ... [详细]
  • RegExp 对象在 JavaScript 中用于定义和操作正则表达式,这是一种强大的文本模式匹配工具。通过 RegExp,开发者可以执行复杂的文本搜索和替换操作。 ... [详细]
  • Web前端性能提升指南:简化JavaScript与消除重复脚本
    本文为Web前端性能优化系列的第七篇,重点探讨简化JavaScript代码及清除重复脚本的方法。通过这些技术,可以显著提高网页加载速度和用户体验。了解更多信息,请参阅我们的完整指南:Web前端性能优化。 ... [详细]
  • 探讨了在用户浏览不同页面时,如何无缝循环播放背景音乐的技术方案,包括自动播放和跨页面状态保持。 ... [详细]
  • 本文介绍了如何在 GitHub 的 Markdown 文件中正确显示数学公式的方法,适用于非博客环境。 ... [详细]
  • Canvas漫游:碰撞检测与动画模拟
    探索Canvas在Web开发中的应用,通过碰撞检测与动画模拟提升交互体验。 ... [详细]
  • Python编码入门指南
    本文探讨了使用Python进行网络设备连通性测试的简便性,特别是针对IP地址范围为192.168.0.101至192.168.0.200的设备。通过比较Python与Shell、Java等语言,展示了Python在执行此类任务时的优势。 ... [详细]
  • Node.js 入门指南(一)
    本文介绍了Node.js的安装步骤、如何创建第一个应用程序、NPM的基本使用以及处理回调函数的方法。通过实际操作示例,帮助初学者快速掌握Node.js的基础知识。 ... [详细]
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社区 版权所有