『JavaScript』JavaScript事件类型详解:全面解析各类用户交互行为

news2024/11/28 7:34:34

请添加图片描述

请添加图片描述
📣读完这篇文章里你能收获到

  • 理解事件驱动编程的基本概念和工作原理
  • 掌握JavaScript中常见的事件类型及其应用场合
  • 学习如何使用DOM API添加和移除事件监听器
  • 探讨事件冒泡、事件捕获和事件委托等高级事件处理技术

请添加图片描述

文章目录

  • 一、事件处理程序
    • 1. HTML事件处理
      • HTML事件处理的局限性
    • 2. DOM0级事件处理
      • DOM0级事件处理的特点
    • 3. DOM2级事件处理
      • DOM2级事件处理的特点
  • 二、Event对象的属性和方法
    • 1. 事件行为概念
      • 1.1 事件默认行为
      • 1.2 事件冒泡
    • 2. Event对象属性
    • 3. Event对象方法
  • 三、事件类型
    • 1. 鼠标事件
    • 2. 键盘事件
    • 3. 触摸事件
    • 4. 窗口事件
    • 5. 表单事件
  • 四、高级事件处理技术
    • 1. 事件冒泡和事件捕获
    • 2. 事件委托

请添加图片描述

一、事件处理程序

1. HTML事件处理

HTML事件处理是通过在HTML元素上直接定义事件处理器来处理事件的一种方式。

<button onclick="handleClick()">Click me</button>

在上面的例子中,我们为按钮元素定义了一个onclick事件处理器,当用户点击按钮时,会调用handleClick函数。

HTML事件处理的局限性

  • 不支持事件捕获阶段。
  • 无法使用addEventListener()和removeEventListener()方法添加或移除事件处理器。
  • 只能定义一个事件处理器,如果需要多个处理器,需要手动合并逻辑。

2. DOM0级事件处理

DOM0级事件处理是在JavaScript中直接为DOM元素的事件属性赋值来添加事件处理器的方式。

let button = document.getElementById("myButton");
button.onclick = function() {
  console.log("Button clicked!");
};

在这个例子中,我们为按钮元素的onclick属性赋值为一个函数,当用户点击按钮时,该函数会被调用。

DOM0级事件处理的特点

  • 支持多个事件处理器,后添加的处理器会覆盖之前的处理器。
  • 不支持事件捕获阶段。
  • 使用on前缀的属性(如onclick、onmouseover等)添加事件处理器。

3. DOM2级事件处理

DOM2级事件处理是通过addEventListener()removeEventListener()方法来添加和移除事件处理器的标准方式。

let button = document.getElementById("myButton");

// 添加事件监听器
function handleClick(event) {
  console.log("Button clicked!");
}
button.addEventListener("click", handleClick);

// 移除事件监听器
button.removeEventListener("click", handleClick);

DOM2级事件处理的特点

  • 支持事件捕获和冒泡阶段。
  • 支持多个事件处理器,可以同时添加多个处理器。
  • 提供更灵活的事件处理机制。

请添加图片描述

二、Event对象的属性和方法

属性/方法描述
type事件的类型,如 “click”、“mouseover” 等。
target触发事件的元素。
currentTarget绑定事件处理器的元素。
preventDefault()阻止事件的默认行为。
stopPropagation()阻止事件继续向上级元素传播(事件冒泡)。

1. 事件行为概念

1.1 事件默认行为

事件的默认行为是指当特定事件发生时,浏览器根据该事件类型自动执行的预定义操作。这些操作通常是与用户交互相关的常见动作,如点击链接跳转、提交表单、右键菜单弹出等。
例如,当用户点击一个HTML链接(标签)时,浏览器的默认行为是导航到href属性指定的URL。另一个例子是,当用户提交一个HTML表单时,浏览器的默认行为是发送表单数据到action属性指定的URL。

1.2 事件冒泡

事件冒泡是一种事件传播机制,当一个元素上的事件被触发时,该事件不仅会在该元素上执行相应的事件处理器,还会从该元素开始,沿着DOM树向上逐级传播到父元素、祖元素,直到到达根元素(通常为document对象)。在这个过程中,每个包含事件处理器的父元素都会依次执行其对应的处理器。
事件冒泡使得我们可以更容易地处理与整个父元素或容器相关的事件,而不仅仅局限于触发事件的具体子元素。通过在父元素上添加事件处理器,可以简化代码并避免为每个子元素单独添加处理器。1.2

