首页 > 其他分享 >嵌套元素的“事件”冒泡?!——WEB开发系列52

嵌套元素的“事件”冒泡?!——WEB开发系列52

时间:2024-10-23 20:47:56浏览次数:9  
标签:WEB 元素 52 点击 事件 监听器 event 冒泡

事件处理是创建交互式用户界面的关键部分,浏览器通过事件系统让我们能够捕获和响应用户的输入,比如点击、鼠标移动、键盘输入等。

嵌套元素的“事件”冒泡?!——WEB开发系列52_事件冒泡

什么是事件冒泡?

事件冒泡是指在嵌套的 HTML 元素中,一个事件从最具体的元素开始,然后向上传播到更高层级的父元素。

例如,如果用户点击一个嵌套的按钮,事件首先会被按钮捕获,然后会冒泡到按钮的父元素,接着是父元素的父元素,直到到达 <body> 元素或文档的根元素。这种机制使得一个事件可以被多个元素处理,而不需要为每一个元素单独设置事件监听器。


事件冒泡

让我们先看一个关于事件冒泡的基本示例。在按钮及其父元素上设置点击事件监听器。

HTML 代码

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>事件冒泡示例</title>
    <style>
        div {
            border: 2px solid blue;
            padding: 20px;
            margin: 10px;
        }
        button {
            padding: 10px;
        }
    </style>
</head>
<body>
    <div id="parent">
        <button id="child">点击我</button>
    </div>

    <script src="script.js"></script>
</body>
</html>

JavaScript 代码

document.getElementById("parent").addEventListener("click", function(event) {
    alert("父元素被点击");
});

document.getElementById("child").addEventListener("click", function(event) {
    alert("子元素被点击");
});

嵌套元素的“事件”冒泡?!——WEB开发系列52_web前端_02

有一个包含按钮的 div 元素,为父元素(div)和子元素(按钮)设置点击事件监听器。

  • 当用户点击按钮时,首先触发按钮的点击事件,然后事件冒泡到父元素 div
  • 结果是用户将看到两个弹窗,依次表示“子元素被点击”和“父元素被点击”。

冒泡顺序

  1. 点击按钮,触发 按钮点击事件
  2. 然后,事件冒泡到父 div,触发 父元素点击事件

如果我们想要控制这一流程,可以使用 stopPropagation() 方法。


使用 stopPropagation() 修复问题

stopPropagation() 方法可以用来阻止事件向上传播。如果在子元素的事件处理函数中调用了 event.stopPropagation(),事件不会冒泡到父元素。

更新后的 JavaScript 代码

document.getElementById("parent").addEventListener("click", function(event) {
    alert("父元素被点击");
});

document.getElementById("child").addEventListener("click", function(event) {
    alert("子元素被点击");
    event.stopPropagation(); // 阻止事件冒泡
});

在这个更新后的代码中,点击按钮时用户只会看到“子元素被点击”,而不会看到“父元素被点击”的弹窗。因为我们在按钮的事件处理函数中调用了 event.stopPropagation(),这使得事件不会继续向上冒泡。


事件捕获

事件捕获是事件处理的另一种机制,与事件冒泡相反。当我们为事件设置监听器时,可以指定事件捕获阶段。在捕获阶段,事件从文档的根元素开始,然后向下传播到最具体的元素。

设置捕获监听器

在添加事件监听器时,可以将第三个参数设置为 true 来启用捕获。

更新后的 JavaScript 代码

document.getElementById("parent").addEventListener("click", function(event) {
    alert("父元素被点击");
}, true); // 启用捕获

document.getElementById("child").addEventListener("click", function(event) {
    alert("子元素被点击");
    event.stopPropagation();
}, true); // 启用捕获

点击按钮时,用户会看到“父元素被点击”,然后是“子元素被点击”。因为这里的事件监听器是以捕获模式添加的,父元素的监听器在子元素之前被触发。

事件捕获和冒泡的总结

  • 事件冒泡从具体元素到父元素。
  • 事件捕获从父元素到具体元素。
  • 默认情况下,事件是以冒泡的方式处理的。

事件委托

事件委托是指将事件监听器附加到一个父元素上,而不是每一个子元素上。这种方法特别适用于动态生成的内容,或者当子元素数量较多时。

事件委托的好处

  • 减少内存开销:只需一个事件监听器就可以处理多个元素。
  • 更容易管理:更方便的添加或删除监听器,尤其是动态内容。
  • 适用于动态子元素:即使更多子元素在未来添加,父元素的监听器仍然可以有效工作。
<ul id="list">
    <li>项 1</li>
    <li>项 2</li>
    <li>项 3</li>
</ul>

<script>
    document.getElementById("list").addEventListener("click", function(event) {
        if (event.target.tagName === 'LI') {
            alert("你点击了: " + event.target.textContent);
        }
    });
</script>

