Web APIs——事件流

一、事件流

1.1 事件流与两个阶段说明

事件流指的是事件完整执行过程中的流动路径

说明:假设页面里有个div,当触发事件时,会经历两个阶段,分别是捕获阶段、冒泡阶段

简单来说:捕获阶段是 从父到子 冒泡阶段是从子到父

实际工作都是使用事件冒泡为主

1.2 事件捕获

        从DOM的根元素开始去执行对应的事件(从外到里)

        事件捕获需要写对应代码才能看到效果

DOM.addEventListener(事件类型,事件处理函数,是否使用捕获机制)

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>.father {width : 500px;height: 500px;background-color:blueviolet;}.son {width: 200px;height: 200px;background-color: palegreen;}</style>
</head>
<body><div class="father"><div class="son"></div></div><script>const fa = document.querySelector('.father')const son = document.querySelector('.son')document.addEventListener('click',function(){alert('我是爷爷')},true)fa.addEventListener('click',function(){alert('我是爸爸')},true)son.addEventListener('click',function(){alert('我是儿子')},true)// 捕获阶段简单来说就是从大的往小的查找,如果你都注册了同一事件,那它从大的往下依次执行,知道找到你要查找的那个</script>
</body>
</html>

事件捕获:当鼠标点击或者触发dom事件时(被触发dom事件的这个元素被叫作事件源),浏览器会从根节点=>事件源(由外到内)进行事件传播。

事件捕获与事件冒泡是比较类似的,最大的不同在于事件传播的方向。 

说明:

  • addEventListener第三个参数为true表示捕获阶段触发(很少使用)
  • 若传入false表示冒泡阶段触发,默认值为false
  • 事件流只会在父子元素具有相同事件类型时才会产生影响
  • 若是用L0事件监听,则只有冒泡阶段,没有捕获

1.3 事件冒泡

当一个元素的事件被触发时,同样的事件将会在该元素的所有祖先元素中依次被触发。这一过程被称为事件冒泡。

简单理解:当一个元素触发事件后,会依次向上调用所有父级元素的 同名事件

事件冒泡是默认存在的

L2事件监听第三个参数是false,或者默认都是冒泡

1.4 阻止冒泡

问题:因为默认就有冒泡模式的存在,所有容易导致事件影响到父级元素

需求:若想把事件就限制在当前元素内,就需要阻止事件冒泡

前提:阻止事件冒泡需要拿到事件对象

语法:

        事件对象.stopPropagation()

