【Java 进阶篇】HTML DOM 事件详解

在这里插入图片描述

当用户在网页上点击按钮、输入文本、鼠标移动到某个区域或执行其他互动操作时,这些动作都可以触发事件。HTML DOM(文档对象模型)允许我们使用JavaScript来捕获、处理和响应这些事件,以实现网页的交互和动态性。本篇博客将围绕HTML DOM事件展开详细的解释,包括事件的类型、事件处理程序、事件对象和示例代码。让我们一起来深入了解吧。

什么是事件?

在网页开发中,事件是指用户或浏览器与网页元素交互的瞬间,例如点击按钮、移动鼠标、按下键盘等。这些互动动作都会触发特定的事件,而开发者可以编写JavaScript代码来响应这些事件。事件使得网页可以实现各种交互效果,包括表单验证、页面导航、动画效果等。

HTML DOM中的事件分为多种类型,包括鼠标事件、键盘事件、表单事件、文档事件等。每种事件都有其特定的触发条件和行为。接下来,让我们逐一介绍不同类型的事件。

鼠标事件

点击事件(click)

点击事件是最常见的事件之一,它在用户点击(或触摸)页面上的元素时触发。通常用于处理按钮点击、链接点击和其他需要用户响应的交互。

<button id="myButton">点击我</button>
<script>const button = document.getElementById('myButton');button.addEventListener('click', function() {alert('按钮被点击了!');});
</script>

上面的代码演示了如何使用addEventListener方法为一个按钮元素添加点击事件的监听器。当用户点击按钮时,会触发click事件,弹出一个警告框。

鼠标移动事件(mousemove)

鼠标移动事件在用户的鼠标光标在元素上移动时触发。您可以使用鼠标移动事件创建各种效果,如鼠标悬停效果和拖拽功能。

<div id="myDiv" style="width: 100px; height: 100px; background-color: #3498db;"></div>
<script>const myDiv = document.getElementById('myDiv');myDiv.addEventListener('mousemove', function() {myDiv.style.backgroundColor = '#e74c3c';});
</script>

在这个示例中,当用户将鼠标光标移动到<div>元素上时,背景颜色将变为红色。

双击事件(dblclick)

双击事件在用户双击页面上的元素时触发。它通常用于创建需要双击确认的操作,比如编辑文本或删除项目。

<p id="myText">双击我</p>
<script>const myText = document.getElementById('myText');myText.addEventListener('dblclick', function() {myText.innerHTML = '已被双击';});
</script>

在这个示例中,当用户双击段落文本时,文本将被替换为“已被双击”。

键盘事件

按键按下事件(keydown)

按键按下事件在用户按下键盘上的任意键时触发。它通常用于监听用户的键盘输入。

<input type="text" id="myInput">
<script>const myInput = document.getElementById('myInput');myInput.addEventListener('keydown', function(event) {console.log('按下的键码:' + event.keyCode);});
</script>

在这个示例中,当用户在文本框中按下键盘上的任意键时,键码将被记录在控制台中。

按键弹起事件(keyup)

按键弹起事件在用户释放键盘上的按键时触发。它通常用于监听用户的键盘输入,并在释放键时执行相应的操作。

<input type="text" id="myInput">
<script>const myInput = document.getElementById('myInput');myInput.addEventListener('keyup', function() {alert('键盘按键已释放');});
</script>

在这个示例中,当用户在文本框中释放键盘上的按键时,会弹出一个警告框。

输入事件(input)

输入事件在用户在文本框或文本区域中输入文本时触发。它通常用于即时响应用户的输入。

<input type="text" id="myInput">
<p id="output"></p>
<script>const myInput = document.getElementById('myInput');const output = document.getElementById('output');myInput.addEventListener('input', function() {output.textContent = myInput.value;});
</script>

在这个示例中,用户在文本框中输入文本时,文本框下方的<p>元素会即时更新显示用户输入的内容。

表单事件

提交事件(submit)

提交事件在用户提交表单时触发。它通常用于验证表单数据或执行其他与表单提交相关的操作。

