笔记-事件的捕获和冒泡

js事件机制----捕获与冒泡机制实例分析 主要介绍了js事件机制----捕获与冒泡机制,结合实例形式分析了js事件机制中捕获与冒泡机制相关原理、操作技巧与注意事项,需要的朋友可以参考下 立即下载

一、事件、事件监听函数、事件对象

首先,我们明确一下事件、事件监听函数、事件对象,这三个概念之间的关系。

(1)事件,就是发生了什么事,比如点击事件、文本框输入事件、ajax成功返回事件等。
(2)事件监听函数,是在事件发生时我们想执行的代码,是我们在事件上挂的钩子。
(3)事件对象,是对事件的描述对象,就是我们熟悉的那个“e”。每个事件发生时,事件对象都会作为一个参数,被传入事件监听函数。浏览器原生提供一个Event对象,每个事件对象,都是Event的一个实例。并且除了事件发生时自动生成的那个“e”,我们还可以通过 new Event(type, options),来自己生成一个事件对象。

二、事件的捕获和冒泡

你可能会奇怪,为什么会有捕获和冒泡这种东西,搞得这么复杂?

当你点击页面上的一个按钮,你可以说你点击了按钮,但也可以说,你点击了包着它的div,你点击了这个页面,甚至你点击了window,你都挑不出毛病来,因为确实如此。那怎么办呢?

浏览器设计了这样一个事件模型:当你点击一个按钮时,事件从最外层的window,一层层的往下传播,直到这个按钮,这个过程称为捕获。然后再回去,从这个按钮开始,一层层的往上传播,直到最外层的window,这个过程被称为冒泡。

捕获阶段,从window开始,到目标节点结束。冒泡阶段,从目标节点开始,到window结束。

比如我们点击了div中的一个span标签。事件在页面上是这么传播的:

页面上的任何一个点击,都会以这样一个“U型”在页面上传播一遍。除非你阻止了传播,或者这个事件本身不冒泡。(这个我们后面再谈)

事件监听函数,就是我们在这个路径上挂的钩子。你在路径的哪个位置挂钩子,事件传播到这儿时,就会触发监听函数。
三、事件对象的bubbles属性

事件对象,有一个bubbles属性,意思是该事件是否冒泡。

这是什么意思呢?因为不是所有事件都会冒泡的。有些会冒泡,比如click、mouseover,有些是不冒泡的,比如blur、mouseenter。我们可以通过 e.bubbles 来看这个事件是否冒泡。

new Event(type, options) 的第二个参数,也可以配置bubbles这个属性,不传的话默认值是false。默认值为false的意思是说,用构造函数自定义的事件对象,默认是一个不冒泡的事件。

而我们知道,addEventListener的第三个参数,false是冒泡,true是捕获。它的意思其实是,把这个钩子挂在捕获阶段还是冒泡阶段。

这儿我就产生了疑问,如果bubbles属性也是这么个逻辑,一个事件要么冒泡要么捕获。那为什么,我们在捕获和冒泡阶段挂的监听函数,都会执行呢?

有疑问,就自己试验一下:

let div = document.querySelector('div');
let span = document.querySelector('span');

div.addEventListener('click', function(e) {
    console.log('div冒泡');
}, false);
div.addEventListener('click', function(e) {
    console.log('div捕获');
}, true);

let e = new Event('click', { bubbles: false });
span.dispatchEvent(e); // 我们可以自己触发事件监听函数,就像jquery那样。这个函数需要的参数,就是一个Event对象。我想这也就是Event构造函数的主要用处。

// 输出结果:
// div捕获

当bubbules为false,就是说不冒泡时,只有捕获阶段的钩子被触发了。

然后我把bubbles改为true,再试一次。

let div = document.querySelector('div');
let span = document.querySelector('span');

div.addEventListener('click', function(e) {
    console.log('div冒泡');
}, false);
div.addEventListener('click', function(e) {
    console.log('div捕获');
}, true);

let e = new Event('click', { bubbles: true });
span.dispatchEvent(e);

// 输出结果:
// div捕获
// div冒泡

捕获和冒泡阶段的钩子,都被触发了。

就是说,bubbles属性的逻辑是:false时事件只捕获不传播,true时事件同时捕获和传播。这下就解释通了,为什么我们平时捕获和冒泡阶段挂的钩子都能触发了。

四、事件的阶段

事件对象还有一个属性:eventPhase,表示该监听函数被触发时,事件正处在传播过程的哪个阶段。这个值从0到3,分别指事件没有发生、捕获阶段、目标阶段、冒泡阶段。

