js教程(8)

news2024/11/16 9:34:55

一、事件流

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.coloradmin.cn/o/1538664.html

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

相关文章

分布式Raft原理详解,从不同角色视角分析相关状态

分布式Raft原理详解&#xff0c;从不同角色视角分析相关状态 1. CAP定理2.Raft 要解决的问题3. Raft的核心逻辑3.1. Raft的核心逻辑2.1. 复制状态机2.2. 任期 Term2.3. 任期的意义&#xff1a;逻辑时钟2.4 选举定时器 3. Leader选举逻辑4. 从节点视角查看Leader选举4.1. Follow…

备考ICA----Istio实验7---故障注入 Fault Injection 实验

备考ICA----Istio实验7—故障注入 Fault Injection 实验 Istio 的故障注入用于模拟应用程序中的故障现象&#xff0c;以测试应用程序的故障恢复能力。故障注入有两种: 1.delay延迟注入 2.abort中止注入 1. 环境准备 kubectl apply -f istio/samples/bookinfo/platform/kube/…

计算机二级总结

1.结构体改值&#xff1a; ②第二套1 对形参b所指结构体的数据进行修改 1.结构体传参传地址&结构体 2.在函数里用->,在main里用.&#xff0c;数组用. ②第五套1 对形参b所指结构体的数据进行修改 返回指针变量的地址&#xff0c;不用取*&#xff0c;所以用struct stud…

唯众物联网安装调试员实训平台物联网一体化教学实训室项目交付山东技师学院

近日&#xff0c;山东技师学院物联网安装调试员实训平台及物联网一体化教学实训室采购项目已顺利完成交付并投入使用&#xff0c;标志着学院在物联网技术教学与实践应用方面迈出了坚实的一步。 山东技师学院作为国内知名的技师培养摇篮&#xff0c;一直以来致力于为社会培养高…

二叉树的层次遍历经典问题-算法通关村

二叉树的层次遍历经典问题-算法通关村 1 层次遍历简介 广度优先在面试里出现的频率非常高&#xff0c;整体属于简单题。广度优先又叫层次遍历&#xff0c;基本过程如下&#xff1a; 层次遍历就是从根节点开始&#xff0c;先访问根节点下面一层全部元素&#xff0c;再访问之后…

阿里云OSS分布式存储

目录 &#x1f9c2;1.OSS开通 &#x1f32d;2.头像上传整合OSS &#x1f68d;2.1.引入依赖 &#x1f68d;2.2添加配置 &#x1f68d;2.3创建配置类 &#x1f68d;2.4添加实现类 &#x1f68d;2.5controller调用接口 &#x1f68d;2.6postman测试 1.OSS开通 1.登…

Apache James数据库存储用户信息的密码加密问题

项目场景 Apache James邮件服务器使用数据库来存储用户信息的密码加密问题&#xff1a; 将James的用户改为数据库存储James密码是如何加密验证的 1.将James的用户改为数据库存储 1、修改存储方式 找到james-2.3.2\apps\james\SAR-INF\config.xml 找到<users-store>标…

能被整除的数

给定一个整数 n 和 m个不同的质数 p1,p2,…,pm。 请你求出 1∼n中能被 p1,p2,…,pm 中的至少一个数整除的整数有多少个。 输入格式 第一行包含整数 n 和 m。 第二行包含 m 个质数。 输出格式 输出一个整数&#xff0c;表示满足条件的整数的个数。 数据范围 1≤n≤10^5 …

30V转5V 1A 30降压12V 1A DCDC低电压恒压IC 车充芯片-H4110

30V转5V和30V转12V的DCDC低电压恒压IC&#xff08;也称为降压恒压芯片或车充芯片&#xff09;工作原理如下&#xff1a; 输入电压识别&#xff1a;芯片首先识别输入的30V电压&#xff0c;并准备进行转换。 PWM控制&#xff1a;芯片内部的控制逻辑生成PWM信号。这个信号用于控制…

