首页 > 其他分享 >JS进阶DAY3|事件(二)事件流

JS进阶DAY3|事件(二)事件流

时间:2024-12-08 22:32:41浏览次数:6  
标签:阶段 进阶 捕获 DAY3 JS 冒泡 监听器 addEventListener 事件

目录

一、事件流说明

1.1 事件流概念

1.2 事件捕获阶段

1.3 事件冒泡阶段

二、事件传播的两个阶段说明

2.1 事件捕获

2.2 事件冒泡

3.3 示例代码

三、阻止冒泡

四、事件解绑

4.1 removeEventListener方法

4.2 使用 DOM0 级事件属性

4.3 使用一次性事件监听器


一、事件流说明

1.1 事件流概念

事件流(Event Flow)是指事件从发生到结束的整个过程。在Web浏览器中,事件流分为两个阶段:事件捕获阶段(Event Capturing Phase)和事件冒泡阶段(Event Bubbling Phase)。

1.2 事件捕获阶段

事件捕获阶段开始于根节点(通常是 document 对象),然后沿着DOM树向下传播到目标节点。在这个阶段,事件会经过所有的父节点,直到到达事件的实际目标(即触发事件的元素)。这意味着,如果你在父元素上注册了一个事件监听器,它会在冒泡到目标元素之前被触发。

1.3 事件冒泡阶段

事件冒泡阶段从事件的目标节点开始,然后向上传播到根节点。在这个阶段,事件会从目标元素开始,逐级向上经过其父元素,直到到达 document 对象。这是事件流的默认行为,也是大多数开发者所熟悉的。

二、事件传播的两个阶段说明

2.1 事件捕获

事件从文档根开始,沿DOM树向下至目标元素。

可以在此阶段设置监听器来拦截事件,阻止事件继续向下传播到目标元素。

在现代浏览器中,可以通过 addEventListener 的第三个参数设置为 true 来启用捕获阶段的监听。

2.2 事件冒泡

事件从目标元素开始,沿DOM树向上至文档根。

这是大多数事件监听器工作的地方,也是默认的事件传播方式。

可以通过 addEventListener 的第三个参数设置为 false (或不设置)来监听冒泡阶段的事件。

3.3 示例代码

// 事件捕获阶段监听

document.getElementById('parent').addEventListener('click', function(event) {

  console.log('捕获阶段 - 父元素');

}, true);



// 事件冒泡阶段监听

document.getElementById('child').addEventListener('click', function(event) {

  console.log('冒泡阶段 - 子元素');

});

如果 child 元素被点击,事件首先在捕获阶段触发 parent 元素的监听器,然后事件到达 child 元素,并在冒泡阶段触发 child 元素的监听器。如果需要在捕获阶段监听事件,需要在 addEventListener 中将第三个参数设置为 true 。

三、阻止冒泡

当在事件处理函数中调用 event.stopPropagation() ,可以阻止事件继续冒泡到父元素。

const childElement = document.getElementById('child');

childElement.addEventListener('click', function(event) {

  event.stopPropagation(); // 阻止事件冒泡

  console.log('点击事件在子元素处理,不会传播到父元素');

});

四、事件解绑

事件解绑,即移除事件监听器,可以通过以下几种方法实现:

4.1 removeEventListener方法

const element = document.getElementById('myElement');

const handlerFunction = function(event) {

  console.log('事件被触发');

};

// 添加事件监听器

element.addEventListener('click', handlerFunction);

// 移除事件监听器

element.removeEventListener('click', handlerFunction);

注意

  1. 确保函数引用相同:传递给  addEventListener  和  removeEventListener  的函数引用必须完全相同。
  2. 捕获与冒泡:如果使用事件捕获添加的监听器,解绑时也需要使用相同的捕获选项。

4.2 使用 DOM0 级事件属性

对于通过直接赋值给事件属性添加的事件监听器(DOM0级事件处理),可以通过将事件属性设置为  null  或一个空函数来“解绑”事件。

const element = document.getElementById('myElement');

// 添加事件监听器(DOM0级)

element.onclick = function(event) {

  console.log('点击事件被触发');

};

