addEventListener与事件捕获、事件冒泡

2023-11-12

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会阻止同函数下面的代码执行.

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

addEventListener与事件捕获、事件冒泡 的相关文章

随机推荐

  • Linux文件操作命令及磁盘分区与文件系统

    一 cd命令 cd change directory 切换目录 这是用来切换工作目录的命令 注意目录名称和cd命令之间存在一个空格 在介绍cd命令的时候 首先我们来了解相对路径和绝对路径 绝对路径 路径的写法 一定由跟目录 写起 例如 da
  • QTabWidet设置不同Position,tabBar文字均水平显示

    设置QTabWidget在不同方向上的文字均水平显示 有两种方法 如下 1 设置不同Position tabBar文字均水平显示 QTabWidget设置在设置Position为East或者West时 文字方向默认会从下到上显示 先通过以下
  • Connection Refused Error:[WinError 10061]

    问题 Vscode左边栏选项 运行和调试 运行Python Django 程序报错 sock connect host port ConnectionRefusedError WinError 10061 由于目标计算机积极拒绝 无法连接
  • js数据类型学习笔记

  • Scala安装与环境配置

    一 Scala和Python java的区别 Scala是一门多范式编程语言 用于操作Spark 相较于java 由于Spark底层用Scala编写 因此对于大数据Spark项目场景Scala代码更加简洁 java过于冗长 并且Scala支
  • 自编码器(Auto Encoder)原理及其python实现

    目录 一 原理 二 为什么要使用自编码器 三 代码实现 1 原始自编码器 2 多层 堆叠 自编码器 3 卷积自编码器 4 正则自编码器 4 1稀疏自编码器 四 降噪自编码器 五 逐层贪婪训练堆叠自编码器 参考 一 原理 自编码器由两部分组成
  • Android-数据存储(上)

    一 Debug调试 1 跟踪程序的运行过程 找出问题出现的地方 更快的解决问题 bug 2 梳理已有功能代码的运行逻辑流程 二 数据存储 1 sp存储 2 手机内部存储 3 手机外部存储 三 练习
  • java中定义byte数组,浅谈java的byte数组的不同写法

    由于篇幅原因阐述的不够详细科学 不喜勿喷 经常看到java中对byte数组的不同定义 粗略整理的一下 一个字节 byte 8位 bit byte数组 里面全部是 byte 即每一个byte都可以用二进制 十六进制 十进制来表示 二进制 00
  • Unity——LitJSON的安装

    一 LitJSON介绍 特点 LitJSON是一个轻量级的C JSON库 用于在Unity游戏开发中进行JSON数据的序列化和反序列化操作 它提供了简单而高效的接口 帮助开发者处理JSON数据 以下是LitJSON库的一些主要特点和功能 1
  • 用面向对象方法进行俄罗斯方块游戏设计(持续更新中)

    游戏介绍 顾名思义 俄罗斯方块自然是俄罗斯人发明的 这位伟人叫做阿列克谢 帕基特诺夫 Alexey Pazhitnov 这款游戏操作简单 老少皆宜 也是一个不错的练手项目 首先给几个经典的游戏界面先 当然 我们的目的是做出类似的效果 游戏界
  • 女程序员的反思

    鉴于大家对此的热情 我增添些具体的开发感受 希望能帮到和我有一样困惑的姐妹们 也希望各路IT大牛前来指导 工作已有8个多月 不间断的大小项目共5个 一直觉得很疲惫 除了本应该烦累的工作外 自己性格上的各种不适应加重了疲惫感 可能是前一个项目
  • Buildroot用户指南

    第一章 关于Buildroot Buildroot是一个包含Makefile和修补程序 patch 的集合 这个集合可以使你很容易的为你的目标构建交叉工具链 cross compilationtoolchain 根文件系统 root fil
  • python解析excel文件

    通过openpyxl库解析excel文件 from openpyxl import load workbook class ParseExcel object 解析excel文件 def init self 获取excel路径 self d
  • iOS app上架图文教程及注意事项

    网上的ios app上架流程比较多 但基本上都不全 此文档按照步骤进行的 比较推荐 自己按照教程正式走了一遍发现了很多问题 很多都是遇到问题解决问题 整个流程所花费的流程不下一周时间 所以为了让大家了解苹果公司的相关规定 让兄弟们少走弯路
  • 剑指offer——day2

    题目一 思路 两次遍历 一次遍历出链表的元素个数 第二次依次插入数据 int reversePrint struct ListNode head int returnSize int i 0 struct ListNode cur head
  • 面试经典——有意思的Runtime(USE)

    分类 Category 在不子类化的情况下 为已经存在的类增加功能 分类中的方法会成为类的组成部分 并且会被子类继承 扩展 是一种匿名分类 可以声明实例变量 属性和方法 我们常见的 m文件中 interface的一段就是一个扩展 通常用在类
  • 如何利用linux解除手机bl锁,小米手机解BL锁教程(小米手机详细图文详解解锁Bootloader教程)...

    小米手机解锁 Bootloader 教程 注意事项 解锁会清除用户数据 解锁前务必要备份好数据 务必保证手机内有可联网的 SIM 卡一张 手机绑定账号时需要 解锁后手机不安全 如不是发烧友请谨慎操作 解锁操作 第一步 打开系统设置 依次点击
  • kingbase 实现多行转一行

    默认情况下金仓数据库中没有array agg 函数 因此需要自己创建 创建SQL为 金仓默认没有该函数 CREATE AGGREGATE array agg anyelement sfunc array append 每行的操作函数 将本行
  • Android Studio删除module

    在我们Android Studio编程过程当中 总有一些不需要以及占空间的Module在我们面前 通常道理中点击你要删除的Module右键就会有delete按钮就可以删除你要的Module 但却没有你需要的Delete按键 这时候应该怎么办
  • addEventListener与事件捕获、事件冒泡

    addEventListener与事件捕获 事件冒泡 一 addEventListener的基本用法 项目开发中 javascript和html的解耦变得至关重要 我们被推荐使用事件动 态绑定的方式来处理按钮的事件 W3C为我们提供了add