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,一经查实,立即删除!

相关文章

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

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

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;则生成的后验分布也属于相同的分…

【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;比如术语、架构、编程模型、编程指南、基本的…

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;小于该阈值的像素会被赋值为最小灰度…

Apollo感知模块 :传感器| 目标监测| 障碍物识别 | 模型管理

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《linux深造日志》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 粉丝福利活动 ✅参与方式&#xff1a;通过连接报名观看课程&#xff0c;即可免费获取精美周边 ⛳️活动链接&#xf…

用c语言以升序顺序显示15个单词,从键盘上输入15个单词,将其以升序顺序显示出来。(排序方法不限,单词不得雷同,而且单词须是正确的单词)

用c语言以升序顺序显示15个单词,从键盘上输入15个单词&#xff0c;将其以升序顺序显示出来。&#xff08;排序方法不限&#xff0c;单词不得雷同,而且单词须是正确的单词&#xff09; 以下是一个使用C语言实现的示例程序&#xff0c;可以从键盘上输入15个单词&#xff0c;并将它…

简易机器学习笔记(八)关于经典的图像分类问题-常见经典神经网络LeNet

前言 图像分类是根据图像的语义信息对不同类别图像进行区分&#xff0c;是计算机视觉的核心&#xff0c;是物体检测、图像分割、物体跟踪、行为分析、人脸识别等其他高层次视觉任务的基础。图像分类在许多领域都有着广泛的应用&#xff0c;如&#xff1a;安防领域的人脸识别和…

视频号频繁显眼!是资本的运作?还是互联网新风口到来?

视频号这个平台出现了&#xff0c;特别是在最近存在感越来越强&#xff0c;而且已经有些人开始在视频号当中购物了&#xff0c;这也就意味着&#xff0c;视频号电商出现了&#xff0c;腾讯也开始搞电商了。 很多人可能对视频号做电商这个事情呢&#xff0c;抱有一定的迟疑态度&…

【算法】数论---约数

约数里面的一个重要性质&#xff1a;一个数的约数都是成对存在的(以sqrt(x)为分界线) 一、求一个数的所有约数---试除法 int x; cin>>x; int yue[10000]{0},idx0; for(int i1;i<x/i;i) {if(x%i0){yue[idx]i;cout<<i<<" ";} }for(int iidx-1;i&…

深度学习:大规模模型分布式训练框架DeepSpeed

深度学习&#xff1a;大规模模型分布式训练框架DeepSpeed DeepSpeed简介DeepSpeed核心特点DeepSpeed如何工作&#xff1f;DeepSpeed如何使用&#xff1f;参考文献 DeepSpeed简介 随着机器学习模型变得越来越复杂和庞大&#xff0c;训练这些模型所需的计算资源也在不断增加。特别…