// “解绑”事件监听器(DOM0级)

element.onclick = null; // 或者 element.onclick = function() {};

4.3 使用一次性事件监听器

通过在  addEventListener  的选项中设置  { once: true } ,可以添加一个只触发一次的事件监听器,该监听器在触发后自动解绑。

const element = document.getElementById('myElement');

// 添加一次性事件监听器

element.addEventListener('click', function(event) {

  console.log('点击事件被触发一次');

}, { once: true });

这种监听器在触发一次后自动解绑,无需手动移除。

标签:阶段,进阶,捕获,DAY3,JS,冒泡,监听器,addEventListener,事件
From: https://blog.csdn.net/2301_80743865/article/details/144332311

相关文章

  • JS进阶DAY3|事件(一)事件监听及事件类型
    目录一、事件监听方式(绑定)1.1DOM0级事件1.2 DOM2级事件1.3区别二、事件类型2.1鼠标事件2.2键盘事件2.3焦点事件2.4表单事件2.5加载和卸载事件2.6滚动事件2.7触摸事件(在支持触摸的设备上)一、事件监听方式(绑定)1.1DOM0级事件 直接将函数赋值给DOM......
  • #渗透测试#红蓝对抗#SRC漏洞挖掘# Yakit(5)进阶模式-MITM中间人代理与劫持(下)
    免责声明本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章阅读。目录 Yakit(5)进阶模式-MITM中间人代理与劫持(下)History......
  • A3026 Java+jsp+servlet+mysql高校学生请假管理系统
    高校学生请假管理系统1.摘要2.绪论3.功能结构4.界面展示5.源码获取1.摘要高校学生请假管理系统摘要:随着计算机的发展与不断进步,各个领域都出现了新的技术,曾经各种规模之间的竞争已经发展成为技术之间的竞争,管理和人才之间的竞争,然而计算机技术的发展也离不开软件的......
  • 010editor解决ctfshow misc入门 进阶版
    misc27打开题目可以看到提示我们,flag在下面,那么就知道这里一定是更改了jpg图片的宽高,但手上没有很好的工具能够爆破jpg格式的宽高,那么就需要我们手动在010editor里面进行更改当我们把图片放入010中,发现并不是按以往的正常格式排列信息我们发现在文件头之间插入了许多没用的......
  • 视野修炼-技术周刊第113期 | JS 29周年
    欢迎来到第113期的【视野修炼-技术周刊】,下面是本期的精选内容简介......
  • Java 进阶指南
    Java作为一种广泛应用的编程语言,在掌握了基础语法和面向对象概念后,进阶学习将帮助开发者构建更强大、高效和可维护的应用程序。一、多线程编程多线程允许程序在同一时间内执行多个任务,提高程序的运行效率和响应性。在Java中,通过Thread类或实现Runnable接口来创建线程......
  • How to Build and Deploy a Next.js App on Apache Server
    Step1:InstallingNext.jsnpminstall-gyarnmkdir-pv/var/www/project_folder_namecd/var/www/project_folder_nameyarncreatenext-appEditpackage.jsonandreplacethescriptsectionwiththefollowing:"scripts":{"dev":&quo......
  • CSS & JS Effect – 大杂烩
    前言这篇记入一些小的 CSS&JSEffect。 Transferdivkeydowntoinput一个filterableselectionlist。user点击input>输入text>接着选择item。此时input就blur了。如果此时user想继续输入text或者arrowup/down怎么办呢?我们可以这样做,当user......
  • Nodejs实现的社区居民互助系统的设计与实现-车位房子租赁
    《[含文档+PPT+源码等]精品Nodejs实现的社区居民互助系统的设计与实现[包运行成功]》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功以及课程答疑与微信售后交流群、送查重系统不限次数免费查重等福利!软件开发环境及开发工具:操作系统:Wind......
  • node.js毕设网文论坛管理系统程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于网文论坛管理系统的研究,现有研究多集中在网络论坛的一般性管理方面,如用户管理和内容审核等常规功能的实现。专门针对网文论坛这种具有特定用户群体(......