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

关于事件捕获和事件冒泡的理解

我一直对事件捕获和事件冒泡是挺困惑的,好像理解了,但又感觉哪里不对。这篇文章打算深入探讨一些细节性的问题,更好的理解事件捕获和事件冒泡。

当我们点击的时候,浏览器的默认行为是怎么样的?

搞清楚这个非常的重要。因为历史原因,不同的浏览器以及不同版本DOM标准的不同。对于事件的处理方式也是不同的。我们不考虑历史原因,就考虑现在的开发环境,浏览器对于事件处理的默认行为是怎么样的?

我可以给出结论:主流浏览器对于事件处理都必然经过三个阶段,捕获阶段–>目标阶段–>冒泡阶段。

在一些书籍里面会提到事件捕获或者事件冒泡这样的词语。给人的感觉好像只有捕获阶段或者只有冒泡阶段的样子。实际上,任何的点击事件都必然经历三个完整的阶段,只是一些阶段的事件可以通过参数配置屏蔽掉。怎么屏蔽那是js引擎的事情,跟我们没有关系。

从addEventListener说起

在明白了浏览器对于事件流的默认行为后,我们才能开始下面的内容。或者你先记住默认行为的结论。

主流浏览器对于事件处理都必然经过三个阶段,捕获阶段–>目标阶段–>冒泡阶段。

默认行为,事件冒泡

我们以一个简单的例子开始。在js中,addEventListener就是事件流的一个具体实现。

addEventListener的第三个参数叫useCapture,也就是是否使用事件捕获,默认是false,所以默认情况下,使用的是事件冒泡。 注意这句话,这句话在很多书籍和文章中经常出现,给人一种错觉,就是好像只有冒泡阶段。实际上真正的意思是只处理事件冒泡,不处理事件捕获。 也就是说,三个阶段都是存在的。只是事件捕获被屏蔽了不处理而已。

例1:父子元素的点击事件

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title><style>#outer {width: 200px;height: 200px;background: lightblue;}#inner {width: 100px;height: 100px;background: lightcoral;}</style></head><body><div id="outer"><div id="inner">点击</div></div><script>document.getElementById("outer").addEventListener("click",function () {console.log("outer...");},false);document.getElementById("inner").addEventListener("click",function () {console.log("inner...");},false);</script></body>
</html>

在这里插入图片描述
在开始分析代码之前,我打算解释一下目标阶段。

目标阶段

这个阶段好像看起来没什么用,实际上目标阶段非常的重要。
如果我们点击蓝色区域,也就是不包含inner的outer区域。这时候只会输出outer。可能有人会奇怪,如果三个阶段都是必须经历的话,不管是冒泡和捕获,从DOM的元素结构上,只要事件被处理,必定会传到inner上。但事实是,你点击蓝色区域的时候,你的目标阶段就只要outer这个元素。根本没有inner元素什么事情。这就是目标阶段的具体含义。 也是目标阶段这个抽象概念在浏览器中的实际体现。
在这里插入图片描述

冒泡阶段

例1的结果如下:

inner...
outer...

我们分析一下,为什么是这样的输出结果。首先,父子元素的addEventListener的第三个参数都是false,也就是都屏蔽捕获阶段,处理冒泡阶段。我们只需要分析输出的结果在逻辑上是否合理就行了。这里我们可以简单的判断父子元素的输出先后问题。

首先,必然都经过三个阶段:捕获阶段–>目标阶段–>冒泡阶段。
因为父子元素都是屏蔽捕获阶段,只使用冒泡阶段。所以从里到外的时候inner优先于outer输出。这是符合逻辑的。

捕获阶段

如果我们把父子元素的addEventListener的第三个参数都设为true。那么输出的结果如下:

outer...
inner...

首先,必然都经过三个阶段:捕获阶段–>目标阶段–>冒泡阶段。
因为父子元素都是屏蔽冒泡阶段,只使用捕获阶段。所以从外到里的时候outer优先于inner输出。这是符合逻辑的。

同时使用捕获阶段和冒泡阶段