注意:此方法可以阻断事件流动传播,不光在冒泡阶段有效,捕获阶段也有效

   <script>const fa = document.querySelector('.father')const son = document.querySelector('.son')document.addEventListener('click',function(){alert('我是爷爷')})fa.addEventListener('click',function(){alert('我是爸爸')})son.addEventListener('click',function(e){alert('我是儿子')// 组织流动传播  e.stopPropagation()})</script>

1.5 解绑事件

on事件方式,直接使用null覆盖就可以实现事件的解绑

语法:

        // 绑定事件

        btn.onclick = function () {

            alert('点击了')

        }

        // 解绑事件

        btn.onclick = null

<body><button>点击</button><script>const btn = document.querySelector('button')// 绑定事件btn.onclick = function () {alert('点击了') // 会有提示框弹出// L0 事件移除解绑btn.onclick = null  // 不会弹出提示框,因为已经解绑了}</script>
</body>

addEventListener方式,必须使用:

removeEventListener(事件类型,事件处理函数,[获取捕获或者冒泡阶段])

<body><button>点击</button><script>const btn = document.querySelector('button')function fn() {alert('点击了')}// 绑定事件btn.addEventListener('click',fn)// 解绑事件btn.removeEventListener('click',fn)</script>
</body>

注意:匿名函数无法解绑

二、鼠标结果事件的区别

鼠标经过事件:

  • mouseover和mouseout会有冒泡效果
  • mouseenter和mouseleave没有冒泡效果(推荐)

使用mouseover和mouseout 

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>.dad {width: 400px;height: 400px;background-color: brown;}.baby {width: 200px;height: 200px;background-color: gold;}</style>
</head>
<body><div class="dad"><div class="baby"></div></div><script>// 使用mouseover和mouseout,const dad = document.querySelector('.dad')const baby = document.querySelector('.baby')dad.addEventListener('mouseover',function () {console.log('鼠标经过');})dad.addEventListener('mouseout',function () {console.log('鼠标移开');})</script>
</body>
</html>

运行结果:

使用mouseenter和mouseleave 

    <script>// 使用mouseenter和mouseleave,const dad = document.querySelector('.dad')const baby = document.querySelector('.baby')dad.addEventListener('mouseenter',function () {console.log('鼠标经过');})dad.addEventListener('mouseleave',function () {console.log('鼠标移开');})</script>

运行结果:

三、两种注册事件的区别 

3.1 传统on注册(L0)

  • 同一个对象,后面注册的事件会覆盖前面注册(同一个事件)
  • 直接使用null覆盖偶就可以实现事件的解绑
  • 都是冒泡阶段执行的

3.2 事件监听注册(L2)

  • 语法:addEventListener(事件类型,事件处理函数,是否使用捕获)
  • 后面注册的事件不会覆盖前面注册的事件(同一个事件)
  • 可以通过第三个参数去确定是在冒泡或者捕获阶段执行
  • 必须使用removeEventListener(事件类型,事件处理函数,获取捕获或者冒泡阶段)
  • 匿名函数无法被解绑

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

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

相关文章

震惊! 全方位解释在测试眼里,什么是需求?为什么要有需求?深入理解需求——图文并茂,生活举例,简单好理解

1、什么是需求&#xff1f; 需求定义(官方) 满足用户期望或正式规定文档&#xff08;合同、标准、规范&#xff09;所具有的条件和权能&#xff0c;包含用户需求和软件需求 用户需求&#xff1a;可以简单理解为甲方提出的需求&#xff0c;如果没有甲方&#xff0c;那么就是终端…

Hive数据查询详解

本专栏案例数据集链接: https://download.csdn.net/download/shangjg03/88478038 1.数据准备 为了演示查询操作,这里需要预先创建三张表,并加载测试数据。 1.1 员工表 -- 建表语句CREATE TABLE emp(empno INT, -- 员工表编号ename STRING, -- 员工姓名

分布式操作系统的必要性及重要性

总有人在各个平台留言或者私信问LAXCUS分布式操作系统的各种问题&#xff0c;尤其是关于分布式操作系统的应用市场、价值、意义之类的问题。我们团队做LAXCUS分布式操作系统&#xff0c;也不是头脑凭空发热&#xff0c;是基于我们之前的大量产品设计、经验逐渐一步步做起来。当…

查询计算机GUID码

如何查询计算机GUID码&#xff08;全局唯一标识符&#xff09; 1.快键键WINR进入注册表 2.找到\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography路径 3.双击MachineGuid项即可显示计算机GUID码

【网络】序列化反序列化

序列化反序列化 一、序列化反序列化1、概念2、序列化作用3、序列化框架的选择 二、Json1、介绍2、简单使用 一、序列化反序列化 1、概念 在前文《网络编程套接字》中&#xff0c;我们实现了服务器与客户端之间的字符串通信&#xff0c;这是非常简单的通信&#xff0c;在实际使…

Ant Design Vue UI框架的基础使用,及通用后台管理模板的小demo【简单】

一、创建 VUE 项目 npm create vuelatest二、安装使用 ant-design-vue 安装脚手架工具 $ npm install -g vue/cli # OR $ yarn global add vue/cli使用组件 # 安装 $ npm i --save ant-design-vue4.x全局完整注册 import { createApp } from vue; import Antd from ant-de…

Nokogiri库和OpenURI库使用HTTP做一个爬虫

Nokogiri和OpenURI是两个常用的Ruby库&#xff0c;用于编写爬虫程序。它们的主要功能如下&#xff1a; 1、Nokogiri&#xff1a;Nokogiri是一个强大的HTML和XML解析库&#xff0c;可以用于解析网页内容。它提供了一组简单易用的API&#xff0c;可以方便地遍历和操作HTML或XML文…

MySQL篇---第五篇

系列文章目录 文章目录 系列文章目录一、分库分表之后,id 主键如何处理?二、 说说在 MySQL 中一条查询 SQL 是如何执行的?三、索引有什么优缺点?一、分库分表之后,id 主键如何处理? 因为要是分成多个表之后,每个表都是从 1 开始累加,这样是不对的,我们需要一个全局唯一…

IOC课程整理-17 Spring事件

1. Java 事件/监听器编程模型 2. 面向接口的事件/监听器设计模式 3. 面向注解的事件/监听器设计模式 4. Spring 标准事件-ApplicationEvent 5. 基于接口的 Spring 事件监听器 6. 基于注解的 Spring 事件监听器 7. 注册 Spring ApplicationListener 8. Spring 事件发布器 9. Spr…

基于VectorGrid加载GeoServer发布的矢量瓦片实例

目录 前言 一、关于VectorGrid 1、开源地址 2、本地示例 二、与LeafLet集成 1、新建html页面 2、地图初始化 3、pbf瓦片地址配置 4、pbf初始化 三、GeoServer跨域问题 1、web.xml配置 2、重启tomcat 总结 前言 回望10月&#xff0c;发生了一些变动&#xff0c;面向未…

LeetCode--196. 删除重复的电子邮箱

文章目录 1 题目描述2 解题思路2.1 代码实现 1 题目描述 表: Person ---------------------- | Column Name | Type | ---------------------- | id | int | | email | varchar | ----------------------id 是该表的主键列(具有唯一值的列)。 该表的每…

OpenCV官方教程中文版 —— Hough 直线变换

OpenCV官方教程中文版 —— Hough 直线变换 前言一、原理二、OpenCV 中的霍夫变换三、Probabilistic Hough Transform 前言 目标 • 理解霍夫变换的概念 • 学习如何在一张图片中检测直线 • 学习函数&#xff1a;cv2.HoughLines()&#xff0c;cv2.HoughLinesP() 一、原理…

贪心算法总结(未完结)

贪心的定义&#xff08;摘自百度百科&#xff09; 贪心算法&#xff08;greedy algorithm&#xff0c;又称贪婪算法&#xff09;是指&#xff0c;在对问题求解时&#xff0c;总是做出在当前看来是最好的选择。也就是说&#xff0c;不从整体最优上加以考虑&#xff0c;算法得到的…

Hive常用DDL操作

本专栏案例数据集链接: https://download.csdn.net/download/shangjg03/88478038 1. Database 1.1 查看数据库列表 show databases; 1.2 使用数据库 USE database_name;

设计模式(2)-创建型模式

1&#xff0c;创建型模式 4.1 单例设计模式 单例模式&#xff08;Singleton Pattern&#xff09;是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类&#xff0c;该类负责创建自己…

有所期待的日子,就是幸福的。

打开了手机屏幕&#xff0c;开始码字&#xff0c;手指敲打出文字的霎那&#xff0c;像是高中时期最后一节晚自习时抬起的笔&#xff0c;在厚厚的日记本上&#xff0c;写下一段时间的感受。文字是有力量的&#xff0c;我从来都相信。 大三那年&#xff0c;我总是会习惯而又阶段…

初次学习dubbo记录

---------------------------------------10.17---------------------------------------- 集群和分布式概念 集群&#xff1a;很多"人"做的相同的一件事&#xff0c;即使有一个人挂掉了&#xff0c;也不会对系统造成致命影响 分布式&#xff1a;很多"人"…

ruoyi vue前后端分离功能介绍

文章目录 内置功能:用户管理&#xff1a;部门管理&#xff1a;岗位管理&#xff1a;菜单管理&#xff1a;角色管理&#xff1a;字典管理&#xff1a;参数管理&#xff1a; 可以设置是否开启验证码功能通知公告&#xff1a;操作日志&#xff1a;登录日志&#xff1a;在线用户&am…

Think-Queue3一直提示[Exception]redis扩展未安装

场景 tp6tq3实现的任务队列&#xff0c;使用redis作为数据驱动&#xff0c;目前是tp6可以正常使用redis了&#xff0c;但tq3不行&#xff0c;一直提示[Exception]redis扩展未安装。 解决思路 1.分析tq3源码 定位到是这一行出了问题 if (!extension_loaded(redis)) {throw n…

PAT 乙级1070结绳

题目&#xff1a; 给定一段一段的绳子&#xff0c;你需要把它们串成一条绳。每次串连的时候&#xff0c;是把两段绳子对折&#xff0c;再如下图所示套接在一起。这样得到的绳子又被当成是另一段绳子&#xff0c;可以再次对折去跟另一段绳子串连。每次串连后&#xff0c;原来两…