JS 基础篇(六):事件冒泡与捕获

JavaScript——事件捕获和事件冒泡 JavaScript中事件捕获和事件冒泡的来由以及具体讲解,阻止事件捕获和冒泡(事件传播)的方法。 阅读详情

目录:

一、事件冒泡

微软提出了名为事件冒泡(event bubbling)的事件流。事件冒泡可以形象地比喻为把一颗石头投入水中,泡泡会一直从水底冒出水面。也就是说,事件会从最内层的元素开始发生,一直向上传播,直到document对象。

<html>
    <body>
        <div id="outer">
            <p id="inner">Click me!</p>
        </div>
    </body>
</html>

在事件冒泡的概念下在p元素上发生click事件的顺序应该是p -> div -> body -> html -> document。
即如果p元素上绑定了click的处理事件将先被触发否则将冒泡到div,在div上如果绑定了click的处理事件将被触发否则将冒泡到body,以此类推,判断是否有click事件的处理函数,有就触发,没有就冒泡到上一级直到到达document级。

示例:

<div id="s1">s1
    <div id="s2">s2</div>
</div>
<script>
    s1.addEventListener("click",function(e){
        console.log("s1 冒泡事件");
    },false);
    s2.addEventListener("click",function(e){
        console.log("s2 冒泡事件");
    },false);
</script>

//点击s2:
//s2 冒泡事件
//s1 冒泡事件

//点击s1:
//s1 冒泡事件
二、事件捕获

网景提出另一种事件流名为事件捕获(event capturing)。与事件冒泡相反,事件会从最外层开始发生,直到最具体的元素。

<html>
    <body>
        <div id="outer">
            <p id="inner">Click me!</p>
        </div>
    </body>
</html>

在事件捕获的概念下在p元素上发生click事件的顺序应该是document -> html -> body -> div -> p

即如果document元素上绑定了click的处理事件将先被触发否则将进入到html中,在html上如果绑定了click的处理事件将被触发否则将进入到body中,以此类推,判断是否有click事件的处理函数,有就触发,没有就进入到下一级直到到达到触发元素那一级。

示例:

<div id="s1">s1
    <div id="s2">s2</div>
</div>
<script>
    s1.addEventListener("click",function(e){
        console.log("s1 捕获事件");
    },true);
    s2.addEventListener("click",function(e){
        console.log("s2 捕获事件");
    },true);
</script>

//点击s2:
//s1 捕获事件
//s2 捕获事件

//点击s1:
//s1 捕获事件
三、addEventListener的第三个参数

在上面的案例中,我们对addEventListener的第三个参数进行了设置,下面将介绍下addEventListener函数第三个参数的含义。addEventListener的第三个参数就是为冒泡和捕获准备的.

addEventListener有三个参数:

element.addEventListener(event, function, useCapture)
  • 第一个参数是需要绑定的事件
  • 第二个参数是触发事件后要执行的函数
  • 第三个参数默认值是false,表示在事件冒泡阶段调用事件处理函数;如果参数为true,则表示在事件捕获阶段调用处理函数。
四、事件冒泡与事件捕获同时存在

当事件捕获和事件冒泡一起存在的情况,事件又是如何触发呢。

这里记被点击的DOM节点为target节点:

1、document 往 target节点,捕获前进,遇到注册的捕获事件立即触发执行
2、到达target节点,触发事件(对于target节点上,是先捕获还是先冒泡则捕获事件和冒泡事件的注册顺序,先注册先执行)
3、target节点 往 document 方向,冒泡前进,遇到注册的冒泡事件立即触发

示例:

//对于非target节点则先执行捕获在执行冒泡
//对于target节点则是先执行先注册的事件,无论冒泡还是捕获
<div id="s1">s1
    <div id="s2">s2</div>
</div>
<script>
s1.addEventListener("click",function(e){
        console.log("s1 冒泡事件");         
},false);
s2.addEventListener("click",function(e){
        console.log("s2 冒泡事件");
},false);
        
s1.addEventListener("click",function(e){
        console.log("s1 捕获事件");
},true);
        
s2.addEventListener("click",function(e){
        console.log("s2 捕获事件");
},true);
</script>

点击s2,执行结果如下:
s1 捕获事件
s2 冒泡事件
s2 捕获事件
s1 冒泡事件

