addEventListener与事件捕获、事件冒泡

2024-04-25 18:18

本文主要是介绍addEventListener与事件捕获、事件冒泡,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

addEventListener与事件捕获、事件冒泡:

  • 一、addEventListener的基本用法 

    项目开发中,javascript和html的解耦变得至关重要,我们被推荐使用事件动 态绑定的方式来处理按钮的事件。W3C为我们提供了addEventListener()函数用来为指定的 dom元素动态绑定事件。这个函数有三个参数:

type:用来设置事件类型,例如click

listener:用来设置监听事件的函数,及type类型的事件发生后执行的函数。

大部分情况下,确切的说是我们绑定事件的元素的父元素和子元素都不存在操作类型相 同的触发事件时,前两个参数就可以满足我们为按钮绑定事件的需求。 代码如下,这样我们点击id为myDiv的元素时,控制台就会输出"Hello":

  • 二、事件冒泡:

但是,当出现如下情况时,情况就变得有些复杂。

下面的html中存在“四世同堂”的个元素(这里我省略了它们的CSS样式)运行效果如图所 示:

最外层褐色的是id为grandpa的div,其后粉色的是id为father的div,蓝色的是id为 child的div,最里层黑色的是id为grandson的div。(子元素依次置于父元素之中且逐级变小)。

下面设置了四个函数用来进行事件绑定:

使用下面的代码,我们可以获取四个元素对应DOM:

 

现在,我们试着同时分别为grandpa和grandson绑定sleep和doingHomework事件。

这时我们点击最外层的grandpa时,当然会触发sleep函数,然而当我们点击grandson 时,控制台的输出如下:

这是因为grandson在grandpa之上,当点击grandson时,同时也在grandpa上进行了点击 操作,所以在执行了doingHomework后,还会触发grandpa的sleep函数。

这种当满足条件后从子元素到父元素依次触发其上事件的处理方式叫做事件冒泡。

我们也为father和child分别绑定watchTV和playingCard函数;

这时当点击grandson时,由于事件冒泡原理,显然,先触发doingHomework,再执行 playingCard,再执行watchTV,最后执行grandpa的sleep。

代码如下:

  • 三、事件捕获:

JS还设置了另外一种处理多(父子)元素多事件触发的方式,叫做事件捕获。事件捕 与事件冒泡完全相反,先触发祖先元素的事件,然后再逐级触发子元素的事件。默认情 况下,绑定事件时,采用事件冒泡原则,如果想要进行事件捕获的话,需要设置一个参数。

  • 四、addEventListener神秘的第三个参数:

我们可以为addEventListener函数添加第三个参数useCapture,参数值是布尔值,默认 是false。当useCapture为false时,事件处理采取事件冒泡的原则,当userCapture为 true时,则采取事件捕获的原则,现在我们为我们“四世同堂”的元素设置第三个参数。

这时,当点击grandson时,就会先执行祖先元素的事件,再执行后代元素的事件了,控 制台的输出如下图所示:

虽然默认情况下,useCapture的值是false,但我推荐我们在绑定函数时把它明显的写 出来以避免浏览器兼容性的问题。

(五)事件冒泡与事件捕获要是同时进行怎么办

有些同学肯定会思考这样一个问题,在上述绑定事件的代码中,第三个参数不是全部设 置的true,就是全部设置成false,那如果既有true,又有false,有的元素设置成按事件冒 泡处理,有的元素设置成按事件捕获处理,那怎么办呢?我们的浏览器更“喜爱”事件捕 获:它会先把useCapture为false的元素绑定事件放到一边,按照事件捕获正常的顺序执 行useCapture为true的元素绑定事件,最后在按照事件冒泡顺序执行useCapture为 false。

现在我们作如下更改:

按照上述原则,当点击grandson时,先执行useCapture为true的元素的绑定事件,又 按照事件捕获原则,先执行grandpa的事件,再执行child的事件。之后,再按照事件捕获顺 序执行useCapture为false的事件,输出结果如下:

  • 阻止事件冒泡和捕获:

我们可以利用时间对象event的stopPropagation()方法组织事件的进一步传播。 我们修改一下doingHomework函数:

这时我们点击grandson,控制台输出的结果是:

发现事件执行到doingHomework就被阻断了。值得注意的是,event.stopPropagation() 函数并不会阻止其下函数内容的执行。

如果你使用的是jquery的事件绑定,也可以直接在函数中使用return false来阻止事件 的传播(当然event.stopPropagation同样有效),与event.stopPropagation的不同是, return false会阻止同函数下面的代码执行.

 