我们给outer选择器同时添加两个addEventListener,并且useCapture一个设置为true,一个设置为false。这就是所谓的同时使用捕获阶段和冒泡阶段。inner的addEventListener只是陪跑,不需要也可以说明问题。

      //同时的意思是你需要对同一个元素添加两个addEventListener,一个useCapture为false,一个为truedocument.getElementById("outer").addEventListener("click",function (event) {console.log("outer...", event.eventPhase);},true);document.getElementById("outer").addEventListener("click",function (event) {console.log("outer...", event.eventPhase);},false);document.getElementById("inner").addEventListener("click",function (event) {console.log("inner...", event.eventPhase);},false);

输出结果如下:

outer...
inner...
outer...

很容易解释这个输出结果。

首先,必然都经过三个阶段:捕获阶段–>目标阶段–>冒泡阶段。因为有一个outer选择器的addEventListener监听了捕获阶段,所以在捕获阶段的时候,outer先输出一次,而inner在目标阶段被输出,接着在冒泡阶段,事件从里到外传播,outer再一次被输出。

如果不是很理解的话,有一个属性可能帮我们更直观的理解这个过程。

通过eventPhase判断当前事件所处阶段

还是上面这个例子,只是这次,我们加了event.eventPhase这个输出。

      document.getElementById("outer").addEventListener("click",function (event) {console.log("outer...", event.eventPhase);},true);document.getElementById("outer").addEventListener("click",function (event) {console.log("outer...", event.eventPhase);},false);document.getElementById("inner").addEventListener("click",function (event) {console.log("inner...", event.eventPhase);},false);

这个输出有三个值,值为数字。event上有三个常量分别对应这三个数字。

1:CAPTURING_PHASE
2:AT_TARGET
3:BUBBLING_PHASE

这个例子的输出结果如下:分别对应捕获,目标,冒泡三个阶段。

outer...1
inner...2
outer...3

这个例子非常的完美,非常能说明问题。两个outer分别对应捕获和冒泡,这个非常的好理解。inner为什么是在目标阶段输出的?因为设计如此,这也是目标阶段的概念所在。最里层的元素的事件触发时机就是在目标阶段。

阻止事件冒泡

我们看下面的代码,在inner回调函数中调用stopPropagation这个函数,Propagation是传播的意思,也就是这个函数能阻止事件传播。

      document.getElementById("outer").addEventListener("click",function () {console.log("outer...");},false);document.getElementById("inner").addEventListener("click",function (event) {console.log("inner...");event.stopPropagation();},false);

结果如下:

inner...

outer没有输出内容,这非常好理解,因为调用stopPropagation,事件到底目标元素的时候停止传播了。但为什么inner能输出呢?这是因为inner的回调函数是在目标阶段调用的,而不是在冒泡阶段,可以参考上一小节的例子。

阻止目标阶段和事件冒泡

更进一步,我们可以把目标阶段和冒泡阶段都给阻止。下面的代码就可以实现这样的功能。

      document.getElementById("outer").addEventListener("click",function () {console.log("outer...");event.stopPropagation();},true);document.getElementById("inner").addEventListener("click",function (event) {console.log("inner...");},false);

输出结果如下:

outer...

为什么只要outer被输出?因为在捕获阶段完成后调用了stopPropagation方法,那么后面的目标阶段和冒泡阶段事件也就不会再传递了,所以inner所在的目标阶段自然不会输出内容。

到此,最难的部分已经全部介绍完毕。

阻止默认行为

这个非常的简单,就是preventDefault函数的使用场景。这个函数能够阻止元素的默认行为。例如a链接在设置了href后,在点击的时候自带跳转效果,调用preventDefault函数后,这个效果就没有了,你可以在preventDefault函数实现你自己想要的行为。

<body><div id="outer"><a href="www.baidu.com" id="inner">点击跳转</div></div><script>document.getElementById("inner").addEventListener("click",function (event) {console.log("inner...");event.preventDefault();},false);</script>
</body>

事件委托

