当前位置: 首页 > news >正文

事件【JavaScript】

1. 事件

事件是用户或浏览器动作的表示,JavaScript 中的一切交互都是通过事件来处理的。

2. 事件冒泡(Event Bubbling)

事件冒泡是指事件从最具体的元素(即触发事件的元素)开始触发,然后逐级向上传播到较为不具体的元素(即该元素的父元素、祖先元素),直到到达最顶层的元素(通常是document对象)或某个阶段的处理函数决定停止冒泡。在冒泡过程中,每个元素都有机会处理这个事件。

例如,如果你在一个按钮(button)内部点击,点击事件会首先在按钮上触发,然后冒泡到包含按钮的父元素,再到更上一级的祖先元素,以此类推。

3. 事件捕获(Event Capturing)

事件捕获与事件冒泡相反,它是指事件从最顶层的元素开始触发,然后逐级向下传播到更具体的元素,直到到达触发事件的元素。在捕获过程中,同样每个元素都有机会处理这个事件。

在事件捕获阶段,事件首先由document对象处理,然后传递给document的子元素,依次类推,直到到达实际触发事件的元素。

4. 事件流

当在DOM中触发一个事件时,这个事件并不是仅在其发生源元素上触发一次,而是会经历一个完整的事件流过程。这个过程分为三个阶段:捕获阶段目标阶段冒泡阶段

  1. 捕获阶段:事件从document对象开始,按照DOM树的结构向下传播,直到到达触发事件的元素。

  2. 目标阶段:事件到达了触发事件的元素,此时会触发该元素上的事件处理函数。

  3. 冒泡阶段:事件从触发事件的元素开始,按照DOM树的结构向上冒泡,直到到达document对象或某个处理函数通过调用event.stopPropagation()方法阻止了冒泡。

在大多数情况下,事件冒泡更为常用,因为它允许开发者利用事件委托(Event Delegation)技术,即在一个父元素上设置事件监听器来处理其子元素触发的事件,从而减少需要添加的事件监听器的数量。而事件捕获在某些特定场景下也很有用,比如当需要在事件到达目标元素之前进行预处理时。

如何使用:

在JavaScript中,你可以使用addEventListener方法来为DOM元素添加事件监听器,并通过设置该方法的第三个参数来决定是在捕获阶段还是冒泡阶段处理事件。如果设置为true,则在捕获阶段处理事件;如果设置为false或省略,则在冒泡阶段处理事件。例如:

// 在冒泡阶段处理点击事件
element.addEventListener('click', function(event) {// 处理逻辑
}, false); // 或者省略第三个参数// 在捕获阶段处理点击事件
element.addEventListener('click', function(event) {// 处理逻辑
}, true);

5. 事件处理程序:

事件处理程序用于处理用户与网页元素的交互,比如点击、输入、移动鼠标等。

5.1 HTML事件处理程序

HTML事件处理程序是通过在HTML标签内使用事件属性(比如onclickonmouseover等)来定义的。以下是一个简单的例子:

<button onclick="alert('按钮被点击了!')">点击我</button>

在这个例子中,点击按钮时,会弹出一个警告框。

优点

  • 使用简单直观,适合小型项目。

缺点

  • 不易维护,代码与结构混杂在一起,可能导致不便于管理和调试。

5.2 DOM0级事件处理程序

DOM0级事件处理程序是在JavaScript中通过直接将函数赋值给 DOM 元素的事件属性来实现的。如下所示:

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

优点

  • 代码与结构分离,提升了可读性和维护性。

缺点

  • 只支持一个事件处理程序,后面设置的会覆盖前面的。

5.3 DOM2级事件处理程序(建议使用)

DOM2级事件处理程序使用 addEventListener 方法为指定的对象添加事件监听器,支持多个事件处理函数。例子如下:

<button id="myButton">点击我</button>
<script>var button = document.getElementById('myButton');button.addEventListener('click', function() {alert('按钮被点击了!');});button.addEventListener('click', function() {console.log('另一个处理程序');});
</script>

优点

  • 支持多个事件处理程序,既不覆盖前面的处理程序,又能灵活处理不同的事件类型。
  • 可以更好地管理事件的捕获与冒泡。

缺点

  • 不支持 IE8 及更早的浏览器。

5.4 IE事件处理程序