在捕获阶段和冒泡阶段中间,还有一个目标阶段。事件传播的过程,来的路上都是捕获阶段,到达了目标节点是目标阶段,去的路上都是冒泡阶段。
let div = document.querySelector(‘div’);
let span = document.querySelector(‘span’);

let jieduan = ['没有发生', '捕获阶段', '目标阶段', '冒泡阶段'];

div.addEventListener('click', function(e) {
    console.log(e.currentTarget.tagName, jieduan[e.eventPhase]);
}, false);
div.addEventListener('click', function(e) {
    console.log(e.currentTarget.tagName, jieduan[e.eventPhase]);
}, true);
span.addEventListener('click', function(e) {
    console.log(e.currentTarget.tagName, jieduan[e.eventPhase]);
}, false);
span.addEventListener('click', function(e) {
    console.log(e.currentTarget.tagName, jieduan[e.eventPhase]);
}, true);

// 输出结果:
// DIV 捕获阶段
// SPAN 目标阶段
// SPAN 目标阶段
// DIV 冒泡阶段

浏览器总是把最里面、最具体的那个元素,作为事件的目标元素。是否处于目标阶段,可以用来判断,事件是否是元素自身触发的,而不是来自其内部节点的冒泡或捕获。

判断事件是否由元素自身触发,更常用的是:e.currentTarget==e.target。

五、阻止事件的传播

在事件传播U型的任何一个钩子上,我们都可以阻止事件的继续传播,只需要调用:e.stopPropagation(),事件就不会再继续传播。

比如我们执行以下代码:

window.addEventListener(‘click’, function(e) {
e.stopPropagation();
}, true);

那么这个页面上所有的点击事件监听函数,都被屏蔽掉了。

注意,屏蔽的只是挂载的事件监听函数,而不是事件的默认行为。比如你点击一个链接,还是会跳转的。
六、我们如何应用?

(1)对捕获和冒泡最常见的应用,是通过 e.currentTargete.target 或者 e.eventPhase2 判断事件的触发源是不是元素自身。vue的.self事件修饰符,也是这个原理。

比如我们可以用这个,点击空白处关闭页面蒙层。

(2)有些页面较为复杂,无法通过简单的判断触发源是否是元素自身,来满足我们对点击位置的要求。

比如有个场景是:除了页面上的两处位置,点击页面其他位置,就执行一个函数。

这个时候你可以在这两个元素的捕获阶段钩子上,阻止点击的继续传播。然后在window的点击事件上,执行你想要的操作。这样点击这两个元素时,事件就不会冒泡到window上,而不影响点击其他区域。

(3)事件代理。比如一个列表,因为点击事件会冒泡,我们可以把原先在每个

  • 上绑定事件,改为只在
    • 上绑定。这样减少了很多页面的事件绑定,可以很好的优化页面性能。
  • 你还知道哪些对于捕获和冒泡的应用,告诉我吧。

偏差平方和说明什么_共同方法偏差检验之潜在误差变量控制法的Amos操作 潜在误差变量控制法是在结构方程模型中,将共同方法偏差作为一个潜变量加入模型,如果在包含方法偏差潜变量情况下模型的显著拟合度优于不包含共同方法偏差潜变量的情况,那么共同方法偏差效应就得到了检验,包含共同方法偏差潜在变量的模型,对于预测与效标变量关系的估计则控制了共同方法偏差。具体操作如下:因为这个过程也是基于因子分析的基础上进行的,关于绘制模型以及运行等过程不再介绍,请参考前面关于“合成信度 ”的相... 阅读详情

相关推荐

计算机毕业设计springboot股票模拟交易系统的设计与实现u6m959【附源码+数据库+部署+LW】

选题背景: 随着互联网和金融科技的快速发展,股票市场成为了吸引人们关注和参与的重要领域之一。越来越多的人开始对股票投资感兴趣,希望通过交易股票来获取收益。然而,对于初学者来说,股票市场的复杂性和风险往往让他们望而却步。因此,设计和实现一个股票模拟交易系统,可以帮助初学者更好地理解和掌握股票交易的规则和技巧,提高他们的投资决策能力。 意义: 股票模拟交易系统的设计与实现具有以下几个重要意义: 提供实践机会:股票模拟交易系统为投资者提供了一个实践的平台,使他们能够在真实市场环境下进行模拟交易,了解股票市场的

gp12081的博客 1760

事件流(捕获+冒泡+委托)

关于 捕获+冒泡+委托 的内容

qq_50260510的博客 1251

PLC作为Modbus TCP客户端

PLC作为Modbus TCP客户端,Modbus Slave作为服务器

