js教程(8)

一、事件流

1.概述

        在JavaScript中,事件流描述的是事件在DOM结构中传播和被处理的顺序。事件流分为冒泡阶段和捕获阶段。

        冒泡阶段(Bubbling Phase):事件首先从最内层的元素开始向父级元素传播,一直传播到最外层的元素。在这个阶段,事件是从内向外传播的。

        捕获阶段(Capturing Phase):与冒泡相反,事件从最外层的元素开始传播,一直传播到最内层的元素。在这个阶段,事件是从外向内传播的。

         事件的传播过程:

  1. 捕获阶段:事件从根元素传播到目标元素,依次触发每个元素上绑定的捕获事件处理程序。
  2. 目标阶段:事件到达目标元素,触发目标元素上绑定的事件处理程序。
  3. 冒泡阶段:事件从目标元素开始向上冒泡,依次触发每个元素上绑定的冒泡事件处理程序。

        在实际开发中,事件处理程序一般是绑定在目标元素上,通过事件冒泡机制,可以在目标元素的父元素上捕获到事件,实现事件委托和事件代理等功能。

        简单来说,捕获阶段是从父到子,冒泡阶段是从子到父,而实践开发中都是使用事件冒泡为主。

2.事件捕获

        从DOM的根元素开始去执行对应的事件,事件捕获需要写对应代码才能看到效果,语法如下:

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

说明:

  • addEventListener第第三个参数传入true代表是捕获阶段触发(很少使用);
  • 若传入false代表冒泡阶段触发,默认就是false;
  • 若是用L0事件监听,则只有冒泡阶段,没有捕获。 

3.事件冒泡

        当一个元素的事件被触发时,同样的事件将会在该元素的所有祖先元素中依次被触发。这一过程被称之为事件冒泡,简单理解就是当一个元素触发事件时,会依次向上调用所有的父级元素的同名事件。

举例:

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>事件冒泡</title><style>.father{width: 50%;height: 300px;background-color: yellow;}.son{width: 50%;height: 300px;background-color: blue;}</style>
</head>
<body>我是爷爷元素<div class="father">我是父元素<div class="son">我是子元素</div></div>
</body>
<script>const father = document.querySelector(".father");const son = document.querySelector(".son");document.addEventListener('click',()=>{alert("爷爷来了");});father.addEventListener('click',()=>{alert("爸爸来了");});son.addEventListener('click',()=>{alert("儿子来了");});
</script>
</html>

此时,若点击子元素,则父元素和爷元素的箭头函数也会被触发。

 

 

4.阻止事件冒泡

        因为默认就有冒泡模式的存在,所以很容易导致事件影响到父级元素,若想把事件就限制在当前元素内,就需要阻止事件冒泡。

语法:

事件对象.stopPropagation();

示例:

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>事件冒泡</title><style>.father{width: 50%;height: 300px;background-color: yellow;}.son{width: 50%;height: 300px;background-color: blue;}</style>
</head>
<body>我是爷爷元素<div class="father">我是父元素<div class="son">我是子元素</div></div>
</body>
<script>const father = document.querySelector(".father");const son = document.querySelector(".son");document.addEventListener('click',()=>{alert("爷爷来了");});father.addEventListener('click',(effervescence)=>{alert("爸爸来了");effervescence.stopPropagation();});son.addEventListener('click',(effervescence)=>{alert("儿子来了");effervescence.stopPropagation();});
</script>
</html>

 此方法可以阻断事件流动传播,不光在冒泡阶段有效,在捕获阶段同样有效。

5.阻止事件默认行为

        我们某些情况下需要阻止默认行为的发生,比如阻止链接的跳转,表单域的跳转。

语法:

事件对象.preventDefault();

示例:

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>阻止默认行为</title>
</head>
<body><form action="#"><input type="submit" value="提交"></form>
</body>
<script>const form = document.querySelector('form');form.addEventListener("click",(e)=>{e.preventDefault();})
</script>
</html>

 6.解绑事件

(1)on事件方式

        直接使用null覆盖就可以实现事件的解绑。

语法:

btn.onclick = function(){alert("我被点击了");
}
btn.onclick = null;

(2)addEventListener方式

        必须使用removeEventListener(事件类型,事件处理函数[,获取捕获或者冒泡阶段])方法可以解绑事件,注意匿名函数无法被解绑。

