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

news2024/11/20 23:18:52

在这里插入图片描述

当用户在网页上点击按钮、输入文本、鼠标移动到某个区域或执行其他互动操作时,这些动作都可以触发事件。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.coloradmin.cn/o/1111780.html

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

相关文章

选择最适合的产品研发和运营管理工具

Zoho Projects项目管理工具&#xff0c;以其卓越的敏捷开发协作能力&#xff0c;有效提升了产品规划和研发效率。 以下是对其优势的深入探讨&#xff1a; 一、面临的问题分析 需求变动频繁&#xff1a;在快速变化的市场环境中&#xff0c;如何灵活应对需求变动是一大挑战。跨…

数据库中了mkp勒索病毒怎么办?Mkp勒索病毒解密,数据恢复

相信在本月有很多的企业都遭到了mkp勒索病毒的攻击&#xff0c;该勒索病毒非常狡猾&#xff0c;利用中秋国庆假期期间&#xff0c;对很多的企业服务器进行了攻击&#xff0c;导致服务器内的所有文件都被加密&#xff0c;严重影响了企业的正常工作&#xff0c;经过最近一段时间对…

微信小程序怎么注册_微信小程序怎么可以免费认证

随着微信小程序的日益普及&#xff0c;越来越多的企业和个人开始关注如何注册微信小程序。本文将详细介绍微信小程序注册的步骤以及注意事项&#xff0c;帮助大家更好地了解如何成功注册微信小程序。 一、了解微信小程序注册的意义 微信小程序是一种轻量级的应用程序&#xff…

BAT029:批量为指定路径下的文件添加8位修改日期后缀名

引言&#xff1a;编写批处理程序&#xff0c;实现批量为指定路径下的文件添加8位修改日期后缀名。 一、新建Windows批处理文件 参考博客&#xff1a; CSDNhttps://mp.csdn.net/mp_blog/creation/editor/132137544 二、写入批处理代码 1.右键新建的批处理文件&#xff0c;点击…

eBay类目限制要多久?eBay促销活动有哪些?-站斧浏览器

eBay类目限制要多久&#xff1f; 1、eBay对不同类目的商品有不同的限制和要求。一些类目可能对新卖家有一定的限制&#xff0c;限制他们在该类目下销售商品的数量或需要满足某些条件才能进行销售。 2、对于新卖家的限制通常是在一定时间内&#xff0c;比如30天或90天&#xf…

【数据结构】线性表(四)双向链表的各种操作(插入、删除、查找、修改、遍历打印)

目录 线性表的定义及其基本操作&#xff08;顺序表插入、删除、查找、修改&#xff09; 四、线性表的链接存储结构 1. 单链表 2. 循环链表 3. 双向链表 a. 双向链表节点结构 b. 创建一个新的节点 c. 在链表末尾插入节点 d. 在指定位置插入节点 e. 删除指定位置的节点…

LeetCode算法刷题(python) Day42|09动态规划|62.不同路径、63. 不同路径 II