这种情况是非常常见的,只是我们可能对这个概念名词比较陌生。
例如下面的list,里面有多个item。
我们有两种方式实现对于item的点击监听。一种是通过for循环给每个item都addEventListener,是能实现效果的,但问题非常明显,生成太多的监听严重的消耗性能。

另一种方式就是所谓的事件委托。也就是把addEventListener放在list上面,这样我们就能够通过一个addEventListener就能够实现对item的监听功能。

  <body><ul id="list"><li class="item">item1</li><li class="item">item2</li><li class="item">item3</li></ul><script>//没有事件委托的话,需要给每个item添加事件监听,这样是非常消耗资源的,性能比较低。// document.querySelectorAll(".item").forEach((item) => {//   item.addEventListener(//     "click",//     function (event) {//       console.log("item clicked");//     },//     true//   );// });document.getElementById("list").addEventListener("click",function (event) {if (event.target.tagName === "LI") {console.log("item 被点击了");}},false);</script></body>

事件委托有个缺点是没有索引,你可以通过父元素遍历定位拿到索引。或者,在生成元素的时候就自己添加一个索引属性。

相关文章:

关于事件捕获和事件冒泡的理解

我一直对事件捕获和事件冒泡是挺困惑的&#xff0c;好像理解了&#xff0c;但又感觉哪里不对。这篇文章打算深入探讨一些细节性的问题&#xff0c;更好的理解事件捕获和事件冒泡。 当我们点击的时候&#xff0c;浏览器的默认行为是怎么样的&#xff1f; 搞清楚这个非常的重要…...

如何使用HASH创建低交互式蜜罐系统

关于HASH HASH是一个用于创建和启动低交互蜜罐的框架&#xff0c;可以帮助广大研究人员轻松创建HTTP无关的低交互式软件蜜罐。 HASH 的主要理念是易于配置&#xff0c;能够灵活地模拟在 HTTP/HTTPs 上运行的任何软件。尽可能减少占用空间&#xff0c;避免被检测为蜜罐。 功能…...

vue3+vite+ts安装wangeditor富文本编辑器

需求: 实现粘贴,上传图片时本地渲染但并不实现上传功能,工具栏移除不需要的工具 安装方法看官网 安装 | wangEditor 封装子组件 wangEditor.vue <template><div><div style"border: 1px solid #ccc; margin-top: 10px"><Toolbar:editor&qu…...

PostIn教程-安装配置

PostIn是一款国产开源免费的接口管理工具&#xff0c;包含项目管理、接口调试、接口文档设计、接口数据MOCK等模块&#xff0c;支持常见的HTTP协议、websocket协议等&#xff0c;支持免登陆本地接口调试&#xff0c;同时可以对项目进行灵活的成员权限、消息通知管理等。 1、服务…...

SpringBoot读取配置优先级顺序是什么?

Spring Boot外部化配置详解 目录 引言Spring Boot外部化配置概述配置加载优先级配置加载顺序详解实际案例总结 引言 Spring Boot因其“开箱即用”的特性&#xff0c;极大地简化了Java应用的开发和部署过程。它通过外部化配置机制&#xff0c;允许开发者根据不同的环境&#x…...

群晖docker获取私有化镜像http: server gave HTTP response to HTTPS client].

群晖docker获取私有化镜像提示http: server gave HTTP response to HTTPS clien 问题描述 层级时间用户事件Information2023/07/08 12:47:45cxlogeAdd image from xx.xx.31.240:1923/go-gitea/gitea:1.19.3Error2023/07/08 12:47:48cxlogeFailed to pull image [Get "http…...

MySQL8【学习笔记】

第一章前提须知 1.1 需要学什么 Dbeaver 的基本使用SQL 语句&#xff1a;最重要的就是查询&#xff08;在实战的时候&#xff0c;你会发现我们做的绝大部分工作就是 “查询”&#xff09;MySQL 存储过程&#xff08;利用数据库底层提供的语言&#xff0c;去进行业务逻辑的封装…...

汇编实验·子程序设计

一、实验目的: 1.掌握汇编中子程序编写方法 2.掌握程序传递参数的基本方法,返回值的方法。 3.掌握理解子程序(函数)调用的过程 二、实验内容 1.编写汇编语言子程序,实现C表达式SUM=X+Y的功能,具体要求: 1)函数的参数传递采用寄存器实现 2)函数的参数传递采用堆栈…...