function fn(){alert("我被点击了");
}
btn.addEventListener("click",fn);
btn.removeEventListener("click",fn);

二、一些注意事项和总结

1.鼠标经过事件

  • mouseover和mouseout会有冒泡效果;
  • mouseenter和mouseleave没有冒泡效果,这里推荐优先使用;

2.两种注册事件的区别

(1)传统on注册(L0)

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

(2)事件监听注册

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

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

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

相关文章

论文:Scalable Zero-shot Entity Linking with Dense Entity Retrieval翻译笔记(实体链接)

文章目录 论文标题&#xff1a;通过密集实体检索实现可扩展的零镜头实体链接摘要1 引言2 相关工作3 定义和任务制定4 方法4.1 双编码器4.2 交叉编码器4.3 知识蒸馏 5 实验5.1 数据集5.2 评估设置和结果5.2.1 零点实体链接5.2.2 tackbp-20105.2.3 WikilinksNED Unseen-Mentions …

c++常考基础知识(2)

二.c关键字 关键字汇总 c中共有63个关键字&#xff0c;其中包括int&#xff0c;char&#xff0c;double等类型关键字&#xff0c;if&#xff0c;else&#xff0c;while&#xff0c;do&#xff0c;等语法关键字&#xff0c;还有sizeof等函数关键字。 三.数据结构 1.数组&#x…

阿里云-零基础入门NLP【基于深度学习的文本分类3-BERT】

文章目录 学习过程赛题理解学习目标赛题数据数据标签评测指标解题思路BERT代码 学习过程 20年当时自身功底是比较零基础(会写些基础的Python[三个科学计算包]数据分析)&#xff0c;一开始看这块其实挺懵的&#xff0c;不会就去问百度或其他人&#xff0c;当时遇见困难挺害怕的…

一键入门Ubuntu22!

目录 一、安装 二、常用目录 三、常用指令 四、用户指令 五、ssh与scp 六、服务相关 七、Python与Pycharm 八、Vim编辑器 九、Ubuntu22下使用Mysql 十、Ubuntu22下使用mongodb 十一、Ubuntu22下使用redis Ubuntu是一个基于Debian的开源操作系统&#xff0c;由Canoni…

Java 自定义线程池实现

自定义线程池 简介任务图示阻塞队列 BlockingQueue<T>ReentrantLock代码 线程池 ThreadPool工作线程类 Worker 拒绝策略接口代码测试类 TestThreadPool为什么需要j i&#xff1f;&#xff08;lambad表达式相关&#xff09; 测试结果拒绝策略&#xff1a;让调用者自己执行…

求解线性方程组

如图题意看出x1有且仅有两种可能&#xff0c;1或者0&#xff0c;且知道了所有a的值&#xff0c;且因为要求所得答案字典序最小&#xff0c;所以先假设x10。 又因a2x1x2所以可以求出x2的值&#xff0c;又如a2x1x2x3,所以可以求出x3的值依次求出所有x的值&#xff0c;但每求出一…

SpringCloud-记

目录 什么是SpringCloud 什么是微服务 SpringCloud的优缺点 SpringBoot和SpringCloud的区别 RPC 的实现原理 RPC是什么 eureka的自我保护机制 Ribbon feigin优点 Ribbon和Feign的区别 什么是SpringCloud Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发…

2024/3/24周报

文章目录 摘要Abstract文献阅读题目引言创新点数据处理研究区域和数据缺失值处理水质相关分析 方法和模型LSTMAttention机制AT-LSTM模型 实验结果 深度学习transformer代码实现1 模型输入1.1 Embedding层1.2 位置编码 2 Encoder2.1 编码器2.2 编码器层2.3注意力机制2.4多头注意…

第五讲 哈希表

我们在前面讲了存储层&#xff0c;以及从次磁盘中将页面加载到缓冲池【Buffer Pool】中&#xff0c;现在我们继续往上&#xff0c;来讨论如何支持 DBMS 的执行引擎从页面中读取/写入数据。这部分是访问方法层的功能&#xff0c;它负责通过索引或者表本身&#xff0c;设置是其他…

生物信息学文章中常见的图应该怎么看?