2. Event对象属性

  1. type:表示事件的类型,如 “click”、“mouseover” 等。

案例代码:

let button = document.getElementById("myButton");

button.addEventListener("click", function(event) {
  console.log("Event type:", event.type);
});
  1. target 和 currentTarget
  • target属性表示触发事件的元素。
  • currentTarget属性表示绑定事件处理器的元素。

案例代码:

let container = document.getElementById("container");
let button = document.createElement("button");
button.textContent = "Click me";

container.appendChild(button);

container.addEventListener("click", function(event) {
  console.log("Target:", event.target); // 输出触发事件的元素(按钮)
  console.log("CurrentTarget:", event.currentTarget); // 输出绑定事件处理器的元素(容器)
});

button.addEventListener("click", function(event) {
  console.log("Target (inner):", event.target); // 输出触发事件的元素(按钮)
  console.log("CurrentTarget (inner):", event.currentTarget); // 输出绑定事件处理器的元素(按钮)
});

3. Event对象方法

  1. preventDefault():用于阻止事件的默认行为。
  • 案例:

当用户点击一个HTML链接(标签)时,浏览器的默认行为是导航到href属性指定的URL。另一个例子是,当用户提交一个HTML表单时,浏览器的默认行为是发送表单数据到action属性指定的URL。
在JavaScript中,可以通过调用事件对象的preventDefault()方法来阻止事件的默认行为。这样,即使事件发生了,浏览器也不会执行其默认的操作。

let link = document.getElementById("myLink");

link.addEventListener("click", function(event) {
  event.preventDefault(); // 阻止链接的默认跳转行为
  console.log("Link clicked, but not navigated.");
});
  1. stopPropagation():方法用于阻止事件继续向上级元素传播(事件冒泡)。
  • 案例:

当用户点击按钮时,首先会输出"Child clicked!",然后由于事件冒泡,事件会继续向上传播到父元素,导致"Parent clicked!"也被输出。如果在子元素的事件处理器中使用了event.stopPropagation()方法,那么事件将不会向上冒泡到父元素。

<div id="parent">
  <button id="child">Click me</button>
</div>

<script>
  let parent = document.getElementById("parent");
  let child = document.getElementById("child");

  // 在父元素上添加点击事件处理器
  parent.addEventListener("click", function(event) {
    console.log("Parent clicked!");
  });

  // 在子元素(按钮)上添加点击事件处理器
  child.addEventListener("click", function(event) {
    console.log("Child clicked!");

    // 阻止事件继续向上冒泡到父元素
    // 如果不使用此行代码,事件将继续冒泡到父元素
    //event.stopPropagation();
  });
</script>

请添加图片描述

三、事件类型

1. 鼠标事件

鼠标事件与用户使用鼠标与网页交互的行为相关。

事件名称描述
click用户单击鼠标按钮
dblclick用户双击鼠标按钮
mousedown用户按下任意鼠标按钮
mouseup用户释放任意鼠标按钮
mousemove用户移动鼠标时
mouseover鼠标指针进入某个元素
mouseout鼠标指针离开某个元素
mouseenter鼠标指针进入某个元素(不包括其后代元素)
mouseleave鼠标指针离开某个元素(不包括其后代元素)

DOM0级事件处理案例代码:

let button = document.getElementById("myButton");

// Click event
button.onclick = function() {
  console.log("Button clicked (DOM0)!");
};

// Mouseover event
button.onmouseover = function() {
  console.log("Mouse over the button (DOM0)!");
};

DOM2级事件处理案例代码:

let button = document.getElementById("myButton");

// Click event
button.addEventListener("click", function() {
  console.log("Button clicked (DOM2)!");
});

// Mouseover event
button.addEventListener("mouseover", function() {
  console.log("Mouse over the button (DOM2)!");
});

2. 键盘事件

键盘事件与用户使用键盘与网页交互的行为相关。

事件名称描述
keydown用户按下键盘上的键
keyup用户释放键盘上的键
keypress用户按下字符键(不包括功能键和修饰键)

DOM0级事件处理案例代码:

document.onkeydown = function(event) {
  if (event.key === "Enter") {
    console.log("Enter key pressed (DOM0)!");
  }
};