EDI安全:2025年数据保护与隐私威胁应对策略

在数字化转型的浪潮中&#xff0c;电子数据交换&#xff08;EDI&#xff09;已成为企业间信息传递的核心基础设施。然而&#xff0c;随着数据规模的指数级增长和网络威胁的日益复杂化&#xff0c;EDI安全正面临前所未有的挑战。展望2025年&#xff0c;企业如何构建一套全面、高…...

Cloudpods是一个开源的Golang实现的云原生的融合多云/混合云的云平台,也就是一个“云上之云”。

Cloudpods是一个开源的Golang实现的云原生的融合多云/混合云的云平台&#xff0c;也就是一个“云上之云”。Cloudpods不仅可以管理本地的虚拟机和物理机资源&#xff0c;还可以管理多个云平台和云账号。Cloudpods隐藏了这些异构基础设施资源的数据模型和API的差异&#xff0c;对…...

C++小病毒-1.0勒索

内容供学习使用,不得转卖,代码复制后请1小时内删除,此代码会危害计算机安全,谨慎操作 在C20环境下,并在虚拟机里运行此代码! #include <iostream> #include <windows.h> #include <shellapi.h> #include <stdio.h> #include <fstream> #include…...

MySQL入门(数据库、数据表、数据、字段的操作以及查询相关sql语法)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…...

AIGC视频扩散模型新星:Video 版本的SD模型

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细介绍慕尼黑大学携手 NVIDIA 等共同推出视频生成模型 Video LDMs。NVIDIA 在 AI 领域的卓越成就家喻户晓&#xff0c;而慕尼黑大学同样不容小觑&#xff0c;…...

08-ArcGIS For JavaScript-通过Mesh绘制几何体(Cylinder,Circle,Box,Pyramid)

目录 概述代码实现1、Mesh.createBox2、createPyramid3、Mesh.createSphere4、Mesh.createCylinder 完整代码 概述 对于三维场景而言&#xff0c;二位的点、线、面&#xff0c;三维的圆、立方体、圆柱等都是比较常见的三维对象&#xff0c;在ArcGIS For JavaScript中我们知道点…...

在 Go 语言中如何高效地处理集合

文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons&#xff1a;JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram&#xff0c;自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 &#xff1f; 5 IDEA必装的插件&…...

Python的进程和线程

ref 讲个故事先 这就像一个舞台&#xff08;CPU核心&#xff09;​&#xff0c; 要供多个剧组演出多个剧目&#xff08;进程&#xff09;​&#xff0c; 剧目中有多个各自独立的角色&#xff08;线程&#xff09;​&#xff0c;有跑龙套的&#xff0c;有主角&#xff0c;第一…...

基于单片机的智能台灯设计

摘要: 方向和亮度,采用的是手动调节。而对于儿童来说,他们通常不知道如何调整以及调整到何种程度。本文设计了一款智能台灯,当有人的 台灯是用于阅读学习而设计使用的灯,一般台灯用的灯泡是白炽灯、节能灯泡以及市面上流行的护眼台灯,可以调节高度、光照的时候,可以根据…...

vue3案例:筛选部门、选择人员案例组件

可以控制可以选多人&#xff0c;或者只能选单人可以做部门筛选再选人&#xff0c;没有部门情景&#xff0c;直接显示全部人员&#xff0c;有输入框可以搜索人员 ✨一、实现功能 需求&#xff1a; 可以灵活控制&#xff0c;多选或者单选人员配合部门进行部门下的人员筛选 详细…...

Spring MVC:综合练习 - 深刻理解前后端交互过程

目录 1. Lombok 1.1 引入 lombok 依赖 1.1.1 通过 Maven 仓库引 lombok 依赖 1.1.2 通过插件引入 lombok 依赖 1.2 Data 1.3 其他注解 2. 接口文档 2.1 接口(api) 2.2 接口文档 3. 综合练习 - 加法计算器 3.1 定义接口文档 3.2 准备工作 - 前端代码 3.3 后端代码 …...