<form id="myForm"><input type="text" name="username" required><button type="submit">提交</button>
</form>
<script>const myForm = document.getElementById('myForm');myForm.addEventListener('submit', function(event) {event.preventDefault(); // 阻止表单默认提交行为alert('表单已提交');});
</script>

在这个示例中,用户点击表单中的提交按钮时,会触发submit事件,并弹出一个警告框。通过event.preventDefault(),我们阻止了表单的默认提交行为,以便在警告框弹出后保留在当前页面。

重置事件(reset)

重置事件在用户点击表单的重置按钮时触发。它通常用于将表单的输入字段重置为默认值。

<form id="myForm"><input type="text" name="username" value="默认值"><button type="reset">重置</button>
</form>
<script>const myForm = document.getElementById('myForm');myForm.addEventListener('reset', function() {alert('表单已重置');});
</script>

在这个示例中,用户点击表单中的重置按钮时,会触发reset事件,并弹出一个警告框。

文档事件

加载事件(load)

加载事件在文档加载完成后触发。它通常用于在页面加载完成后执行一些初始化操作。

<script>window.addEventListener('load', function() {alert('页面已加载');});
</script>

在这个示例中,当页面中的所有内容都加载完成后,会触发load事件,并弹出一个警告框。

卸载事件(unload)

卸载事件在用户离开页面或关闭浏览器窗口时触发。它通常用于在用户离开页面前执行一些清理操作。

<script>window.addEventListener('unload', function() {alert('即将离开页面');});
</script>

在这个示例中,当用户试图离开页面或关闭浏览器时,会触发unload事件,并弹出一个警告框。

自定义事件

除了上述内置事件类型,您还可以创建自定义事件。自定义事件允许开发者在需要时触发特定的事件,以满足应用程序的需求。

<button id="myButton">触发自定义事件</button>
<script>const myButton = document.getElementById('myButton');const customEvent = new Event('custom');myButton.addEventListener('custom', function() {alert('自定义事件已触发');});myButton.addEventListener('click', function() {myButton.dispatchEvent(customEvent);});
</script>

上面的代码中,我们创建了一个名为custom的自定义事件,并使用dispatchEvent方法在按钮点击时触发了这个自定义事件。

事件处理程序

事件处理程序是JavaScript函数,它们在特定事件发生时执行。事件处理程序通常通过addEventListener方法将其附加到DOM元素上,以便在事件触发时执行。事件处理程序接收一个事件对象作为参数,该对象包含了与事件相关的信息。

const myButton = document.getElementById('myButton');myButton.addEventListener('click', function(event) {// 在这里编写处理点击事件的代码console.log('点击事件已触发');
});

上述代码中,我们使用addEventListener为一个按钮元素添加了一个点击事件处理程序。当按钮被点击时,事件处理程序中的代码将被执行,这里我们简单地在控制台中打印了一条消息。

要从DOM元素中删除事件处理程序,可以使用removeEventListener方法,传递与添加事件处理程序时相同的事件类型和处理程序函数。

myButton.removeEventListener('click', myClickHandler);

事件对象

事件处理程序的第一个参数通常是事件对象,它包含有关事件的详细信息。事件对象的属性和方法可以用来获取事件类型、目标元素、鼠标位置、按下的键以及其他有关事件的信息。

以下是一些常见的事件对象属性和方法:

  • event.type: 事件的类型(如"click"、"keydown"等)。
  • event.target: 触发事件的DOM元素。
  • event.clientXevent.clientY: 鼠标光标在窗口中的水平和垂直坐标。
  • event.keyCode: 按下的键的键码。
  • event.preventDefault(): 阻止事件的默认行为(如取消表单提交或链接跳转)。
  • event.stopPropagation(): 阻止事件冒泡到更高级的DOM元素。
  • event.stopImmediatePropagation(): 阻止事件冒泡并阻止后续处理程序的执行。
  • event.currentTarget: 当前正在处理事件的元素。
  • event.data: 用于自定义数据传递的属性。
const myLink = document.getElementById('myLink');myLink.addEventListener('click', function(event) {console.log('链接文本: ' + event.target.textContent);console.log('鼠标位置: (' + event.clientX + ', ' + event.clientY + ')');event.preventDefault(); // 阻止默认跳转行为
});

在上述示例中,我们使用事件对象获取了链接元素的文本内容、鼠标位置,并阻止了链接的默认跳转行为。

事件冒泡

事件冒泡是指事件从DOM树中的最底层元素开始,然后冒泡(逐级向上传递)到最高级的祖先元素。这意味着如果在子元素上触发了一个事件,它会向上传到父元素,然后继续向上传到更高级的祖先元素。

例如,如果用户点击一个按钮,点击事件会从按钮元素开始冒泡,然后传递给按钮的父元素,以此类推,直到传递到<body>元素。

<div id="outer"><div id="middle"><button id="inner">点击我</button></div>
</div>
<script>const outer = document.getElementById('outer');const middle = document.getElementById('middle');const inner = document.getElementById('inner');outer.addEventListener('click', function() {console.log('点击事件 - outer');});middle.addEventListener('click', function() {console.log('点击事件 - middle');});inner.addEventListener('click', function() {console.log('点击事件 - inner');});
</script>

当用户点击按钮时,事件会从inner元素开始冒泡,然后触发middle元素的点击事件处理程序,最后触发outer元素的点击事件处理程序。

阻止事件冒泡

如果需要阻止事件继续向上冒泡,可以使用事件对象的stopPropagation()方法。这在需要防止父元素处理同一事件时非常有用。

<div id="outer"><div id="middle"><button id="inner">点击我</button></div>
</div>
<script>const outer = document.getElementById('outer');const middle = document.getElementById('middle');const inner = document.getElementById('inner');inner.addEventListener('click', function(event) {console.log('点击事件 - inner');event.stopPropagation(); // 阻止事件冒泡});middle.addEventListener('click', function() {console.log('点击事件 - middle');});outer.addEventListener('click', function() {console.log('点击事件 - outer');});
</script>

在这个示例中,当用户点击按钮时,事件会从inner元素开始冒泡,但由于我们在inner的事件处理程序中调用了event.stopPropagation(),事件不会继续传递给middleouter元素的事件处理程序。

事件委托

事件委托是一种常见的优化技巧,可以减少添加事件处理程序的数量,特别是在处理大量相似元素的情况下。它利用事件冒泡原理,将事件处理程序附加到共同的祖先元素上,以便在事件发生时代理到子元素。

<ul id="myList"><li>列表项 1</li><li>列表项 2</li><li>列表项 3</li>
</ul>
<script>const myList = document.getElementById('myList');myList.addEventListener('click', function(event) {if (event.target.tagName === 'LI') {console.log('点击了列表项: ' + event.target.textContent);}});
</script>

在这个示例中,我们将点击事件处理程序附加到了<ul>元素上,但只在用户点击<li>元素时执行相应的操作。通过检查event.target,我们可以确定用户点击的是哪个<li>元素。

示例:创建一个任务清单

让我们通过一个实际的示例来演示如何使用事件处理程序和事件对象来创建一个简单的任务清单应用。用户可以添加新任务、标记任务为已完成以及删除任务。

<input type="text" id="taskInput" placeholder="添加新任务">
<button id="addTask">添加任务</button>
<ul id="taskList"></ul>
<script>const taskInput = document.getElementById('taskInput');const addTaskButton = document.getElementById('addTask');const taskList = document.getElementById('taskList');addTaskButton.addEventListener('click', function() {const taskText = taskInput.value;if (taskText) {const taskItem = document.createElement('li');taskItem.textContent = taskText;taskList.appendChild(taskItem);// 添加点击事件处理程序,用于标记任务为已完成taskItem.addEventListener('click', function() {if (!taskItem.classList.contains('completed')) {taskItem.classList.add('completed');} else {taskItem.classList.remove('completed');}});// 添加双击事件处理程序,用于删除任务taskItem.addEventListener('dblclick', function() {taskList.removeChild(taskItem);});taskInput.value = ''; // 清空输入框}});
</script>

在这个示例中,我们创建了一个任务清单,用户可以在文本框中输入新任务,点击“添加任务”按钮,然后将任务添加到任务列表中。点击任务将标记为已完成,双击任务将删除任务。通过事件委托,我们将点击和双击事件处理程序附加到了任务列表上,而不是每个单独的任务项。

结语

HTML DOM事件是实现网页交互和动态性的重要组成部分。通过使用事件类型、事件处理程序和事件对象,开发者可以响应用户的操作、改善用户体验,并实现各种功能。了解如何使用事件是成为一名出色的前端开发者的必备技能。希望本文对你深入理解HTML DOM事件有所帮助,如果有任何问题或需要更多信息,请随时提出。祝编程愉快!

作者信息

作者 : 繁依Fanyi
CSDN: https://techfanyi.blog.csdn.net
掘金:https://juejin.cn/user/4154386571867191

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

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

相关文章

iOS原生、Android 原生, flutter 三种方式给照片流添加文字(水印)

效果图:三中代码实现的效果差不多 Swift:代码 import UIKitclass ImageWatermarking: NSObject {static func textToImage(drawText text: String, inImage initImage: UIImage, atPoint point: CGPoint) -> UIImage {let textColor = UIColor.whitelet textFont = UIFon…

DPDK收发包流程分析

一、 前言 DPDK是intel工程师开发的一款用来快速处理数据包的框架,最初的目的是为了证明传统网络数据包处理性能低不是intel处理器导致的,而是传统数据的处理流程导致,后来随着dpdk的开源及其生态的快速发展,dpdk成为了高性能网络数据处理的优秀框架。本篇文章主要介绍DPDK…

Django实现音乐网站 ⒇

使用Python Django框架做一个音乐网站&#xff0c; 本篇音乐播放器-添加播放音乐功能实现。 目录 创建播放器数据表 设置表结构 执行创建表 命令 执行 数据表结构 添加单个歌曲 创建路由 加入播放器视图 模板处理 基类方法 子页面调用 优化弹窗 加入layui文件 基…

在URP管线中添加ShaderMaterial自定义GUI的方法

编写GUI面板 1. 新建GUI子面板 using UnityEngine; using UnityEngine.Rendering;namespace UnityEditor.Rendering.Universal.ShaderGUI {internal class CP_XXXOutLineGUI{public static class Styles{}public struct LitProperties{public LitProperties(MaterialProperty…

vxe-table添加排序

在 <vxe-column> 中添加sortable属性 <vxe-columnfield"longitude"sortabletitle"经度"></vxe-column><vxe-columnfield"latitude"sortabletitle"纬度"></vxe-column><vxe-columnfield"dateEst…

Spring Boot如何优雅实现动态灵活可配置的高性能数据脱敏功能

1.背景 在当下互联网高速发展的时代下&#xff0c;涉及到用户的隐私数据安全越发重要&#xff0c;一旦泄露将造成不可估量的后果。所以现在的业务系统开发中都会对用户隐私数据加密之后存储落库&#xff0c;同时还要求后端返回数据给前台之前进行数据脱敏。所谓脱敏处理其实就…

TikTok Shop美国本土店VS跨境店,如何选择?有何区别?

TikTok不仅仅是一个用于分享有趣短视频的平台&#xff0c;它也逐渐成为了商家们极力推广自己品牌和产品的场所。 在TikTok的商业生态系统中&#xff0c;存在几种不同的商店类型&#xff0c;各有其独特性和适用场景。今天&#xff0c;我们就来深入探讨这些店的差异与特点。 一、…

Si24R2|2.4G单发射芯片 +7dBm可调功率 校讯通

Si24R2是一种通用、低功耗、高性能的2.4GHz无线射频发射芯片&#xff0c;主要用于单向通信系统&#xff0c;以降低系统成B&#xff0c;在运行中与si24r1兼容。 Si24r2具有低功耗和低成B。 它主要用于单向低功率传输系统&#xff0c;如无线控制系统、无线数据采集系统等。 Si2…

在mysql8查询中使用ORDER BY结合LIMIT时,分页查询时出现后一页的数据重复前一页的部分数据。

这里写目录标题 问题描述&#xff1a;问题模拟&#xff1a;原因分析问题解释问题解决验证官方文档支持 问题描述&#xff1a; 在mysql8查询中使用ORDER BY结合LIMIT时&#xff0c;分页查询时出现后一页的数据重复前一页的部分数据。 问题模拟&#xff1a; 表table_lock_test&…

Milvus 介绍

Milvus 介绍 Milvus 矢量数据库是什么&#xff1f;关键概念非结构化数据嵌入向量向量相似度搜索 为什么是 Milvus?支持哪些索引和指标&#xff1f;索引类型相似度指标(Similarity metrics) 应用示例Milvus 是如何设计的&#xff1f;开发者工具API访问Milvus 生态系统工具 本页…

《数据结构、算法与应用C++语言描述》使用C++语言实现数组双端队列

《数据结构、算法与应用C语言描述》使用C语言实现数组双端队列 定义 队列的定义 队列&#xff08;queue&#xff09;是一个线性表&#xff0c;其插入和删除操作分别在表的不同端进行。插入元素的那一端称为队尾&#xff08;back或rear&#xff09;&#xff0c;删除元素的那一…

【vue】el-carousel实现视频自动播放与自动切换到下一个视频功能:

文章目录 一、原因:二、实现代码:三、遇到的问题&#xff1a;【1】问题&#xff1a;el-carousel页面的视频不更新【2】问题&#xff1a;多按几次左按钮&#xff0c;其中跳过没有播放的视频没有销毁&#xff0c;造成再次自动播放时会跳页 一、原因: 由于后端无法实现将多条视频拼…

手机爬虫用Scrapy详细教程:构建高效的网络爬虫

如果你正在进行手机爬虫的工作&#xff0c;并且希望通过一个高效而灵活的框架来进行数据抓取&#xff0c;那么Scrapy将会是你的理想选择。Scrapy是一个强大的Python框架&#xff0c;专门用于构建网络爬虫。今天&#xff0c;我将与大家分享一份关于使用Scrapy进行手机爬虫的详细…

照片后期编辑工具Lightroom Classic 2024 mac中文新增功能

Lightroom Classic 2024&#xff08;lrC2024&#xff09;是专为摄影爱好者和专业摄影师设计的软件&#xff0c;它提供了全面的照片编辑工具&#xff0c;可以精准调整照片的色彩、对比度和曝光等参数&#xff0c;以便定制后期处理效果。 在lrC2024中&#xff0c;用户体验得到了提…

文件的逻辑结构(顺序文件,索引文件)

所谓的“逻辑结构”&#xff0c;就是指在用户看来&#xff0c;文件内部的数据应该是如何组织起来的。 而“物理结构”指的是在操作系统看来&#xff0c;文件的数据是如何存放在外存中的。 1.无结构文件 无结构文件:文件内部的数据就是一系列二进制流或字符流组成。无明显的逻…

SortedSet 和 List 异同点

SortedSet 在 Java 的整个集合体系中&#xff0c;集合可以分成两个体系&#xff0c;一个是 Collection 存储单个对象的集合&#xff0c;另一个是 k-v 结构的 Map 集合。 SortedSet 是 Collection 体系下 Set 接口下的派生类&#xff0c;而 Set 集合的特征是不包含重 复的元素的…

(论文翻译)UFO: Unified Feature Optimization——UFO:统一特性优化

作者&#xff1a; Teng Xi 论文总结&#xff1a;总结 Code: https://github.com/PaddlePaddle/VIMER/tree/main/UFO 摘要&#xff1a; 本文提出了一种新的统一特征优化(Unified Feature Optimization, UFO)范式&#xff0c;用于在现实世界和大规模场景下训练和部署深度模型…

asp.net特色商品购物网站系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net特色商品购物网站系统 是一套完善的web设计管理系统&#xff0c;系统采用mvc模式&#xff08;BLLDALENTITY&#xff09;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 vs2010&#xff0c;数据库为sqlserver2008&a…

安装Apache2.4

二、安装配置Apache&#xff1a; 中文官网&#xff1a;Apache 中文网 官网 (p2hp.com) 我下的是图中那个版本&#xff0c;最新的64位 下载下后解压缩。如解压到D:\tool\Apache24 PS&#xff1a;特别要注意使用的场景和64位还是32位版本 2、修改Apcahe配置文件 具体步骤: 打…

Required MultipartFile parameter ‘file‘ is not present

出现这个原因我们首先想到的是加一个RequestParam("file")&#xff0c;但是还有可能的原因是因为我们的名字有错误 <span class"input-group-addon must">模板上传 </span> <input id"uploadFileUpdate" name"importFileU…