分析:
点击s2,click事件从document->html->body->s1->s2(捕获前进)
这里在s1上发现了捕获注册事件,则输出"s1 捕获事件"
到达s2,已经到达目的节点,
s2上注册了冒泡和捕获事件,先注册的冒泡后注册的捕获,则先执行冒泡,输出"s2 冒泡事件"
再在s2上执行后注册的事件,即捕获事件,输出"s2 捕获事件"
下面进入冒泡阶段,按照s2->s1->body->html->documen(冒泡前进)
在s1上发现了冒泡事件,则输出"s1 冒泡事件"

五、如何阻止事件冒泡或者事件捕获

以冒泡事件为例:

1、通过event.stopPropagation()终止事件传播
对某一个节点而言,如果不想它现在处理的事件继续往上冒泡的话,我们可以终止冒泡,即在相应的处理函数内,加入event.stopPropagation(),终止事件的广播分发,这样事件停留在本节点,不会再往外传播了。

<div id="s1">s1
    <div id="s2">s2</div>
</div>

s1.addEventListener("click",function(e){
    console.log("s1 冒泡事件");
},false);
s2.addEventListener("click",function(e){
    e.stopPropagation(); //阻止冒泡到上面元素,冒泡链在此处中断
    console.log("s2 冒泡事件");
},false);

//原先点击s2:
//s2 冒泡事件
//s1 冒泡事件

//阻止冒泡后点击s2:
//s2 冒泡事件

2、对触发事件元素进行过滤

事件包含最初触发事件的节点引用 和 绑定处理事件节点的引用,那如果节点只处理自己触发的事件即可,不是自己产生的事件不处理。
event.target指向的是触发事件的dom节点,而event.currrentTarget 指向的是绑定事件的dom节点,我们可以通过这两个target 是否相等,让绑定事件的dom节点只处理其自身触发的事件而不是下级冒泡传递上来的。

s1.addEventListener("click",function(event){
    if(event.target === event.currentTarget){
        console.log("s1 冒泡事件");
    }
},false);
s2.addEventListener("click",function(event){
    if(event.target === event.currentTarget){
        console.log("s2 冒泡事件");
    }
},false);

我们还可以获取target的节点名、id等属性进行过滤设置处理事件。

<ul id="color-list">
    <li>red</li>
    <li>yellow</li>
    <li>blue</li>
    <li>green</li>
    <li>black</li>
    <li>white</li>
</ul>

var color_list = document.getElementById('color-list');
color_list.addEventListener('click',showColor,false);
function showColor(e){
    var x = e.target;
    if(x.nodeName.toLowerCase() === 'li'){
        console.log('The color is ' + x.innerHTML);
    }
}

元素收到事件后,判断事件是否符合要求,然后做相应的处理,然后事件继续冒泡往上传递;
通过以上方式,我们把本来每个元素都要有的处理函数,都交给了其祖父节点元素来完成了,也就是说,li将自己的响应逻辑委托给ul,让它来完成相应逻辑,自己不实现相应逻辑,这个模式,就是所谓的事件委托。

(2-2-2)位置控制算法:常用的位置控制算法(2) 例如下面是一个使用滑模控制算法实现机器人位置控制的例子,在该例子中,假设机器人在一维空间中移动,目标是使机器人的位置迅速、鲁棒地达到设定的目标位置。自适应控制算法通过实时地调整控制器参数,可以适应系统的变化,从而提高系统的鲁棒性和性能。模型预测控制(Model Predictive Control,MPC)是一种先进的控制策略,通常应用于动态系统,以实现对系统状态的优化控制。(6)迭代优化:随着时间推移,MPC迭代执行上述步骤,持续优化控制输入,以适应系统动态和外部扰动,实现对系统状态的稳健控制。 阅读详情

相关推荐

WSL子系统启动报错 Wsl/Service/CreateInstance/CreateVm/HCS_E_SERVICE_NOT_AVAILABLE

WSL子系统启动报错 :Wsl/Service/CreateInstance/CreateVm/HCS_E_SERVICE_NOT_AVAILABLE 于是分析原因,最终发现是Windows功能中的虚拟机平台功能不知道什么时候被取消了。

Linux I Tell U 6万+

冒泡与捕获

冒泡事件与捕获事件,以及阻止冒泡事件 阻止默认

WYF857446152的博客 5761

深入解析fio Benchmark测试:从源码到实践

本文深入解析fio Benchmark测试工具,从入门指南到源码架构分析,详细介绍了其核心模块、关键数据结构和I/O处理机制。通过实战案例展示如何优化存储性能测试,包括内存对齐、多线程调优等技巧,帮助开发者充分利用fio进行精准的存储性能评估。

weixin_42563415的博客 207

在前端中常见的冒泡和捕获

