js中的事件传递

事件传递分为两个阶段,一是 事件捕获,二是 事件冒泡。分别对应下图1~5和6-10,每次触发的事件从window开始向下传播,一直到叶子节点,再往回传播。每个节点都允许添加监听器,浏览器在事件传播过程中一旦遇到监听器,就会去处理监听器里的脚本。当监听器的事情处理完后,监听器会执行默认行为,也就是滚动页面或者缩放页面等,当然,若该事件的cancelable属性为true,表明这个事件的默认行为可以阻止,我们也可以通过e.preventDefault()方法阻止默认行为的执行。

在这里插入图片描述

但不是所有的浏览器都是这样处理的。
  • Netscape认为事件流应该是事件捕获
  • ie认为事件流应该是事件冒泡, ie没有提供选择,事件只能在冒泡阶段捕获。ie认为事件流应该是事件冒泡
  • w3c认为首先是事件捕获然后是事件冒泡。在支持w3c的浏览器中,程序员可以通过设置 addEventListener(type, handler, useCapture)中的userCapture值来决定元素是在冒泡阶段执行事件还是捕获阶段执行,默认为false,即冒泡阶段。

若想阻止事件在1->10的传播,可在其中的监听器中加上e.stopPropagation()来阻断事件的传播。

document.getElementsByTagName('div')[0].addEventListener('click', (e) => {// 即可阻止上述图中事件在序号4继续传播e.stopPropagation();
}, true)

拓展

上文提到,我们可以在监听器中通过e.preventDefault()方法阻止默认行为的执行,但是对于并不需要阻止默认行为的事件,浏览器也只能等待监听器里的脚本执行完毕,才知道需不需要阻止此次默认行为,因为浏览器无法预先知道一个监听器会不会调用 preventDefault(),它能做的只有等监听器执行完后,看看这个监听器最后有没有e.preventDefault()。而监听器执行是要耗时的,有些甚至耗时很明显,这样就会导致页面卡顿,即便监听器是个空函数,也会产生一定的卡顿,毕竟空函数的执行也会耗时。
所以,passive 监听器诞生了。

2017年底,DOM 规范做了修订:addEventListener() 的第三个参数支持传递对象值:

addEventListener(type, listener, {capture: false,passive: false,once: false,
})

此时,当事件触发,浏览器就可以在监听器执行前就知道你想不想阻止默认行为,一旦监听器传递了 passive 参数,浏览器就会在另一个线程去执行浏览器的默认行为。

tips: 不要在传递了passive的监听器中再去做e.preventDefault()这种矛盾的写法,passive是告诉浏览器,我这个监听器里面没有e.preventDefault(),你不用等我了,去执行默认行为吧!而e.preventDefault()是告诉浏览器你想阻止浏览器的默认行为。

如果你不小心这样写了,那么e.preventDefault()将被忽略

let event = new Event("foo", { // 创建一个可以被阻止默认行为的事件对象cancelable: true
})document.addEventListener("foo", function(event) {console.log(event.defaultPrevented)event.preventDefault()console.log(event.defaultPrevented)
}, {passive: true
})document.dispatchEvent(event)

同时,浏览器还会给你抛一个错误,VM102:7 Unable to preventDefault inside passive event listener invocation.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/595349.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入了解Go语言中的unsafe.Sizeof():探究变量与数据类型的内存占用

当涉及到在 Go 语言中确定变量或数据类型所占用的内存空间大小时,unsafe 包中的 Sizeof() 函数成为了一个强有力的工具。它可以用来获取变量或数据类型所占用的字节数,但需要注意的是,它不考虑内存对齐和填充的情况。因此,在使用 …

k8s三种常用的项目发布方式

k8s三种常用的项目发布方式 1、 蓝绿发布 2、 金丝雀发布(灰度发布):使用最多 3 、滚动发布 应用程序升级,面临的最大问题是新旧业务之间的切换。 项目的生命周期:立项----定稿----需求发布----开发----测试-----发布 最后测试之后上线。再…

《PCI Express体系结构导读》随记 —— 第I篇 第2章 PCI总线的桥与配置(4)

接前一篇文章:《PCI Express体系结构导读》随记 —— 第I篇 第2章 PCI总线的桥与配置(3) 2.1 存储器域与PCI总线域 2.1.3 处理器域内容较多,为了便于理解,余下内容放到本回。 2.1.3 处理器域 在一个处理器系统中&am…

【大数据进阶第二阶段之Hadoop学习笔记】Hadoop 概述

1、 Hadoop 是什么 (1)Hadoop是一个由Apache基金会所开发的分布式系统基础架构 (2)主要解决海量数据的存储和海量数据的分析计算问题 (3)广义上来说,Hadoop通常是指一个更广泛的概念——Hadoop生…

Ef Core花里胡哨系列(10) 动态起来的 DbContext

Ef Core花里胡哨系列(10) 动态起来的 DbContext 我们知道,DbContext有两种托管方式,一种是AddDbContext和AddDbContextFactory,但是呢他们各有优劣,例如工厂模式下性能更好呀等等。那么,我们能否自己托管DbContext呢&…

keras人工智能框架 MNIST 数据集 随机展示

阅读本文之前,请先参考--------win10搭建keras深度学习框架 安装运行环境 使用Python绘图库Matplotlib随机输出mnist数据集的几个图片:代码见下图: 在sublimeText中 使用ctrlB运行代码,结果如下图:

c++ / day06