document.onkeyup = function(event) {
  if (event.key === "Shift") {
    console.log("Shift key released (DOM0)!");
  }
};

DOM2级事件处理案例代码:

document.addEventListener("keydown", function(event) {
  if (event.key === "Enter") {
    console.log("Enter key pressed (DOM2)!");
  }
});

document.addEventListener("keyup", function(event) {
  if (event.key === "Shift") {
    console.log("Shift key released (DOM2)!");
  }
});

3. 触摸事件

触摸事件用于支持触摸设备的交互。

事件名称描述
touchstart用户开始触摸屏幕
touchmove用户在屏幕上移动手指
touchend用户结束触摸屏幕
touchcancel触摸事件被取消(例如系统中断或浏览器切换到另一个应用程序)

请注意,由于触摸事件不支持DOM0级事件处理,以下仅提供DOM2级事件处理案例代码:

let touchArea = document.getElementById("touchArea");

touchArea.addEventListener("touchstart", function(event) {
  console.log("Touch started (DOM2)!");
});

touchArea.addEventListener("touchmove", function(event) {
  console.log("Touch moved (DOM2)!");
});

touchArea.addEventListener("touchend", function(event) {
  console.log("Touch ended (DOM2)!");
});

4. 窗口事件

窗口事件与浏览器窗口的状态或用户操作相关。

事件名称描述
load页面和所有资源完成加载
unload页面即将卸载
beforeunload页面即将卸载,可以返回一个字符串提示用户是否确认离开页面
resize浏览器窗口大小发生变化
scroll用户滚动了包含滚动条的元素

DOM0级事件处理案例代码:

window.onload = function() {
  console.log("Page loaded (DOM0)!");
};

window.onresize = function() {
  console.log("Window resized (DOM0)!");
};

window.onscroll = function() {
  console.log("Window scrolled (DOM0)!");
};

DOM2级事件处理案例代码:

window.addEventListener("load", function() {
  console.log("Page loaded (DOM2)!");
});

window.addEventListener("resize", function() {
  console.log("Window resized (DOM2)!");
});

window.addEventListener("scroll", function() {
  console.log("Window scrolled (DOM2)!");
});

5. 表单事件

表单事件与用户在表单元素上执行的操作相关。

事件名称描述
submit用户提交表单
input用户更改输入元素的内容
change用户更改输入元素的内容并失去焦点
focus元素获得焦点
blur元素失去焦点

DOM0级事件处理案例代码:

let inputElement = document.getElementById("myInput");

// Submit event (on the form element)
let formElement = document.getElementById("myForm");
formElement.onsubmit = function(event) {
  event.preventDefault(); // Prevent default form submission
  console.log("Form submitted (DOM0)!");
};

// Input event
inputElement.oninput = function() {
  console.log("Input changed (DOM0)!");
};

// Change event
inputElement.onchange = function() {
  console.log("Input changed and lost focus (DOM0)!");
};

// Focus event
inputElement.onfocus = function() {
  console.log("Input gained focus (DOM0)!");
};

// Blur event
inputElement.onblur = function() {
  console.log("Input lost focus (DOM0)!");
};

DOM2级事件处理案例代码:

let inputElement = document.getElementById("myInput");

// Submit event (on the form element)
let formElement = document.getElementById("myForm");
formElement.addEventListener("submit", function(event) {
  event.preventDefault(); // Prevent default form submission
  console.log("Form submitted (DOM2)!");
});

// Input event
inputElement.addEventListener("input", function() {
  console.log("Input changed (DOM2)!");
});

// Change event
inputElement.addEventListener("change", function() {
  console.log("Input changed and lost focus (DOM2)!");
});

// Focus event
inputElement.addEventListener("focus", function() {
  console.log("Input gained focus (DOM2)!");
});

// Blur event
inputElement.addEventListener("blur", function() {
  console.log("Input lost focus (DOM2)!");
});

请添加图片描述

四、高级事件处理技术

1. 事件冒泡和事件捕获

事件传播有三个阶段:事件捕获阶段、目标阶段和事件冒泡阶段。默认情况下,事件从最外层元素向内传播(事件冒泡),但在某些情况下,我们可能希望在事件捕获阶段处理事件。