2、那么捕获是指我们事件触发时,从祖先元素逐级传递到子元素上,在开发的过程中可以通过将监听器绑定到祖先元素中来进行事件传递之前对于全局的一个处理。1、冒泡是指我们当前事件触发时的,该事件会进行逐级向上传递到祖先元素上,一直达到我们文档流中的根节点上。这个事件流的模型的执行顺序是先通过捕获阶段,后通过目标阶段,再执行冒泡阶段。常用于事事件委托,在父元素上监听子元素的事件,从而减少事件监听的数量,提高性能。那么在事件传播的过程中会触发每一个经过的元素上绑定的监听器。冒泡是默认的事件传播方式,除非特别的指定。

wangzhen12138的博客 191

项目方案:社会视频资源整合接入汇聚系统解决方案(五)

视频监控接入和视频汇聚平台,形成整合平台,平台服务层包括编码设备、存储设备、解码设备等的接入服务,提供基础视频服务、传输服务、存储服务、控制服务及事件服务。两种不同的接入方式:监控设备接入,是指接入社会单位视频监控系统的DVR(数字硬盘录像机)、DVS和IPC、DVR/NVR、CVR等设备;平台对接,是指对接接入社会单位数字视频监控平台。AS-VAG视频监控接入网关支持onvif、国标等接入,也支持多种SDK接入方式,包括国产的主流品牌支持海康、大华、宇视、华为等SDK,国际品牌支持松下和axis等SDK。

weixin_70208651的博客 2464

ubuntu20.04开机黑屏卡在/dev/sda1:clean,***files,***blocks,解决心得记录

这个问题如果你百度,会发现目前有很多种解决方法。 有更新显卡驱动的,有卸载上一次安装软件的,还有各种奇奇怪怪的故障原因。 如果你是属于上述情况,那么按照百度和论坛的各种指引操作一般都能解决。 但我这里主要说一种特殊情况,就是我什么也没有操作,我什么也没干。就是正常使用系统关了机突然就报错了。 这也是自己亲自遇到的问题,做个小记录方便以后自己回顾。 上一次出现这种情况我重装系统了,这次用了两个月又出现了,重装成本太高,我接受不了,于是找到解决办法。 首先找个终端进入,进入终端的方法很多,用安装u盘

qq_41517017的博客 2万+

前端面试之事件捕获、时间冒泡总结

1、DOM 事件流 以程序的角度说,流是具有方向的数据。 事件流所描述的就是从页面中接受事件的顺序。 事件捕获:它认为当某个事件发生时,父元素应该更早接收到事件,具体元素则最后接收到事件。 事件冒泡:事件冒泡即事件开始时,由最具体的元素接收(也就是事件发生所在的节点),然后逐级传播到较为不具体的节点。 DOM事件流包括三个阶段: 事件捕获阶段:事件从最上一级标签开始往下

汤又歌的私人博客 4632

USB通讯速度翻倍秘诀:手把手教你用WinUsb替代HID协议(附Zadig驱动配置图解)

本文详细介绍了如何通过WinUsb技术替代传统HID协议,实现USB通讯速度的显著提升。从技术对比、实现原理到Zadig驱动配置图解,手把手教你完成免驱高速通讯方案,适用于数据采集、固件升级等场景,实测速度可达HID协议的2倍以上。

weixin_29168675的博客 133

js、vue事件捕获、事件冒泡说明与使用

概念理解 1、事件捕获(event capturing) 事件从顶层(window对象)开始触发到被点击的精确元素事件触发的过程 2、事件冒泡 事件从点击元素事件触发到顶层对象事件触发的顺序触发过程 3、流程图说明 简单的来说,捕获:一个自顶层元素向最里层元素(HTML代码为包裹的形式的)执行事件的方式;冒泡:从最里层元素向最外层元素触发事件。 代码说明 1、普通方式,默认冒泡,先执行里层,再执行外层 2、阻止冒泡e.stopPropagation(),事件不再向上传递..

劲枫的博客 1862

052、联发科Imagiq HyperEngine架构适配:天玑9000/9200的ISP多核并行调度与Tuning Toolkit调优案例

摘要: 项目组在适配联发科天玑9200的Imagiq 890 ISP架构时,遇到多摄预览功耗过高、帧率不稳等问题。通过分析多核调度机制,调整辅核QoS通道、优化AI-ISP协同模式(采用FREERUN+运动补偿),并利用Tuning Toolkit的Pipeline Viewer动态分配负载,最终降低功耗30mA、提升画质。关键经验包括:避免多核带宽冲突、合理配置动态时钟策略,以及统一校准参数版本管理。天玑9000/9200的HyperEngine架构需优先理解多核协同逻辑,再针对性调优,否则易引发场景兼容