Debian常用命令

以下是完整的 Linux 命令大全&#xff0c;适用于 Debian、Ubuntu 及其衍生系统&#xff0c;涵盖系统管理、文件操作、磁盘管理、用户管理、网络调试、安全、进程管理等多个方面。 目录 基本命令关机与重启文件和目录管理文件搜索挂载文件系统磁盘空间管理用户和群组管理文件和…...

【FFmpeg】FLV 格式分析 ③ ( Tag Body 数据块体结构 - Vedio Data 视频数据 )

文章目录 一、Tag Body 数据块体结构 - Video Data 视频数据1、Vedio Data 视频数据 类型标识2、Vedio Data 视频数据 结构分析3、Composition Time Offset 字段涉及的时间计算4、AVC Packet Type 字段说明① AVC Sequence Header 类型② AVC NALU 类型③ AVC End of Sequence …...

开源鸿蒙开发者社区记录

lava鸿蒙社区可提问 Laval社区 开源鸿蒙项目 OpenHarmony 开源鸿蒙开发者论坛 OpenHarmony 开源鸿蒙开发者论坛...

MinIO的安装与使用

目录 1、安装MinIO 1.1 下载 MinIO 可执行文件 1.2 检查 MinIO 是否安装成功 1.3 设置数据存储目录 1.4 配置环境变量&#xff08;可选&#xff09; 1.5 编写启动的脚本 1.6 开放端口 1.7 访问 2、项目实战 2.1 引入依赖 2.2 配置yml文件 2.3 编写Minio配置类 2.4…...

【分布式日志篇】从工具选型到实战部署:全面解析日志采集与管理路径

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…...

Spring Boot/MVC

一、Spring Boot的创建 1.Spring Boot简化Spring程序的开发,使用注解和配置的方式开发 springboot内置了tomact服务器 tomact:web服务器,默认端口号8080,所以访问程序使用8080 src/main/java:Java源代码 src/main/resource:静态资源或配置文件,存放前端代码(js,css,html) s…...

uni-app连接EventSource

前言 uniapp默认是不支持event-source&#xff0c;这里是借助renderjs进行SSE连接 正文 引入event-source-polyfill 这里演示的是直接将代码下载到本地进行引入 下载地址 把里面的eventsource.min.js文件放到项目中的static文件夹 项目封装event-source.vue组件 <templ…...

[SCTF2019]babyre

[SCTF2019]babyre 一、查壳 无壳&#xff0c;64位 二、IDA分析 1.没有main&#xff0c;那就shifef12 点击&#xff1a; 再进&#xff1a; 都是花指令&#xff0c;所以要先解决花指令 三、解决花指令&#xff0c;得到完整的 main 往上面翻&#xff0c;注意看爆红的&#x…...

简洁实用的wordpress外贸模板

简洁、实用、大气的wordpress外贸模板&#xff0c;适合跨境电商搭建外贸B2B产品展示型网站。 简洁实用的wordpress外贸模板 - 简站WordPress主题简洁、实用、大气的wordpress外贸模板&#xff0c;适合跨境电商搭建外贸B2B产品展示型网站。https://www.jianzhanpress.com/?p828…...

每日一题 414. 第三大的数

