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

请添加图片描述

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

  • 理解事件驱动编程的基本概念和工作原理
  • 掌握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 submissionconsole.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 submissionconsole.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.mzph.cn/news/582660.shtml

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

相关文章

Springboot拦截器及统一异常处理

文章目录 一、Java中异常相关概念1、异常类2、异常处理方法3、注意事项4、自定义异常 二、配置全局异常处理1、统一返回体定义2、定义异常处理实现类3、全局异常处理类 三、Springboot拦截器1、定义拦截器2、注册拦截器 四、验证效果 一、Java中异常相关概念 1、异常类 Throw…

Armpro脱壳软件搭建教程附源代码

PHP8.0版本&#xff0c;数据库8.0版本 1.配置注册机文件&#xff0c;打开将arm.zip/res目录下&#xff0c;mt管理器搜索将其全部修改为你自己的域名或者是服务器IP 2.然后建立数据库 数据库账号arm 数据库用户名arm 数据库密码EsZfXY4tD3h2NNA4 3.导入数据库 4.配置Redi…

[每周一更]-(第44期):GIT版本控制之忽略文件

基础概念 在 Git 中&#xff0c;可以通过 .gitignore 文件来指定不需要纳入版本控制的文件或文件夹&#xff0c;这些被忽略的文件或文件夹不会被提交到仓库中。 在项目根目录下创建一个名为 .gitignore 的文件&#xff0c;并在其中列出需要忽略的文件或文件夹。一些常见的示例…

SASS循环

<template><div><button class"btn type-1">默认按钮</button><button class"type-2">主要按钮</button><button class"type-3">成功按钮</button><button class"type-4">信息…

企业数据可视化-亿发数据化管理平台提供商,实现一站式数字化运营

近些年来&#xff0c;国内企业数据化管理升级进程持续加速&#xff0c;以物联网建设、人工智能、大数据和5G网络等新技术的发展&#xff0c;推动了数字经济的蓬勃发展&#xff0c;成为维持经济持续稳定增长的重要引擎。如今许多国内中小型企业纷纷摒弃传统管理模式&#xff0c;…

[卷积神经网络]FCOS--仅使用卷积的Anchor Free目标检测

项目源码&#xff1a; FCOShttps://github.com/tianzhi0549/FCOS/ 一、概述 作为一种Anchor Free的目标检测网络&#xff0c;FCOS并不依赖锚框&#xff0c;这点类似于YOLOx和CenterNet&#xff0c;但CenterNet的思路是寻找目标的中心点&#xff0c;而FCOS则是寻找每个像素点&…

css中sprite(css精灵)是什么,有什么优缺点

概念 将多个小图片拼接到一个图片中 。通过 background-position 和元素尺寸调节需要显示的背景图案。 优点 减少 HTTP 请求数&#xff0c;极大地提高页面加载速度 增加图片信息重复度&#xff0c;提高压缩比&#xff0c;减少图片大小 更换⻛格方便&#xff0c; 只需在一张或…

六、Redis 分布式系统

六、Redis 分布式系统 六、Redis 分布式系统6.1 数据分区算法6.1.1 顺序分区6.1.2 哈希分区 6.2 系统搭建与运行6.2.1 系统搭建6.2.2 系统启动与关闭 6.3 集群操作6.3.1 连接集群6.3.2 写入数据6.3.3 集群查询6.3.4 故障转移6.3.5 集群扩容6.3.6 集群收缩 6.4 分布式系统的限制…

mysql保姆安装教程

一.下载install文件 1.进入Mysql官网&#xff0c;点击下载 2.选择MySQL Installer for Windows 3.推荐选择第二个安装包 4.不登陆&#xff0c;开始下载 5.等待下载完成 二.安装前的配置 通过电脑“设置”&#xff0c;检查电脑是否包含中文名&#xff0c;如果包含请重命名 …

紫光展锐5G扬帆出海 | 东南亚成为5G新热土

东南亚是一块充满活力和潜力的市场&#xff0c;这里人口基数大、年轻消费群体占比高&#xff0c;电子市场在过去几年显著增长。 增速“狂飙”的东南亚手游 近年来&#xff0c;东南亚手游下载量逐年增长&#xff0c;2023 年第一季度下载量突破 21 亿次&#xff0c;贡献了全球近…