目录 火山图 热图 箱线图 森林图 LASSO回归可视化图&#xff08;套索图&#xff09; 交叉验证图 PCA图 ROC曲线图 这篇文章只介绍这些图应该怎么解读&#xff0c;具体怎么绘制&#xff0c;需要什么参数&#xff0c;怎么处理数据&#xff0c;会在下一篇文章里面给出 火山…

python之jsonpath的使用

文章目录 介绍安装语法语法规则举例说明 在 python 中使用获取所有结构所有子节点的作者获取所有子孙节点获取所有价格取出第三本书的所有信息取出价格大于70块的所有书本从mongodb 中取数据的示例 介绍 JSONPath能在复杂的JSON数据中 查找和提取所需的信息&#xff0c;它是一…

Java设计模式之单例模式(多种实现方式)

虽然写了很多年代码&#xff0c;但是说真的对设计模式不是很熟练&#xff0c;虽然平时也会用到一些&#xff0c;但是都没有深入研究过&#xff0c;所以趁现在有空练下手 这章主要讲单例模式&#xff0c;也是最简单的一种模式&#xff0c;但是因为spring中bean的广泛应用&#…

YoloV8改进策略:BackBone改进|PKINet

摘要 PKINet是面向遥感旋转框的主干,网络包含了CAA、PKI等模块,给我们改进卷积结构的模型带来了很多启发。本文,使用PKINet替代YoloV8的主干网络,实现涨点。PKINet是我在作者的模型基础上,重新修改了底层的模块,方便大家轻松移植到YoloV8上。 论文:《Poly Kernel Ince…

计算机三级网络技术 选择+大题234笔记

上周停去准备计算机三级的考试啦&#xff0c;在考场上看到题目就知道这次稳了&#xff01;只有一周的时间&#xff0c;背熟笔记&#xff0c;也能稳稳考过计算机三级网络技术&#xff01;

鸿蒙开发学习:【华为支付服务客户端案例】

简介 华为应用内支付服务&#xff08;HUAWEI In-App Purchases&#xff09;支持3种商品&#xff0c;包括消耗型商品、非消耗型商品和订阅型商品。 消耗商品&#xff1a;仅能使用一次&#xff0c;消耗使用后即刻失效&#xff0c;需再次购买。非消耗商品&#xff1a;一次性购买…

计算机常见的知识点(3)

计算机系统 系统的构成 一个完整的计算机系统是由硬件和软件组成 硬件是由运算器、控制器、存储器、输入设备、输出设备五部分组成 其中&#xff1a;中央处理器(简称CPU)运算器控制器 主机中央处理器主存储器 计算机软件包括计算机本身运行所需要的系统软件和用户完成任务…

Mybatis中显示插入数据成功,但在数据库中却没有显示插入的数据

1、在mybatis-config.xml中查看是否添加了JDBC&#xff0c;并引入了映射文件 2、在测试文件中&#xff0c;结尾是否添加提交事务&#xff1a;sqlSession.commit() 添加了这一步就能够将数据提交到数据库中&#xff0c;最后再关闭事务&#xff1a;sqlSession.close() * 如果运…

JWT原理分析

为什么会有JWT的出现&#xff1f; 首先不得不提到一个知识叫做跨域身份验证&#xff0c;JWT的出现就是为了更好的解决这个问题&#xff0c;但是在没有JWT的时候&#xff0c;我们一般怎么做呢&#xff1f;一般使用Cookie和Session&#xff0c;流程大体如下所示&#xff1a; 用…

手撕算法-买卖股票的最佳时机 II(买卖多次)

描述 分析 使用动态规划。dp[i][0] 代表 第i天没有股票的最大利润dp[i][1] 代表 第i天持有股票的最大利润 状态转移方程为&#xff1a;dp[i][0] max(dp[i-1][0], dp[i-1][1] prices[i]); // 前一天没有股票&#xff0c;和前一天有股票今天卖掉的最大值dp[i][1] max(dp[i-1…

Linux查看磁盘空间

查看磁盘空间 df -h 查看目录所占空间 du -sh [目录] 查看当前目录下, 所有目录所占空间 (一级目录) find . -maxdepth 1 -type d -exec du -sh {} \;-maxdepth 1 查看的目录深度是1级, 2则是2级