目录 LeetCode 62. 不同路径LeetCode 63. 不同路径II LeetCode 62. 不同路径 力扣题目链接 class Solution:def uniquePaths(self, m: int, n: int) -> int:dp [[1] * n for _ in range(m)]for j in range(n):for i in range(m):if i 0 and j > 0:dp[i][j] dp[i][j-1…

Python实现番茄小说内容下载

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 环境使用: Python 3.8 Pycharm 模块使用: requests --> pip install requests re parsel 代码展示&#xff1a; 导入模块 # 导入数据请求模块 import…

[自定义 Vue 组件] 小尾巴 Logo 组件 TailLogo

文字归档于&#xff1a;https://www.yuque.com/u27599042/coding_star/apt6y731ybmxgu5g 组件效果 组件依赖 自定义字符串工具函数 stringIsNull https://www.yuque.com/u27599042/coding_star/slncupw7un3ce7cb import {stringIsNull} from "/utils/string_utils.js&q…

python进制和编码

一、进制 计算机中底层所有的数据都是以 010101的形式存在&#xff08;图片、文本、视频等&#xff09;。 二、进制转换 v1 bin(25) # 十进制转换为二进制 print(v1) # "0b11001"v2 oct(23) # 十进制转换为八进制 print(v2) # "0o27"v3 hex(28) # 十进…

ThinkPHP 8.x MVC 数据库用户增加功能demo实现

ThinkPHP MVC 数据库用户增加功能实现 在thinkphp 多应用的项目中&#xff0c; 采用MVC的架构实现 增加用户的功能。 在多应用下的controller下创建UserInfo.php ,创建一个和用户信息相关操作的控制器。 定义一个插入信息的方法,这里叫insertUserInfo 我们要执行一个用户插入…

Apache Doris (四十五): Doris数据更新与删除 - Sequence 列

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录 1. 基本原理

EtherNet/IP转Modbus TCP协议网关的接口

远创智控的YC-EIPM-TCP网关产品&#xff0c;它有什么作用呢&#xff1f;一起来了解一下吧&#xff01; 远创智控YC-EIPM-TCP网关产品可以通过各种数据接口和工业领域的仪表、PLC、计量设备等产品连接&#xff0c;实时采集这些设备中的运行数据、状态数据等信息&#xff0c;并把…

数字秒表verilog电子秒表跑表,代码/视频

名称&#xff1a;数字秒表verilog电子秒表跑表 软件&#xff1a;Quartus 语言&#xff1a;Verilog 代码功能&#xff1a; 设计电子秒表&#xff0c;秒表时间精确到0.01秒&#xff0c;可通过按键控制秒表启动、暂停、复位。 代码需要在Mini_Star开发板验证。 开发板资料&…

【springboot异常处理】

这里写自定义目录标题 1&#xff0c;Java Servlet规范异常处理触发异常 2&#xff0c;tomcat 异常处理实现tomcat请求处理流程异常发生时核心处理类 3&#xff0c;springmvc 异常定制以及扩展请求处理流程使用ControllerAdvice & ExceptionHandler 配置全局异常处理器未配置…

全面的Docker快速入门教程

前言&#xff1a; 都2023年了&#xff0c;你还在为了安装一个开发或者部署环境、软件而花费半天的时间吗&#xff1f;你还在解决开发环境能够正常访问&#xff0c;而发布正式环境无法正常访问的问题吗&#xff1f;你还在为持续集成和持续交付&#xff08;CI / CD&#xff09;工…

【C++11】右值引用、移动构造、移动赋值、完美转发 的原理介绍

文章目录 一、概念1.1 左值1.2 左值引用1.3 什么是右值&#xff1f;1.4 什么是右值引用&#xff1f;对于参数左值还是右值的不同&#xff0c;是被重载支持的左值引用的使用场景 和 缺陷 二、移动语义2.1 移动拷贝构造2.2 移动赋值 三、右值引用 与 STL3.1 移动拷贝构造 和 赋值…

Web攻防03_MySQL注入_数据请求

文章目录 PHP-MYSQL-数据请求类型1、数字型(无符号干扰)2、字符型&#xff08;有符号干扰&#xff09;3、搜索型&#xff08;有多符号干扰&#xff09;4、框架型&#xff08;有各种符号干扰&#xff09; PHP-MYSQL-数据请求方法数据请求方法GET&#xff1a;POST&#xff1a;Coo…

运筹系列86:MIP问题的建模tips

1. Either-or constraint 添加辅助变量y。 比如 Either 3 x 1 2 x 2 ≤ 18 3x_12x_2 \le 18 3x1​2x2​≤18 or x 1 4 x 2 ≤ 16 x_14x_2 \le 16 x1​4x2​≤16 可以用 3 x 1 2 x 2 ≤ 18 M y 3x_12x_2 \le 18My 3x1​2x2​≤18My x 1 4 x 2 ≤ 16 M ( 1 − y ) x_1…

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

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