soledad_chao的博客 4378

冒泡与捕获

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

WYF857446152的博客 5761

金融行业软件测试面试题(含答案)

6、假如发现了一个BUG,跟开发本身没什么关系,涉及到理念,需求问题,如何解决?11、假如要你测试6个月期限的p2p借款产品,你应该怎么设计案例,说出测试点。17、如果京东有一个购物网页给你,你要怎么进行测试?31、我们公司自动化测试用的语言是Java,Java你不会,该怎么办?23、你们测试用的测试环境是谁给的?24、如果领导分配你的任务超出负荷,领导高估了你的能力,怎么办。26、给你一个模块测试,只有一个星期的时间你如何有效率地完成?29、如果你组长的用例写错了,但他认为是对的,你怎么处理?

crhnb的博客 917

python基础语法与数据结构

本文摘要: Python基础语法包含输入输出、函数、变量、数据类型及运算符等内容。输入函数input()获取键盘输入并以字符串存储,输出函数print()可格式化输出数据。函数通过def定义,可带参数和返回值,提高代码复用性。变量无需声明类型,可动态赋值。数据类型包括数字、字符串、布尔及复合类型,可通过type()查看。运算符包含算术、赋值等类型,其中复合赋值运算符如+=可简化运算。类型转换函数如int()、str()等可实现显式类型转换。这些基础语法构成Python编程的核心要素。

MM602388的博客 434

冒泡与捕获事件

addEventListener 的第三个参数 冒泡与捕获事件

qq_43532275的博客 2080

超声波雾化驱动设计:专用芯片FM8118替代MCU的工程实践

超声波雾化是一种基于压电陶瓷谐振原理的高频能量转换技术,其核心在于在1.6–2.4MHz频段精准激励雾化片以实现高效水分子破碎。传统采用通用MCU配合分立MOSFET的方案受限于PWM频率上限、栅极驱动能力不足及EMI控制困难,导致雾化效率低、温升高、可靠性差。专用雾化芯片(如FM8118)通过集成2.1MHz振荡器、零电压开关(ZVS)控制与过流/过热双重保护,从架构层面解决高频功率驱动的本质约束,显著提升驱动效率(达83.7%)与系统鲁棒性。该技术广泛适用于桌面加湿器、医疗雾化器、农业微喷等对体积、功耗

weixin_34620658的博客 406

解释事件冒泡和事件捕获的原理,并说明它们之间的区别与使用场景

事件冒泡和事件捕获是什么?能做什么?看完这篇你就明白了

weixin_53291256的博客 6477

AI Agent在医疗诊断中的智能应用研究

本文探讨了AIAgent在医疗诊断中的智能应用,分析了其技术原理、实际案例及发展挑战。AIAgent通过机器学习算法处理医疗数据,提升诊断准确性和效率,市场规模预计2025年达200亿美元。核心技术包括数据预处理、深度学习模型和隐私保护方法。应用案例涵盖肺癌筛查、阿尔茨海默病预测等,但面临数据偏差、伦理责任等挑战。未来趋势包括多模态学习、个性化医疗和量子计算融合。随着技术优化和伦理完善,AIAgent将成为医疗体系的重要组成部分。

郑伟强dev的专栏 96

ZY1-02D (ZY1E)多光谱数据预处理

资源一号02D卫星(5米光学卫星)于2019年9月12日成功发射,卫星搭载的两台相机,可有效获取115公里幅宽的9谱段多光谱数据以及60公里幅宽的166谱段高光谱数据,其中全色谱段分辨率可达2.5米、 多光谱为10米、高光谱优于30米,高光谱载荷可见近红外和短波红外光谱分辨率分别达到10纳米和20纳米。

热爱分享,热爱记录 4832

事件捕获方式和冒泡方式—它们的区别是什么?

😄看一个document代码段: 你看我点一下里面的div,它就会一个冒泡事件,但是这个冒泡事件我们是看不到的,但是它是按这个顺序发生的:从最里面依次沿着上层触发,再看一下模型图: 事件捕获:事件捕获实际上是为了在事件到达最终目标 前拦截事件,顾名思义就是捕获某个东西。😄看这个document代码段: 同样的图,但是它们的触发顺序却不同,如下:可以看出它是从最外面开始触发的,直到捕获到你点击的div为止,模型图如下: 事件冒泡:一个由里到外,冒泡,向上层延申。事件捕获:一个由外到里,前往捕获,形成向下趋..

橙子的博客 532

团体程序设计天梯赛竞赛题--登顶题【L3-039 攀岩】