2023年12月27日学习记录_加入噪声

目录 1、今日计划学习内容2、今日学习内容1、add noise to audio clipssignal to noise ratio(SNR)加入 additive white gaussian noise(AWGN)加入 real world noises 2、使用kaggel上的一个小demo&#xff1a;CNN模型运行时出现的问题调整采样率时出现bug 3、明确90dB下能否声…

【SD】IP-Adapter 进阶 - 同款人物【2】

测试模型&#xff1a;###最爱的模型\flat2DAnimerge_v30_2.safetensors [b2c93e7a89] 原图&#xff1a; 加入 control1 [IP-Adapter] 加入 control 2 [OpenPose] 通过openpose骨骼图修改人物动作。 加入 control 3 lineart 加入cotrol3 …

Unity中Shader 齐次坐标

文章目录 前言一、什么是齐次坐标二、齐次坐标增加分量 w 的意义1、当 w ≠ \neq  0时&#xff1a;2、当 w 0时&#xff1a;3、用方程组&#xff0c;直观的看一下w的意义 前言 在之前的文章中&#xff0c;我们进行了正交相机视图空间转化到裁剪空间的推导。 Unity中Shade…

三大强势大语言模型怎么选?看这篇文章就够了!

现在的人可以有多懒&#xff1f;啊&#xff0c;不&#xff0c;是多聪明&#xff1f;&#xff08;毕竟人和动物的根本区别在于能否制造和使用工具。&#xff09; 遇到任何事情&#xff0c;可以随时大小问。你甚至都不需要手动输入&#xff0c;因为语言输入已经帮你简化了这个步…

linux调试笔记

文章目录 基本启动调试与附加进程断点程序运行控制tui模式查看堆栈与变量监视变量多线程调试 扩展自定义跳转命令解析自定义类型禁用动态库自动加载设置源码路径断点时执行命令gdbserver远程调试 gdb脚本QtCreator调试Linux下处理编译、运行时的一些问题undefined symbol问题-n…

Android ImageView如何使用.svg格式图片

我们知道imageview常用的图片格式是.jpg/.png或者drawable里的部分.xml文件。但有时UI会给过来.svg格式的文件&#xff0c;下面讲解如何使用.svg格式图片文件 step1:AS点击File -> New -> Vector Asset step2:选中要使用的.svg文件&#xff0c;按需要命名和调整&#x…

Mysql For Navicate (老韩)

Navicate创建数据库 先创建一个数据库;然后在数据库中创建一张表;在表格当中填入相应的属性字段;打开表, 然后填入相应的实例字段; – 使用数据库图形化App和使用指令来进行操作各有各的好处和利弊; 数据库的三层结构(破除MySQL神秘) 所谓安装Mysql数据库, 就是在主机安装一…

231227-9步在RHEL8.8配置本地yum源仓库

Seciton 1&#xff1a;参考视频 RHEL8配置本地yum源仓库-安徽迪浮_哔哩哔哩_bilibili Seciton 2&#xff1a;具体操作 &#x1f3af; 第1步&#xff1a;查看光驱文件/dev/sr0是否已经挂载&#xff1f;此处已挂在 [lgklocalhost ~]$ df -h &#x1f3af; 第1步&#xff1a;查看…

在处理金额时用long还是BigDecimal,所引发的讨论

亲爱的小伙伴们&#xff0c;由于微信公众号改版&#xff0c;打乱了发布时间&#xff0c;为了保证大家可以及时收到文章的推送&#xff0c;可以点击上方蓝字关注测试工程师成长之路&#xff0c;并设为星标就可以第一时间收到推送哦&#xff01; 周末在闲逛的时候 无意间看到一个…

Vue3数据交互axios

我是南城余&#xff01;阿里云开发者平台专家博士证书获得者&#xff01; 欢迎关注我的博客&#xff01;一同成长&#xff01; 一名从事运维开发的worker&#xff0c;记录分享学习。 专注于AI&#xff0c;运维开发&#xff0c;windows Linux 系统领域的分享&#xff01; 本…