6个免费的ChatGPT网站

AI 大模型的出现给时代带来了深远的影响&#xff1a; 改变了产业格局&#xff1a;AI 大模型的发展推动了人工智能技术在各行业的广泛应用&#xff0c;改变了传统产业的运作方式&#xff0c;促进了新兴产业的崛起&#xff0c;如智能驾驶、医疗健康、金融科技等。提升了科学研究…

2024-3-22-Qtday3作业

1> 思维导图 2> 要求&#xff1a; 使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否…

家用路由器和企业路由器的区别?

一、家用路由器 家用路由器路由器交换机 它只有一个WAN口和一个LAN口&#xff0c;WAN口接公网一个地址&#xff0c;LAN口接你电脑一个IP地址&#xff0c;完全符合路由器的设计&#xff0c;而因为家里如果用了&#xff0c;说明要接多个电脑&#xff0c;那么如果还需要对每个接口…

Web核心简介

简介 web&#xff1a;全球广域网&#xff0c;也称万维网(www)&#xff0c;能够通过浏览器访问的网站 JavaWeb&#xff1a;是用Java技术来解决相关web互联网领域的技术栈 JavaWeb技术栈 B/S架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式&#xff0c;它的…

2024年超声波清洗机品牌哪家好?实力担当超声波清洗机大集合

随着佩戴眼镜人群越来越多&#xff0c;眼镜清洗的需求也是越来越大了&#xff01;也许有人佩戴了十几年眼镜都不知道超声波清洗机是要清洗的&#xff0c;也许有人一开始就注重眼镜的清洗。其实眼镜清洗是一件很简单的事情&#xff0c;可以用超声波清洗机来清洗眼镜。目前超声波…

LeetCode Python - 70. 爬楼梯

目录 题目描述解法方法一&#xff1a;递推方法二&#xff1a;矩阵快速幂加速递推方法三 运行结果方法一方法二方法三 题目描述 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1…

伊理威科技:抖音开网店新手刚做选啥品

在数字浪潮中&#xff0c;抖音不仅是展示才艺的舞台&#xff0c;更是创业者的新天地。新手若想在这片热土上开垦网店&#xff0c;选品便是首要课题。选择产品如同种下希望的种子&#xff0c;既要考量土壤肥沃度&#xff0c;也得预测风雨适宜期。 兴趣与专长是选品的罗盘。热爱所…

Data Interpreter: An LLM Agent For Data Science 论文解读

论文地址&#xff1a;https://arxiv.org/abs/2402.18679 Github&#xff1a;MetaGPT: The Multi-Agent Framework 数据解释器&#xff08;Data Interpreter&#xff09;是一个基于大型语言模型&#xff08;LLM&#xff09;的代理&#xff0c;专门为解决数据科学问题而设计。它…

Flume详解(2)

Flume Sink HDFS Sink 将数据写到HDFS上。数据以文件形式落地到HDFS上&#xff0c;默认是以FlumeData开头&#xff0c;可以通过hdfs.filePrefix来修改 HDFS Sink默认每隔30s会滚动一次生成一个文件&#xff0c;因此会导致在HDFS上生成大量的小文件&#xff0c;实际过程中&am…

【力扣刷题日记】603.连续空余座位

前言 练习sql语句&#xff0c;所有题目来自于力扣&#xff08;https://leetcode.cn/problemset/database/&#xff09;的免费数据库练习题。 今日题目&#xff1a; 603.连续空余座位 表&#xff1a;Cinema 列名类型seat_idintfreebool Seat_id 是该表的自动递增主键列。 在…

数学建模(层次分析法 python代码 案例)

目录 介绍&#xff1a; 模板&#xff1a; 例题&#xff1a;从景色、花费、饮食&#xff0c;男女比例四个方面去选取目的地 准则重要性矩阵&#xff1a; 每个准则的方案矩阵&#xff1a;​ 一致性检验&#xff1a; 特征值法求权值&#xff1a; 完整代码&#xff1a; 运行结…