IE事件处理程序是特定于 Internet Explorer 的事件处理方式,通常使用 attachEvent 方法。例子如下:

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

优点

  • 在 IE 早期版本中可用,为开发者提供了一种处理事件的方式。

缺点

  • 语法和DOM标准不一致,难以与其他浏览器兼容。
  • 不支持事件捕获。
  • 只能添加一个事件处理程序,后添加的会覆盖之前的。

6. 事件相关的示例

6.1 如何获取事件对象

在JavaScript中,事件对象提供有关事件的信息,例如事件类型、目标元素等。可以通过事件处理函数的参数来获取该对象。

示例代码

<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><title>获取事件对象示例</title>
</head>
<body><button id="myButton">点击我</button><script>document.getElementById('myButton').addEventListener('click', function(event) {console.log(event); // 输出事件对象console.log('事件类型:', event.type); // 输出事件类型});</script>
</body>
</html>

在这个例子中,当按钮被点击时,事件对象将被传递并输出到控制台。

6.2 事件目标

事件目标是指触发事件的实际元素。可以通过事件对象的 target 属性访问事件目标。

示例代码

<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><title>事件目标示例</title>
</head>
<body><div><button class="btn">按钮 1</button><button class="btn">按钮 2</button></div><script>const buttons = document.querySelectorAll('.btn');buttons.forEach(button => {button.addEventListener('click', function(event) {console.log('事件目标:', event.target); // 输出被点击的按钮});});</script>
</body>
</html>

在这个例子中,单击任意按钮时,控制台将输出被点击按钮的引用。

6.3 事件代理

事件代理是一种将事件处理程序绑定到父元素而不是直接绑定到目标元素上的技术。它利用事件冒泡特性来处理子元素的事件,这样可以在动态添加子元素时无需重新绑定事件。

示例代码

<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><title>事件代理示例</title>
</head>
<body><ul id="myList"><li>项 1</li><li>项 2</li></ul><button id="addItem">添加项</button><script>// 列表的事件代理document.getElementById('myList').addEventListener('click', function(event) {if (event.target.tagName === 'LI') {alert('点击了: ' + event.target.innerText); // 输出被点击的列表项文本}});// 动态添加列表项document.getElementById('addItem').addEventListener('click', function() {const newItem = document.createElement('li');newItem.textContent = '新项';document.getElementById('myList').appendChild(newItem);});</script>
</body>
</html>

在这个例子中,无论是已经存在的列表项还是动态添加的列表项,点击时都能触发事件处理程序。

6.4 事件冒泡

事件冒泡指的是事件从事件目标向上冒泡,触发其祖先元素上的事件处理程序。可以通过设置事件的 stopPropagation() 方法来阻止事件继续冒泡。

示例代码

<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><title>事件冒泡示例</title>
</head>
<body><div id="parent" style="border: 1px solid #001;"><button id="child">点击我</button></div><script>document.getElementById('parent').addEventListener('click', function() {console.log('父元素被点击');});document.getElementById('child').addEventListener('click', function(event) {console.log('子元素被点击');event.stopPropagation(); // 阻止事件冒泡});</script>
</body>
</html>

在这个例子中,点击子元素按钮只会输出“子元素被点击”,而不会触发父元素的点击事件。

6.5 事件流阶段 eventPhase

eventPhase属性用于指示事件当前位于事件流的哪个阶段。值为:

  • 1:捕获阶段(事件正在捕获)
  • 2:目标阶段(事件到达目标元素)
  • 3:冒泡阶段(事件正向上冒泡)

示例代码

<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><title>事件流阶段示例</title>
</head>
<body><div id="parent" style="border: 1px solid #001;"><button id="child">点击我</button></div><script>document.getElementById('parent').addEventListener('click', function(event) {console.log('父元素的 eventPhase:', event.eventPhase);}, true); // 捕获阶段document.getElementById('child').addEventListener('click', function(event) {console.log('子元素的 eventPhase:', event.eventPhase);});</script>
</body>
</html>

在这个例子中,当点击按钮时,控制台将输出事件在父元素和子元素中的流阶段信息。

6.6 取消默认事件

可以通过event.preventDefault()方法取消事件的默认行为,例如阻止链接跳转或表单提交。

示例代码

<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><title>取消默认事件示例</title>
</head>
<body><a href="https://www.example.com" id="myLink">点击我</a><script>document.getElementById('myLink').addEventListener('click', function(event) {event.preventDefault(); // 取消链接的默认跳转行为alert('链接被点击,但不会跳转!'); });</script>
</body>
</html>

在这个例子中,当点击链接时,通过preventDefault()方法阻止了页面的跳转,同时弹出提示框。

相关文章:

事件【JavaScript】

1. 事件 事件是用户或浏览器动作的表示&#xff0c;JavaScript 中的一切交互都是通过事件来处理的。 2. 事件冒泡&#xff08;Event Bubbling&#xff09; 事件冒泡是指事件从最具体的元素&#xff08;即触发事件的元素&#xff09;开始触发&#xff0c;然后逐级向上传播到较…...

【Linux】Linux基本命令

目录 文件和目录操作&#xff1a; ls cd pwd cp mv rm mkdir rmdir touch clear history which/whereis 文件查看和编辑&#xff1a; cat less head tail vi 或 vim sz/rz echo 系统信息和管理&#xff1a; su uname hostname df free top ps ki…...

微软宣称其新工具可纠正人工智能幻觉 但专家依然对此表示怀疑

人工智能经常胡言乱语&#xff0c;微软现在说它有办法解决这个问题&#xff0c;但我们有理由对此持怀疑态度。微软今天发布了一项名为"更正"&#xff08;Correction&#xff09;的服务&#xff0c;它可以自动修改人工智能生成的与事实不符的文本。Correction 首先会标…...

实战OpenCV之图像滤波

基础入门 图像滤波是数字图像处理中一种非常重要的技术,主要用于图像噪声去除、图像平滑、突出图像特征,或者进行图像风格的转换。它通过数学运算对图像中的像素值进行修改,以达到特定的处理目的。图像滤波可以分为两大类,分别为:线性滤波、非线性滤波。 线性滤波器通过一…...

AI学习指南深度学习篇-Adadelta的Python实践

AI学习指南深度学习篇-Adadelta的Python实践 深度学习是人工智能领域的一个重要分支&#xff0c;近年来在各个领域都取得了显著的成就。在深度学习的模型训练中&#xff0c;优化算法起着至关重要的作用&#xff0c;其中Adadelta是一种常用的优化算法之一。本篇博客将使用Pytho…...

go webapi上传文件 部属到linux

go厉害的地方&#xff0c;linux服务器上无需安装任何依赖就可以运行&#xff0c;大赞&#xff01; 一、编译 #在Goland中cmd中执行 go env -w GOARCHamd64 go env -w GOOSlinux go build main.go # 切换回来 否则无法运行 go env -w GOOSwindows go run main.go 拷贝到linux服…...

接口加解密及数据加解密

目录 一、 加解密方式介绍 1.1 Hash算法加密 1.2. 对称加密 1.3 非对称加密 二、 我们要讲什么&#xff1f; 三、 接口加解密 四、 数据加解密 一、 加解密方式介绍 所有的加密方式我们可以分为三类&#xff1a;对称加密、非对称加密、Hash算法加密。 算法内部的具体实现…...

开创远程就可以监测宠物健康新篇章

在宠物健康监测的新纪元&#xff0c;智能听诊器凭借其先进技术&#xff0c;正逐步改变我们对宠物健康监护的传统认知。这不仅是一款监测工具&#xff0c;而是宠物健康管理的得力助手&#xff0c;为宠物主人和兽医提供前所未有的洞察力和便捷性。 深度学习算法&#xff1a;智能…...

二叉树的基本概念(上)

文章目录 &#x1f34a;自我介绍&#x1f34a;简介&#x1f34a;树的定义树中的专业术语树的分类 &#x1f34a;二叉树的特性讲解 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以&#xff1a;点赞关注评论收藏&#xff08;一键四连&#xff09;哦~ &#x1f34a;自我介…...

aws s3 存储桶 前端组件上传简单案例

写一个vue3 上传aws oss存储的案例 使用到的插件 npm install aws-sdk/client-s3 注意事项 &#xff1a; 1. 本地调试 &#xff0c; 需要设置在官网设置跨域 必须&#xff01;&#xff01;&#xff01; 否则调试不了 &#xff0c;前端代理是不起作用的 &#xff0c;因为是插…...

【开源免费】基于SpringBoot+Vue.JS墙绘产品展示交易平台(JAVA毕业设计)

本文项目编号 T 049 &#xff0c;文末自助获取源码 \color{red}{T049&#xff0c;文末自助获取源码} T049&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…...

python爬虫初体验(四)—— 百度文库PPT的爬取

文章目录 1. 安装包2. 相关代码3. 说明4. 注意事项5. 扩展功能5.1 多页面下载5.2 输入地址下载 在Python 2中编写一个爬虫来大量下载图片&#xff0c;可以使用requests库来发送HTTP请求&#xff0c;并使用BeautifulSoup来解析HTML页面。此外&#xff0c;可以使用urllib2库来下载…...

下水道内缺陷识别检测数据集 yolo数据集 共2300张

下水道内缺陷识别检测数据集 yolo数据集 共2300张 下水道内部缺陷识别数据集&#xff08;Sewer Interior Defect Recognition Dataset, SIDRD&#xff09; 摘要 SIDRD 是一个专门针对下水道内部缺陷识别的数据集&#xff0c;旨在为城市基础设施维护和管理提供一个标准化的训练…...

年轻用户对Facebook的使用趋势分析

在社交媒体的蓬勃发展中&#xff0c;Facebook作为全球最大的社交平台之一&#xff0c;尽管面临着来自新兴平台的竞争&#xff0c;仍然在年轻用户中扮演着重要角色。然而&#xff0c;年轻用户对Facebook的使用方式和趋势却在不断变化。本文将探讨年轻用户对Facebook的使用趋势&a…...

EasyCVR全方位安全守护智慧电厂:构建高效视频监控系统优势分析

随着信息技术的飞速发展和数字化时代的到来&#xff0c;电厂作为能源供应的重要枢纽&#xff0c;其安全性和管理效率成为社会各界关注的焦点。为了满足电厂对高效、智能、可靠视频监控系统的需求&#xff0c;基于EasyCVR平台建设的电厂视频监控系统应运而生。 一、系统构成 基…...

基于深度学习的情感生成与交互

基于深度学习的情感生成与交互是一个新兴的研究领域&#xff0c;旨在通过深度学习技术生成具有情感的反应&#xff0c;以增强人机交互的自然性和有效性。该技术涉及情感识别、自然语言处理、计算机视觉等多个领域&#xff0c;并在多个应用场景中展现出潜力。 情感生成的主要方…...

JavaScript匿名函数

引言 JavaScript是一种广泛使用的脚本语言&#xff0c;用于Web开发和其他领域。在JavaScript中&#xff0c;函数是非常重要的组成部分&#xff0c;它们允许开发者组织代码、复用代码以及执行特定的任务。本文将探讨一种特殊的函数类型——匿名函数&#xff0c;并介绍如何使用它…...

线性判别分析(LDA)中计算两个类的中心点在投影方向w上的投影示例

通过一个具体的例子&#xff0c;详细说明 w T μ 0 w^T \mu_0 wTμ0​ 和 w T μ 1 w^T \mu_1 wTμ1​ 如何表示两个类的中心点在投影方向 w w w 上的投影。 假设&#xff1a; 我们有两个类的数据集&#xff0c;均值向量 μ 0 \mu_0 μ0​ 和 μ 1 \mu_1 μ1​&#xff…...

前端知识——标签知识

1.p段落标签 ——一个p标签表示一个段落 单独占一行 >p标签里面不可以嵌套其它的块级标签(div h1~h6 p等) 会导致浏览器自动分裂成两个标签 不规范的写法 >但是可以包裹span标签 2.span标签 ——包裹文字标签 可以和span一行显示 3.文本格式化标签 ——给…...

使用Docker和cpolar在Linux服务器上搭建DashDot监控面板

使用Docker和cpolar在Linux服务器上搭建DashDot监控面板 前言环境准备安装Docker下载Dashdot镜像 部署DashDot应用本地访问DashDot服务安装cpolar内网穿透固定DashDot公网地址结语 前言 在这个数字化飞速发展的时代&#xff0c;服务器作为支撑各种应用和服务的基础设施&#xf…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...

解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist

现象&#xff1a; android studio报错&#xff1a; [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决&#xff1a; 不要动CMakeLists.…...