zzfmlxs的博客 36

linux系统下XDMA驱动的安装与测试问题总结

先看两个常见的问题。一个是驱动安装问题,一个是驱动测试错误;error 512 能识别PCIE的设备,但是The kernel modle installed correctly, but no devices were recognized.

whm128的博客 3802

【JavaScript】十六、事件捕获和事件冒泡

此时,点击红色的儿子元素部分,因为红色部分也属于绿色的父亲div,更属于整个document,所以三个点击事件都触发,但因为现在addEventListener是true,所以,是事件捕获,从document到父div再到子div,因此,效果是:弹窗依次从父元素到子元素。对比给div绑定一个点击事件,当事件被触发时:会经历两个阶段,分别是捕获阶段、冒泡阶段,事件流则指的是事件完整执行过程中的这个流动路径。事件冒泡🫧:当一个元素的事件被触发时,同样的事件将会在该元素的所有祖先元素中依次被触发。

llg___的博客 1747

【毕设救星】从0到1打造YOLOv8货架商品检测与可视化系统,让你的毕设脱颖而出

本文介绍了一个基于YOLOv8的货架商品检测系统毕设项目。系统采用YOLOv8模型进行商品检测,包含环境搭建、数据集准备、模型训练与验证等完整流程,并开发了可视化UI界面。项目聚焦智能零售应用场景,技术栈完整且易于实现,适合作为计算机视觉方向的毕业设计。文章详细指导了从数据标注、模型训练到界面开发的全过程,提供代码示例和实用建议,帮助学生快速完成毕设并提升答辩表现。

LXY_LOVE36的博客 103

PCA9422与MK20DX128电源协同设计:嵌入式低功耗系统实战指南

电源管理单元(PMU)是嵌入式系统实现超低功耗的核心组件,其本质是通过硬件状态机实现多电压域的时序可控、故障自愈与唤醒仲裁。相比传统LDO或DC-DC方案,集成化PMU如PCA9422将电源策略软件化,支持动态调压、RTC备用供电、VBAT路径管理及微秒级上电时序控制,显著提升电池寿命与系统鲁棒性。在Cortex-M4架构(如MK20DX128VFM5)中,PMU不再仅是外围器件,而是与MCU深度耦合的‘电源协处理器’,需通过I²C寄存器配置电压轨、唤醒源与状态转换逻辑。本文聚焦PCA9422与K20的协同

weixin_33796177的博客 171

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

js 事件冒泡和事件捕获

一块: 事件流描述的是从页面接收事件的顺序。  IE的事件是冒泡事件流,  而firefox的事件流是捕获事件流。  1.事件冒泡  IE的事件流叫做事件冒泡,即事件从最具体的元素到不具体的元素。  好比气泡从水底下一直向上冒泡,像dom树一样,一直到根元素。  2.事件捕获  即从不具体的元素到具体的元素 事件传递有两种方式:冒泡与捕获。 事件传递定义了元素事件触发的顺序。 如果你将 &l...

前端技术的学习整理 2万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

js事件委托,事件冒泡及捕获