中点击事件的监听器附加到 ul 父元素上,而不是每一个 li 子元素。无论用户点击哪个 li,都会触发父元素的事件监听器。判断 event.target.tagName 确保只有 li 元素的点击事件会被响应。

事件冒泡和捕获是浏览器处理事件的重要机制。实际开发中:

  • 事件冒泡可以让我们轻松处理嵌套元素的事件。
  • 通过调用 stopPropagation() 你可以精确地控制事件流。
  • 事件委托允许你高效地管理多个元素,优化事件处理性能。

嵌套元素的“事件”冒泡?!——WEB开发系列52_web前端_03

如有表述欠缺之处还请各位佬指正。

标签:WEB,元素,52,点击,事件,监听器,event,冒泡
From: https://blog.51cto.com/wamtar/12342143

相关文章

  • 【UI】Dash web应用开发框架使用简介
    简介Dash是一个基于Python的开源框架,用于创建交互式的、响应式的Web应用程序。它广泛应用于数据科学、数据分析和机器学习的可视化领域。Dash由Plotly开发,旨在简单而强大,帮助用户迅速构建专业的web应用界面。架构概览Dash的架构基于Flask(Web框架)、Plotly.j......
  • ssts-hospital-web-master项目实战记录四:主要配置
    记录时间:2024-10-231.配置浏览器自动打开配置文件:package.json "scripts":{  "dev":"vite--open" } 2.配置src别名(1)安装@types/node输入npm命令npm i@types/node--save-dev(2)配置文件:vite.config.tsimport{defineConfig}from'vi......
  • 计算机毕业设计项目推荐:基于Web的社区人员管理系统的设计36303(开题答辩+程序定制+全套
    摘要科技进步的飞速发展引起人们日常生活的巨大变化,电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流,人类发展的历史正进入一个新时代。在现实运用中,应用软件的工作规则和开发步骤,采用ASP.NET技术建设社......
  • ssts-hospital-web-master项目实战记录三:项目开发规范
    记录时间:2024-10-23参考书籍《Vue.js3+TypeScript完全指南》17.3 项目开发规范 在企业项目开发中,通常由多人一起协作完成开发任务,每个人编写的代码风格可能不统一。为了避免出现问题,一般会制定一些规范来约束整个项目的编码风格,包括编辑器规范、代码格式规范、编写代码......
  • ssts-hospital-web-master项目实战记录二:版本管理-git
    记录时间:2024-10-231.VSCode打开项目(1)文件→打开文件夹,对应的英文为File→OpenFolder(2)打开效果如下 2.VSCode本地项目托管 (1)打开终端:Terminal→NewTerminal(2)生成仓库:git init输入 git命令git init (3)添加到暂存区:git add.输入 git命令git add. (4)提......
  • ssts-hospital-web-master项目实战记录一:创建项目
    记录日期:2024-10-231.找到存放项目的文件夹,打开cmd命令  2.使用官方脚手架Vite创建项目(1)输入npm命令npmcreatevite@latest(2)输入项目名称:ssts-hospital-web-master  (3)选择框架:Vue(4)选择变体(使用的编程语言):TypeScript(5)构建完成,提示我们用三行命令进行接下来的操......
  • Webpack5-合并脚本(webpack-merge-and-include-globally)
    安装插件:yarnaddwebpack-merge-and-include-globally-Dwebpack.config.jsconstpath=require("path");constMergeIntoSingleFilePlugin=require('webpack-merge-and-include-globally');module.exports={mode:'none',e......
  • jsp ssm 购物网站 在线购物平台 在线商城 网购平台 源码web java
    一、项目简介本项目是一套基于SSM的购物网站,主要针对计算机相关专业的和需要项目实战练习的Java学习者。包含:项目源码、数据库脚本、软件工具等。项目都经过严格调试,确保可以运行!二、技术实现​后端技术:Spring、SpringMVC、MyBatis前端技术:JSP、HTML、CSS、JavaScript......
  • jsp ssm 共享充电宝管理系统 充电宝平台 电源管理 源码 web java
    一、项目简介本项目是一套基于SSM的共享充电宝管理系统,主要针对计算机相关专业的和需要项目实战练习的Java学习者。包含:项目源码、数据库脚本、软件工具等。项目都经过严格调试,确保可以运行!二、技术实现​后端技术:Spring、SpringMVC、MyBatis前端技术:JSP、HTML、CSS、......
  • jsp ssm 大学生兼职网站 兼职平台 校园招聘网站 源码 web java
    一、项目简介本项目是一套基于SSM的大学生兼职网站,主要针对计算机相关专业的和需要项目实战练习的Java学习者。包含:项目源码、数据库脚本、软件工具等。项目都经过严格调试,确保可以运行!二、技术实现​后端技术:Spring、SpringMVC、MyBatis前端技术:JSP、HTML、CSS、Java......