1. 利用模板类完成顺序表(两天时间&#xff0c;今天至少写出大致框架) 代码 //implement template in sqlist #include <iostream> #include <cstring>#define MAXSIZE 100using namespace std;template <typename T> class Sqlist {unsigned int len 0;T…

GaussDB数据库使用COPY命令导数

目录 一、前言 二、GaussDB数据库使用COPY命令导数语法 1、语法COPY FROM 2、语法COPY TO 3、特别说明及参数示意 三、GaussDB数据库使用COPY命令导数示例 1、操作步骤 2、准备工作&#xff08;示例&#xff09; 3、把一个表的数据拷贝到一个文件&#xff08;示例&…

kbdnecnt.DLL文件缺失,软件或游戏无法启动运行,怎样快速修复?

不少人都在问“kbdnecnt.DLL文件”是什么&#xff1f;为什么电脑总是报错提示说“kbdnecnt.DLL文件缺失&#xff0c;软件无法启动”&#xff1f; 首先&#xff0c;先来了解“kbdnecnt.DLL文件”是什么&#xff1f; kbdnecnt.DLL是Windows操作系统中的一个动态链接库文件&#…

Spark二、Spark技术栈之Spark Core

Spark Core spark核心&#xff1a;包括RDD、RDD算子、RDD的持久化/缓存、累加器和广播变量 学习链接&#xff1a;https://mp.weixin.qq.com/s/caCk3mM5iXy0FaXCLkDwYQ 一、 RDD 1.1 为什么要有RDD 在许多迭代式算法(比如机器学习、图算法等)和交互式数据挖掘中&#xff0c;…

STL——string详解

目录 &#x1f4a1;介绍 &#x1f4a1;string的基本操作 &#x1f4a1;string的构造函数 &#x1f4a1;string赋值操作 &#x1f4a1;string字符串拼接 &#x1f4a1;string的查找和替换 &#x1f4a1;string字符串比较 &#x1f4a1;string字符存取 &#x1f4a1;str…

alibabaCloud学习笔记01(小滴课堂)

微服务架构常见的核心组件 讲解业务微服务架构常见解决方案 讲解AlibabaCloud核心组件介绍 创建数据库。 建表&#xff1a; 添加数据&#xff1a; 再建个用户库&#xff1a; 建表&#xff1a; 插入数据&#xff1a; 创建订单库&#xff1a; 建表&#xff1a; 创建项目&#x…

大数据时代的WEB运维高级架构师,Web系统运维工程师的实战成长之路

一、教程描述 本套WEB架构师教程&#xff0c;大小30.61G&#xff0c;共有183个文件。 二、教程目录 01-Web架构之单机时代&#xff08;共7课时&#xff09; 02-Web架构之集群时代&#xff08;共9课时&#xff09; 03-Web架构之DNS&#xff08;共6课时&#xff09; 04-Web…

常见的共轭先验分布

经常会遇到后验分布不能求解的问题&#xff0c;对于这个问题可以应用共轭先验分布解决&#xff0c;这些先验分布具有比较好的特征&#xff0c;能够使得出的后验分布和先验分布具有相同的分布族。如果一个具有参数属于分布的先验分布&#xff0c;则生成的后验分布也属于相同的分…

在 IBM Cloud 上使用 Spectrum LSF 管理数据

在 IBM Cloud 上使用 Spectrum LSF 管理数据 在云环境中处理 HPC 工作负载时&#xff0c;要解决的一个关键挑战是如何以最佳方式管理运行工作负载所需的数据&#xff0c;以及可能需要分析以进行进一步处理和决策的输出。 通过使用部署在 IBM Cloud上的 IBM Spectrum LSF 集群&…

【InnoDB数据存储结构】第2章节:InnoDB行格式

目录结构 之前整篇文章太长&#xff0c;阅读体验不好&#xff0c;将其拆分为几个子篇章。 本篇章讲解 InnoDB 行格式。 InnoDB 行格式 InnoDB 一行记录是如何存储的&#xff1f; 这个问题是本文的重点&#xff0c;也是面试中经常问到的问题&#xff0c;所以就引出了下文的 …

【flink番外篇】9、Flink Table API 支持的操作示例(14)- 时态表的join(java版本)

Flink 系列文章 一、Flink 专栏 Flink 专栏系统介绍某一知识点&#xff0c;并辅以具体的示例进行说明。 1、Flink 部署系列 本部分介绍Flink的部署、配置相关基础内容。 2、Flink基础系列 本部分介绍Flink 的基础部分&#xff0c;比如术语、架构、编程模型、编程指南、基本的…

vim unfold

To unfold all folds, use the keyszRIn order to adjust the initial fold level, play around with the foldlevel, e.g.:set foldlevel1

Unity 基于UDP实现本地时间与网络时间校验 防客户端修改日期作弊

新建一个Unity GameObject 挂上NTPComponent脚本 时间校验 源码 using System.Collections; using System.Collections.Generic; using UnityEngine; using System; using UnityEngine.Networking; using System.Text; using System.Net.Sockets; using System.Net; using Sys…

c# OpenCvSharp Cv2.Threshold()和Cv2.AdaptiveThreshold参数说明

一、 Cv2.Threshold()二值化的函数参数说明 Cv2.Threshold()是一个用于图像二值化的函数。具体来说&#xff0c;它会将图像中的每一个像素的灰度值与一个阈值进行比较&#xff0c;大于该阈值的像素会被赋值为最大灰度值(即 255)&#xff0c;小于该阈值的像素会被赋值为最小灰度…