// 使用事件捕获阶段
element.addEventListener("click", handleClick, { capture: true });

2. 事件委托

事件委托是一种优化事件处理的技术,通过将事件处理器添加到父元素上,来处理所有子元素的事件。这种方法可以减少事件处理器的数量,提高性能。
以下是一个事件委托的示例:

let container = document.getElementById("container");

// 添加事件监听器到父元素
container.addEventListener("click", handleContainerClick);

function handleContainerClick(event) {
  let target = event.target;

  if (target.tagName.toLowerCase() === "button") {
    console.log("Button clicked:", target.id);
  }
}

请添加图片描述

请添加图片描述

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

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

相关文章

单片机键盘程序设计举例

1、键盘与的连接 图3键盘连接 图4单片机与键盘接口图 2、通过1/0口连接。将每个按钮的一端接到单片机的I/O口&#xff0c;另一端接地&#xff0c;这是最简单的办法&#xff0c;如图3所示是实验板上按钮的接法&#xff0c;四个按钮分别接到P3.2 、P3.3、P3.4和P3.5。对于这种键…

HttpClient入门

HttpClient入门 简介 HttpClient 是 Apache HttpComponents 项目中的一个开源的 Java HTTP 客户端库&#xff0c;用于发送 HTTP 请求和处理 HTTP 响应。它提供了一组强大而灵活的 API&#xff0c;使得在 Java 程序中执行 HTTP 请求变得相对简单 maven依赖 org.apache.httpco…

72内网安全-域横向CSMSF联动及应急响应知识

拿到才行&#xff0c;拿不到就是多余的 案例一MSF&CobaltStrike 联动 Shell 有一些功能可能cs或者msf强大一些&#xff0c;他们两个可以相互调用&#xff0c;在真实情况下也是可以cs和msf同时启动的&#xff0c; cs移交给msf .创建Foreign监听器 “Listeners”“Add”…

[NAND Flash 4.2] Flash 原理 | NOR Flash 和 NAND Flash 闪存详解

依公知及经验整理,原创保护,禁止转载。 专栏 《深入理解NAND Flash》 <<<< 返回总目录 <<<< 前言 智能手机有一个可用的存储空间(如苹果128G),电脑里有一个固态硬盘空间(如联想512G), 这个空间是啥呢? 这个存储空间就是闪存设备,我们都统称为…

ILI9481 TFT3.5寸屏STM32F446ZEXX FMC驱动方式详解

图片来源于网络&#xff0c;如若侵权请联系博主删除 文章目录 1. 背景2. 基础知识2.1 TFT-LCD2.2 硬件接线2.3 FMC2.4 ILI9481 3. 软件抽象 1. 背景 最近做项目需要&#xff0c;博主在某宝上买了一块3.5寸的TFT屏&#xff0c;店家虽然发了资料&#xff0c;但是往产品上移植驱动…

动画墙纸:将视频、网页、游戏、模拟器变成windows墙纸——Lively Wallpaper

文章目录 前言下载github地址&#xff1a;网盘 关于VideoWebpagesYoutube和流媒体ShadersGIFs游戏和应用程序& more:Performance:多监视器支持&#xff1a;完结 前言 Lively Wallpaper是一款开源的视频壁纸桌面软件&#xff0c;类似 Wallpaper Engine&#xff0c;兼容 Wal…

PiflowX组件-JDBCRead

JDBCRead组件 组件说明 使用JDBC驱动向任意类型的关系型数据库读取数据。 计算引擎 flink 有界性 Scan Source: Bounded Lookup Source: Sync Mode 组件分组 Jdbc 端口 Inport&#xff1a;默认端口 outport&#xff1a;默认端口 组件属性 名称展示名称默认值允许…

Vue(一):Vue 入门与 Vue 指令

Vue 01. Vue 快速上手 1.1 Vue 的基本概念 用于 构建用户界面 的 渐进性 框架 构建用户界面&#xff1a;基于数据去渲染用户看到的界面渐进式&#xff1a;不需要学习全部的语法就能完成一些功能&#xff0c;学习是循序渐进的框架&#xff1a;一套完整的项目解决方案&#x…

数据结构与算法——符号表API设计及有序符号表设计