414. 第三大的数 简单 class Solution { public:int thirdMax(vector<int>& nums) {int n nums.size();long first , second,third;first second third LONG_MIN ;bool find false;for(auto num : nums){if(num > first){ third second;second first…...

TVM框架学习笔记

TVM是陈天齐等人一个开源的深度学习编译器栈,用于优化和部署机器学习模型到各种硬件后端。它支持多种前端框架,如TensorFlow、PyTorch、ONNX等,并且可以在不同的硬件平台上运行,包括CPU、GPU和专用加速器。官方文档: Apache TVM Documentation — tvm 0.20.dev0 documenta…...

Codeforces Round 998 (Div. 3)

文章目录 EF E 原题链接 思路&#xff1a; 题目要求对于 G 中存在路径的两个点&#xff0c;在 F 中也必须存在路径&#xff0c;不是两个点存在直连的边。 两个点存在路径&#xff0c;说明俩个点在同一个连通块。我们用并查集来维护图的连通块。 最终的要求就是把 F 的并查集通…...

Vue.js 渐进式增强:如何逐步为传统项目注入活力

Vue.js 是一个渐进式框架&#xff0c;这意味着你可以将它逐步引入到现有项目中&#xff0c;而无需彻底重构。渐进式增强特别适合那些已经在使用传统服务器渲染框架&#xff08;如 PHP、Django、Laravel&#xff09;的项目&#xff0c;为它们增加动态交互功能。本篇教程将介绍如…...

【算法】经典博弈论问题——巴什博弈 python

目录 前言巴什博弈(Bash Game)小试牛刀PN分析实战检验总结 前言 博弈类问题大致分为&#xff1a; 公平组合游戏、非公平组合游戏&#xff08;绝大多数的棋类游戏&#xff09;和 反常游戏 巴什博弈(Bash Game) 一共有n颗石子&#xff0c;两个人轮流拿&#xff0c;每次可以拿1~m颗…...

【技术洞察】2024科技绘卷:浪潮、突破、未来

涌动与突破 2024年&#xff0c;科技的浪潮汹涌澎湃&#xff0c;人工智能、量子计算、脑机接口等前沿技术如同璀璨星辰&#xff0c;方便了大家的日常生活&#xff0c;也照亮了人类未来的道路。这一年&#xff0c;科技的突破与创新不断刷新着人们对未来的想象。那么回顾2024年的科…...

【0x06】HCI_Authentication_Complete事件详解

目录 一、事件概述 二、事件格式及参数 2.1. HCI_Authentication_Complete事件格式 2.2. Status 2.3. Connection_Handle 三、事件的生成于处理 3.1. 事件生成 3.2. 认证流程 3.2.1. 发送认证请求 3.2.2. 处理流程 3.2.3. 示例代码 四、应用场景 4.1. 设备配对与连…...

JS-Web API -day03

一、事件流 1.1 事件流与两个阶段说明 事件流 指的是事件完整执行过程中的流动路径 假设页面有个div标签&#xff0c;当触发事件时&#xff0c;会经历两个阶段&#xff0c;分别是捕获阶段、冒泡阶段 捕获阶段&#xff1a;Document - Element html - Elementbody - Element div…...

电子应用设计方案103:智能家庭AI浴缸系统设计

智能家庭 AI 浴缸系统设计 一、引言 智能家庭 AI 浴缸系统旨在为用户提供更加舒适、便捷和个性化的沐浴体验&#xff0c;融合了人工智能技术和先进的水疗功能。 二、系统概述 1. 系统目标 - 实现水温、水位和水流的精确控制。 - 提供多种按摩模式和水疗功能。 - 具备智能清洁…...

linux静态库+嵌套makefile

linux静态库嵌套makefile 文章目录 linux静态库嵌套makefile1、概述2、代码结构3、代码1&#xff09;main.c2&#xff09;主makefile3&#xff09;fun.c4&#xff09;func.h5&#xff09;静态库makefile 4、运行效果1&#xff09;在main.c目录下执行make2&#xff09;到output目…...

AIP-127 HTTP和gRPC转码

编号127原文链接AIP-127: HTTP and gRPC Transcoding状态批准创建日期2019-08-22更新日期2019-08-22 遵守面向资源设计的API使用RPC进行定义&#xff0c;但面向资源设计框架允许这些API表现为整体上符合REST/JSON约定的接口。这一点很重要&#xff0c;可以帮助开发者利用现有知…...

代码随想录算法训练营day32

代码随想录算法训练营 —day32 文章目录 代码随想录算法训练营前言一、动态规划理论基础二、509. 斐波那契数动态规划动态规划优化空间版递归法 三、70. 爬楼梯动态规划动态规划空间优化 746. 使用最小花费爬楼梯动态规划空间优化 总结 前言 今天是算法营的第32天&#xff0c…...

设计模式的艺术-开闭原则

原则使用频率图&#xff08;仅供参考&#xff09; 1.如何理解开闭原则 简单来说&#xff0c;开闭原则指的是 “对扩展开放&#xff0c;对修改关闭”。 当软件系统需要增加新的功能时&#xff0c;应该通过扩展现有代码的方式来实现&#xff0c;而不是去修改已有的代码。 例如我…...

【易康eCognition实验教程】003:点云数据加载浏览与操作详解

文章目录 一、加载并创建点云数据二、三维浏览1. 点云模式2. 点云视图设置 三、使用点云 一、加载并创建点云数据 本实验点云数据位于专栏配套实验数据包中的data003.rar中的terrian.las&#xff0c;解压后进行以下实验操作。 打开ecognition软件&#xff0c;点击【File】→【…...

海外雅思备考经验

1.18号斯图雅思考试 第一次考雅思&#xff0c;第一次在国外考雅思&#xff01; 最近在德国斯图加特联培&#xff0c;报考了1月18号的雅思机考&#xff0c;下面分享一些考试经验. ✌️考试地点 EZ Plus WEST Hasenbergstr. 31/1,, in the backyard of Hasenbergstrae 31, Stuttg…...

Oracle之Merge into函数使用

Merge into函数为Oracle 9i添加的语法&#xff0c;用来合并update和insert语句。所以也经常用于update语句的查询优化&#xff1a; 一、语法格式&#xff1a; merge into A using B on (A.a B.a) --注意on后面带括号&#xff0c;且不能更新join的字段 when matched then upd…...

Spring Boot 自定义属性

Spring Boot 自定义属性 在 Spring Boot 应用程序中&#xff0c;application.yml 是一个常用的配置文件格式。它允许我们以层次化的方式组织配置信息&#xff0c;并且比传统的 .properties 文件更加直观。 本文将介绍如何在 Spring Boot 中读取和使用 application.yml 中的配…...

前端面试题-问答篇-5万字!

1. 请描述CSS中的层叠&#xff08;Cascade&#xff09;和继承&#xff08;Inheritance&#xff09;规则&#xff0c;以及它们在实际开发中的应用。 在CSS中&#xff0c;层叠&#xff08;Cascade&#xff09;和继承&#xff08;Inheritance&#xff09;是两个关键的规则&#x…...

2025年1月21日(树莓派点亮呼吸灯第一次修改)

系统信息&#xff1a; Raspberry Pi Zero 2W 系统版本&#xff1a; 2024-10-22-raspios-bullseye-armhf Python 版本&#xff1a;Python 3.9.2 已安装 pip3 支持拍摄 1080p 30 (1092*1080), 720p 60 (1280*720), 60/90 (640*480) 已安装 vim 已安装 git 学习目标&#xff1a;…...

【Linux网络编程】传输层协议

目录 一&#xff0c;传输层的介绍 二&#xff0c;UDP协议 2-1&#xff0c;UDP的特点 2-2&#xff0c;UDP协议端格式 三&#xff0c;TCP协议 3-1&#xff0c;TCP报文格式 3-2&#xff0c;TCP三次握手 3-3&#xff0c;TCP四次挥手 3-4&#xff0c;滑动窗口 3-5&#xf…...

JavaScript系列(41)--状态管理实现详解

JavaScript状态管理实现详解 &#x1f504; 今天&#xff0c;让我们深入探讨JavaScript的状态管理实现。状态管理是现代前端应用中的核心概念&#xff0c;它帮助我们有效地管理和同步应用数据。 状态管理基础概念 &#x1f31f; &#x1f4a1; 小知识&#xff1a;状态管理是一…...

flume和kafka整合 flume和kafka为什么一起用?

‌Flume和Kafka一起使用的主要原因是为了实现高效、可靠的数据采集和实时处理。‌‌12 实时流式日志处理的需求 Flume和Kafka结合使用的主要目的是为了完成实时流式的日志处理。Flume负责数据的采集和传输,而Kafka则作为消息缓存队列,能够有效地缓冲数据,防止数据堆积或丢…...