【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.clientX
和event.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()
,事件不会继续传递给middle
和outer
元素的事件处理程序。
事件委托
事件委托是一种常见的优化技巧,可以减少添加事件处理程序的数量,特别是在处理大量相似元素的情况下。它利用事件冒泡原理,将事件处理程序附加到共同的祖先元素上,以便在事件发生时代理到子元素。
<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 |
相关文章:

【Java 进阶篇】HTML DOM 事件详解
当用户在网页上点击按钮、输入文本、鼠标移动到某个区域或执行其他互动操作时,这些动作都可以触发事件。HTML DOM(文档对象模型)允许我们使用JavaScript来捕获、处理和响应这些事件,以实现网页的交互和动态性。本篇博客将围绕HTML…...

redis 从小白到大师系列
字符串 Redis 字符串数据类型 set 字符串 /*** 设置字符串*/ $t $redis->set(o1,o1); //返回true or false var_dump($t);get字符串 /*** 获取字符串*/ $t $redis->get(o1); //返回true or false var_dump($t);结果: string(2) “o1” 返回 key 中字符串…...
vue使用.filter方法检索数组中指定时间段内的数据
假设你有一个名为dataArray的数组,其中包含了你要筛选的数据。那么,你可以按照以下步骤进行筛选: 创建一个名为filteredArray的新数组,用于存储筛选后的结果。使用数组的filter方法遍历dataArray,并对每个元素应用筛选…...

Ubuntu 安装 npm 和 node
前言 最近学习VUE,在ubuntu 2204 上配置开发环境,涉及到npm node nodejs vue-Cli脚手架等内容,做以记录。 一、node nodejs npm nvm 区别 ? node 是框架,类似python的解释器。nodejs 是编程语言,是js语言的…...

Matlab论文插图绘制模板第122期—函数折线图(fplot)
本期分享的是函数折线图的绘制模板。 所谓函数折线图,就是将自定义线函数进行可视化表达。 先来看一下成品效果: 特别提示:本期内容『数据代码』已上传资源群中,加群的朋友请自行下载。有需要的朋友可以关注同名公号【阿昆的…...

IK分词器如何修改支持跨版本ES
一、问题描述:IK分词器版本和ES版本不一致,无法找到和自己ES版本匹配的分词器。 IK分词器,提供的插件版本,远赶不上ES的更新版本,在使用过程中,不一定能顺利的找到与自己使用的ES版本相对应。在ES集群中使用…...

Spring MVC常用十大注解
Spring MVC常用十大注解 一,什么要使用注解 使用注解可以简化配置,提高代码的可读性和可维护性。通过注解可以实现依赖注入,减少手动管理对象的代码量。注解还支持面向切面编程,实现切面、切入点和通知等。此外,注解提…...
二、【MyBatis】 MyBatis入门与简单使用
二、【MyBatis】 MyBatis入门与简单使用 二、【MyBatis】 MyBatis入门与简单使用一、什么是ORM二、为什么mybatis是半自动的ORM框架2.1 Hibernate优点2.2 Hibernate缺点2.3 MyBatis与Hibernate区别三、Mybatis快速入门3.1 项目引入Maven相关依赖3.2 创建测试数据库3.3 编写数据…...

基于DF模式的协作通信技术matlab性能仿真
目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1、DF概述 4.2、DF基本原理 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2013b 3.部分核心程序 clc; clear; close all; warning off; addpath(genpath(pwd))…...
Angular-01:基本架构
各种学习后的知识点整理归纳,非原创! ① 概述 angular是一个使用HTML、CSS、TypeScript构建的客户端应用的框架,用来构建单页面应用程序。是一个重量级的框架,内部集成了大量开箱即用的功能模块。是为大型应用开发而设计…...
字符串划分
题目描述 给定一个小写字母组成的字符串s,请找出字符串中两个不同位置的字符作为分割点,使得字符串分成的三个连续子串且子串权重相等,注意子串不包含分割点。 若能找到满足条件的两个分割点,请输出这两个分割点在字符串中的位置…...
ImportError: /lib64/libstdc++.so.6: version `CXXABI_1.3.9‘ not found的解决方法
导致该错误的原因:gcc动态库版本太老了 解决方法: 1、编辑~/.bash_profile vim ~/.bash_profile 2、将anaconda3/lib的路径加入库文件的路径 LD_LIBRARY_PATH/your_path/anaconda3/lib:$LD_LIBRARY_PATH export LD_LIBRARY_PATH 3、重载~/.bash_pr…...

华为云全新上线Serverless应用中心,支持一键构建文生图应用
近日,华为云全新上线Serverless应用中心,提供了大量应用模板,让用户能够一键部署函数和周边依赖资源,节省部署时间,快速上手将应用部署到华为云函数计算FunctionGraph,并一键开通周边依赖资源。 本次Serve…...

scrapy的安装和使用
一、scrapy是什么:Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序 二、scrapy的安装:pip install scrapy -i https://pypi.douban.com/…...
Kotlin中的异常处理
异常是在程序执行过程中出现的错误或意外情况,可以干扰程序的正常流程。在Kotlin中,我们可以通过异常处理机制来捕获和处理异常,以保证程序的稳定性。本篇博客将介绍异常的产生、捕获、定义、受检异常和finally关键字,并提供相应的…...

[Ubuntu 18.04] 搭建文件夹共享之Samba服务器
Samba是一个开源项目,允许Windows用户在Linux和Unix系统上进行文件共享。 Samba服务器是一个可以让Linux或Unix系统在网络上充当Windows NT/2000/XP/2003等网络操作系统的共享资源的软件。它允许用户通过SMB/CIFS协议在Linux或Unix系统与Windows共享资源。 Samba服务器的主要…...
设计模式-装饰器模式
目录 设计模式-装饰器模式什么是装饰器设计模式?java示例 设计模式-装饰器模式 什么是装饰器设计模式? 装饰器设计模式(Decorator Pattern)是一种结构型设计模式,它允许你通过将对象包装在一个装饰器类中来动态地扩展…...
【Vs code调试C++】
参考文献第一个很重要 主要是配置task.json,其余的可以不用管 参考文献 [1]详解Linux下使用vscode编译运行和调试C/C [2]vscode关于C/C编译运行的一些小配置...
使用 C++创建一个简易的数据库管理系统 (DBMS)
在数据库领域,数据库管理系统 (DBMS) 是一个软件系统,它提供与用户、其他应用程序和数据库之间的接口,用于存储、检索、更新和管理数据。在这篇博客中,我们将学习如何使用 C 创建一个简易的 DBMS,包括事务、并发控制、…...

简单了解一下:NodeJS的WebSocket网络编程
NodeJS的webSocket网络编程。 那什么是WebSocket呢?WebSocket是HTML5提供的一种浏览器和服务器进行通信的网络技术。两者之间,只需要做一个握手动作,就可以在浏览器和服务器之间开启一条通道,就可以进行数据相互传输。 实现WebS…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !
我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...

Xela矩阵三轴触觉传感器的工作原理解析与应用场景
Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知,帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量,能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度,还为机器人、医疗设备和制造业的智…...