Java学习手册面试指南&#xff1a;https://javaxiaobear.cn 符号表最主要的目的就是将一个键和一个值联系起来&#xff0c;符号表能够将存储的数据元素是一个键和一个值共同组成的键值对数据&#xff0c;我们可以根据键来查找对应的值。 符号表中&#xff0c;键具有唯一性。 符…

PiflowX组件-WriteToUpsertKafka

WriteToUpsertKafka组件 组件说明 以upsert方式往Kafka topic中写数据。 计算引擎 flink 有界性 Streaming Upsert Mode 组件分组 kafka 端口 Inport&#xff1a;默认端口 outport&#xff1a;默认端口 组件属性 名称展示名称默认值允许值是否必填描述例子kafka_h…

QT音频编程实战项目(一)ui搭建和槽函数的完成

第一个类实现播放音乐&#xff0c;第二个类实现歌曲列表&#xff0c;第三个类是播放本地歌曲 上边是歌曲的总时长&#xff0c;下边是当前播放的时长。 所需要的槽函数如上图。 这个是构造函数&#xff1a; …

基于JavaWeb实验室预约管理系统(源码+数据库+文档)

一、项目简介 本项目是一套基于JavaWeb实验室预约管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;e…

OFDM——PAPR减小

文章目录 前言一、PAPR 减小二、MATLAB 仿真1、OFDM 信号的 CCDF①、MATLAB 源码②、仿真结果 2、单载波基带/通频带信号的 PAPR①、MATLAB 源码②、仿真结果 3、时域 OFDM 信号和幅度分布①、MATLAB 源码②、仿真结果 4、Chu 序列和 IEEE802.16e 前导的 PAPR①、MATLAB 源码②…

ToDesk Linux 客户端安装(欧拉系统)

下载链接 下载链接 https://newdl.todesk.com/linux/todesk-v4.3.1.0-x86_64.rpm &#xff08;使用4.3.1.0覆盖安装后&#xff0c;临时密码将会变更&#xff09; 安装命令&#xff1a; sudo rpm -Uvh todesk-v4.3.1.0-x86_64.rpm启动命令&#xff1a; todesk启动命令只能在桌…

算法通关村第二十关-白银挑战图的存储与遍历

大家好我是苏麟, 今天继续聊图 . 与前面的链表、树等相比&#xff0c;图的存储和遍历要复杂非常多 .所以理解就好 , 面试基本不会让写代码的 . 图的类型多、表示方式多&#xff0c;相关算法也很多&#xff0c;实现又过于复杂&#xff0c;多语言实现难度太大了。这些算法一般理…

Ultra ISO 虚拟光驱修改光盘盘符

windows xp 环境 ultra iso 虚拟光驱修改光盘盘符 method 1. 在ultra iso 中 [选项]->[配置]->[虚拟光驱]&#xff0c;在新盘符里选指定盘符 ->[修改] method 2. 打开命令行&#xff0c;进入安装目录&#xff0c;如 "C:\Program Files\UltraISO\drivers"&…

浅析锂电池保护板(BMS)系统设计思路(四)SOC算法-扩展Kalman滤波算法

1 SOC估算方法介绍 电池SOC的估算是电池管理系统的核心&#xff0c;自从动力电池出现以来&#xff0c;各种各样的电池SOC估算方法不断出现。随着电池管理系统的逐渐升级&#xff0c;电池SOC估算方法的效率与精度不断提高&#xff0c;下面将介绍常用几种电池SOC估算方法[1]&…

2023年总结及2024年规划:我们结婚啦

目录 1、回首2023 1.1、生活方面 1.2、工作方面 1.3、学习方面 2、展望2024 2.1、生活方面 2.2、工作方面 2.3、学习方面 2023年最重要的事情当然是我们结婚啦&#xff01; 1、回首2023 1.1、生活方面 今年五一假期&#xff0c;我和对象回老家在双方亲友的见证下完…

HarmonyOS 路由传参

本文 我们来说两个page界面间的数据传递 路由跳转 router.pushUrl 之前我们用了不少了 但是我们只用了它的第一个参数 url 其实他还有个params参数 我们第一个组件可以编写代码如下 import router from ohos.router Entry Component struct Index {build() {Row() {Column() …

ES6之Proxy详解

✨ 专栏介绍 在现代Web开发中&#xff0c;JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性&#xff0c;还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言&#xff0c;JavaScript具有广泛的应用场景&#x…