这篇关于addEventListener与事件捕获、事件冒泡的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/935430

相关文章

禁止平板,iPad长按弹出默认菜单事件

通过监控按下抬起时间差来禁止弹出事件,把以下代码写在要禁止的页面的页面加载事件里面即可     var date;document.addEventListener('touchstart', event => {date = new Date().getTime();});document.addEventListener('touchend', event => {if (new

FreeRTOS内部机制学习03(事件组内部机制)

文章目录 事件组使用的场景事件组的核心以及Set事件API做的事情事件组的特殊之处事件组为什么不关闭中断xEventGroupSetBitsFromISR内部是怎么做的? 事件组使用的场景 学校组织秋游,组长在等待: 张三:我到了 李四:我到了 王五:我到了 组长说:好,大家都到齐了,出发! 秋游回来第二天就要提交一篇心得报告,组长在焦急等待:张三、李四、王五谁先写好就交谁的

【经验交流】修复系统事件查看器启动不能时出现的4201错误

方法1,取得『%SystemRoot%\LogFiles』文件夹和『%SystemRoot%\System32\wbem』文件夹的权限(包括这两个文件夹的所有子文件夹的权限),简单点说,就是使你当前的帐户拥有这两个文件夹以及它们的子文件夹的绝对控制权限。这是最简单的方法,不少老外说,这样一弄,倒是解决了问题。不过对我的系统,没用; 方法2,以不带网络的安全模式启动,运行命令行,输入“ne

BT天堂网站挂马事件后续:“大灰狼”远控木马分析及幕后真凶调查

9月初安全团队披露bt天堂网站挂马事件,该网站被利用IE神洞CVE-2014-6332挂马,如果用户没有打补丁或开启安全软件防护,电脑会自动下载执行大灰狼远控木马程序。 鉴于bt天堂电影下载网站访问量巨大,此次挂马事件受害者甚众,安全团队专门针对该木马进行严密监控,并对其幕后真凶进行了深入调查。 一、“大灰狼”的伪装 以下是10月30日一天内大灰狼远控的木马样本截图,可以看到该木马变种数量不

js window.addEventListener 是什么?

window.addEventListener 是 JavaScript 中的一个方法,用于向指定对象(在这个情况下是 window 对象,代表浏览器窗口)添加事件监听器,以便在该对象上发生特定事件时执行相应的函数(称为事件处理函数或事件监听器)。 这个方法接受三个参数: 事件类型(type):一个字符串,表示要监听的事件类型。例如,"click" 表示鼠标点击事件,"load" 表示页面加

react笔记 8-19 事件对象、获取dom元素、双向绑定

1、事件对象event 通过事件的event对象获取它的dom元素 run=(event)=>{event.target.style="background:yellowgreen" //event的父级为他本身event.target.getAttribute("aid") //这样便获取到了它的自定义属性aid}render() {return (<div><h2>{

react笔记 8-18 事件 方法 定义方法 获取/改变数据 传值

1、定义方法并绑定 class News extends React.Component {constructor(props) {super(props)this.state = {msg:'home组件'}}run(){alert("我是一个run") //方法写在类中}render() {return (<div><h2>{this.state.msg}</h2><button onCli

【Qt】定时器事件

定时器事件 在之前学习QTimer中实现了定时器的功能,而在QTimer背后是QTimerEvent定时器事件进行支撑的。在QObject中提供了一个timeEvent这个函数。 startTimer启动定时器killTimer关闭定时器 Qt 中在进⾏窗⼝程序的处理过程中,经常要周期性的执⾏某些操作,或者制作⼀些动画效果,使⽤定 时器就可以实现。所谓定时器就是在间隔⼀定时间后,去执⾏某⼀

Imageview在百度地图中实现点击事件

1.首先第一步,需要声明的全局有关类的引用 private BMapManager mBMapMan; private MapView mMapView; private MapController mMapController; private RadioGroup radiogroup; private RadioButton normalview; private RadioBu

如何使用Selenium捕获控制台日志

Selenium是一个流行的开源工具,用于自动化Web浏览器。其中一个关键功能是能够与浏览器的开发者控制台交互。本文将向您展示如何在Selenium中使用Java获取控制台日志。这些日志对于调试和解决Selenium脚本的问题非常有用。 如何查看任何网页的控制台日志 首先,打开浏览器的开发者控制台。在大多数浏览器中,您可以通过右键点击页面并选择“检查”来做到这一点。我们将在我们的测试网站——h