登顶级 3 道题,每道题 30 分,满分为 90 分。

Pretty Boy Fox的博客 653

【笔记】JS的事件冒泡 和 事件捕获

事件冒泡 事件捕获指的是从document到触发事件的那个节点,即自上而下的去触发事件。 事件冒泡是自下而上(从最深节点开始,向上传播事件)的触发事件 //例子 <div id="parent">   <div id="child" class="child"></div> </div> ...

weixin_33829657的博客 94

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

学习笔记 Javascript事件冒泡和事件捕获详细介绍

此为学习他人博客、文档后的心得和摘录,留作笔记

qq_37984564的博客 312

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

今日笔记-事件捕获和冒泡

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <...

qq_45441981的博客 109

浏览器的事件捕获阶段和冒泡阶段笔记

当我们在浏览器点击一下的时候,为什么就可以执行指定的代码,用户点击这下,浏览器背后发生了怎样动人的故事,接下来就来一起寻找浏览器事件背后的故事 我们如果想用户点击某个节点事执行某段代码,我们可以这样做: 1.     //直接在html中调用方法,这个是浏览器暴露的接口之一,HTML事件处理程序(也可以叫事件侦听器),就是侦听这个dom节点的click动作,hello方法就是这个侦听器的回调函

maoguiyou的专栏 1872

JavaScript学习笔记之事件冒泡和事件捕获

#div1{ width:300px; height:300px; background-color:green; } #div2{ width:200px; height:200px; background-color:r

秋忆夏伤的博客 266

JavaScript高级程序设计笔记 事件冒泡和事件捕获

1、事件冒泡要理解事件冒泡,就得先知道事件流。事件流描述的是从页面接收事件的顺序,比如如下的代码:<body> <div> click me! </div> </body>如果在body和div内都注册了click的事件监听,之后又点击了div区域,是body先响应还是div先响应?有意思的是,当时的浏览器开发团队IE和Netscape提出了差不多完全相反的事件流的概念。IE的事件

初漾的博客 232

DOM笔记3--添加事件/事件对象/阻止默认行为/捕获和冒泡/常用事件

事件:用户和浏览器之间的交互行为。如:点击、移入移出某个元素等 给元素绑定事件:元素.事件名 = function(){ } 但是如果给某元素添加和系统同名的事件,在默认情况下,自定义的同名事件不能覆盖系统默认事件。如果想覆盖,需要在自定义的同名事件中添加return false语句 移入事件onmouseenter 移出事件onmouseleave 移动事件onmousemove 监听input...

weixin_42139212的博客 461

[JS]笔记12之事件机制--事件冒泡和捕获--事件监听--阻止事件传播

-->事件冒泡和捕获-->事件监听-->阻止事件传播 一、事件冒泡和捕获 1、概念:当给子元素和父元素定义了相同的事件,比如都定义了onclick事件,点击子元素时,父元素的onclick事件也会被触发。js里称这种事件连续发生的机制为事件冒泡或者事件捕获。IE浏览器:事件从里向外发生,事件从最精确对象(target)开始触发,然后到最不精确的对象(document)触发,即事件冒泡 Net

louShuMei 的博客 534

邂逅小程序(王洪元)笔记02事件绑定,event时间对象,事件的参数传递,事件冒泡和事件捕获自定义组件,组件和页面通信,组件向引用页传递事件,修改组件中的数据,单插槽,多插槽,组件监听生命周期函数

1、bind:xx和catch:xx绑定事件 可以把bind和tap之间用冒号分割开来,ctache也可以 <button bind:tap="click_me1">点击</button> <button bindtap="click_me2">点击</button> <button catch:tap="click_me3">点击</button> <button catchtap="click_me4">点击</b

weixin_43745804的博客 426

js事件流---是时候对事件流做一个对决了

此文章第一是作为笔记,对知识点做一个整体梳理,第二网上有众多事件流讲解,所以对于我已经理解的细节不再说明,只记录自己疑惑的部分. 普通概念: 什么是事件流? 事件顺序是什么样? 捕获--目标--冒泡 兼容性怎么样? ie8及以下不支持捕获. 兼容性小历史? 刚开始其他支持捕获,而ie非支持冒泡.后来w3c支持捕获--目标--冒泡,而ie8头铁还不支持捕获,直到ie9才改变 事件委托原理? 冒泡+...

a519991963的专栏 163
上一篇: 笔记-HTTP请求时哪些请求头是默认的
下一篇: Java开发中的工作流程和步骤——笔记
大白砌墙
博客等级 码龄11年 1296粉丝 144原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大白砌墙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值