js事件委托,事件冒泡及捕获事件冒泡事件捕获事件委托阻止冒泡 事件冒泡 事件冒泡:事件冒泡会从当前触发的事件目标一级一级往上传递,依次触发,直到document为止。 事件捕获:事件捕获会从document开始触发,一级一级往下传递,依次触发,直到真正事件目标为止。 以下示例:创建三个div , 给每一个div添加事件,(利用事件监听添加点击事件,第三个参数是布尔值,默认false,false是事...

weixin_45021098的博客 3630

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

js中的事件冒泡与事件捕获

js中的事件冒泡与事件捕获。当点击黑色容器时,开始进行事件捕获,Js事件流从window上往事件触发处传播,遇到注册的捕获事件就会触发;但是捕获阶段默认是不处理的(addEventListener第三个参数默认是false),紧接着传播到事件触发处,触发注册的事件,打印div3,然后进行冒泡阶段从事件触发处 往window上传播,遇到注册的冒泡事件会触发,打印div2,再打印div1。就是因为点击了盒子的子元素(黄色和红色部分),事件冒泡到了绑定拖拽事件的父元素身上(蓝色部分),导致触发的是拖拽效果。

~~~ 3909

[ 前端JavaScript的事件流机制 ] - 捕获、冒泡及委托

本文是撰写的内容是对于JavaScript事件流机制的解析,详细阐述了包括事件捕获、冒泡以及事件委托在内的事件流重点内容,不论是对于要为面试做准备还是想要深入的复习一下JS的知识的小伙伴,希望这篇文章都能帮助到你!

lxs1660275788的博客 1248

JavaScript 事件处理模型:冒泡&捕获

JS事件处理模型:(1)事件冒泡:结构上(非视觉上)嵌套关系的元素,会存在事件冒泡的功能,即同一事件,自子元素冒泡向父元素即自底向上。(2)事件捕获:结构上(非视觉上)嵌套关系的元素,会存在事件捕获的功能,即同一事件,自父元素捕获至子元素即自顶向下。(3)一个对象的一个事件类型绑定一个处理函数只能遵循一个事件模型,但是若一个对象的一个事件类型绑定两个处理函数,那么触发顺序:先捕获,后冒泡。(4)取消冒泡。(5)阻止默认事件: 默认事件为浏览器通过HTML标签或DOM元素提供的一些功能性的性的默认行为。

Yuki_yuhan的博客 2827

JavaScript 事件机制详解:冒泡、捕获与委托

JavaScript事件流包含捕获、目标和冒泡三个阶段。addEventListener的第三个参数控制事件触发阶段(false为冒泡,true为捕获)。事件冒泡从最具体元素向上传播,事件捕获则相反。事件委托利用冒泡机制,将监听器绑定到父元素而非每个子元素,提高性能并支持动态元素。可通过stopPropagation等方法阻止事件传播。理解这些机制有助于优化事件处理,编写高效代码。

qq_44919431的博客 1573

深入理解JavaScript的事件冒泡与事件捕获

JavaScript中提供了很多操作DOM的API。事件冒泡和事件捕获是指浏览器中处理DOM元素上事件的两种不同方式。事件冒泡和事件捕获都是JavaScript事件模型中的一部分,可以用来处理事件。对于这个问题,在实际开发中,并不是非常重要,因为在工作中我们基本上不会直接操作DOM,为了高效一般都是通过Vue、React这些框架,所以关于事件处理程序的一些坑直接就被避免了!!!但是,多了解一点是没有坏处的,毕竟面试会考~

金鳞踏雨 5699

JS事件冒泡与捕获

什么是冒泡与捕获 以click点击事件为例。假如我们有一个多层结构标签。如下图,是4个div嵌套。每个div都有点击的监听事件,分别输出1234。当我们点击最里面的div时,点击事件开始传递,传递的全过程是1-2-3-4-4-3-2-1。 前半部分,事件从最外面的父div依次传递到最里面的后代div,1-2-3-4这部分我们叫捕获过程。 之后事件又从最里层的后代div逐层传出,4-3-2-1这部分我们叫冒泡过程。 如果我把捕获监听器和冒泡监听器都加上,如下图这样。 这时我们有8个监听器了,在捕获过程

光脚丫思考的专栏 1万+

js事件冒泡和事件捕获

事件冒泡和事件捕获分别由微软和网景公司提出,这两个概念都是为了解决页面中事件流(事件发生顺序)的问题。 <div id="outer"> <p id="inner">Click me!</p> </div> 上面的代码中一个div元素中有一个p子元素,如果两个元素都有一个click的处理函数,那么我们怎么才能知道哪一个函数首先被触发呢? 为了解决这个问题,微软和网景提出了两种完全相反的概念。 1.事件冒泡 微软提出了名为事件冒泡的事件流。这个事件流是

qq_45149366的博客 5557

JavaScript事件机制详解:捕获、冒泡与事件委托

本章讲述了什么是事件机制,如何利用好JavaScript中的事件机制

2403_86719076的博客 1628

Js事件执行顺序,冒泡、捕获

Js事件执行顺序,冒泡、捕获 先绑定先执行,先捕获后冒泡

前端小白的逆袭 3590

Javascript的事件捕获和事件冒泡

我们在外层div和内层div的onclick事件上都绑定了方法,打开浏览器试试。当我们点击外层绿色部分,外层div的事件响应了;让我们点击内层蓝色部分,内层div的事件先响应,然后外层div的事件再响应。所以我们很容易得出结论,浏览器是先找到当前被点击的元素,如果该元素上注册了onclick事件则响应;然后浏览器继续寻找被点击元素的父元素,如果其也注册了onclick事件,则该事件也响应,然后再继续向上层寻找。这就是JS的事件冒泡机制。

2501_90424610的博客 1131
上一篇: JS 基础篇(五):JS严格模式
下一篇: jQuery Validation插件问题
madman0621
博客等级 码龄11年 36粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值