Web APIs 4:事件流、事件委托

news2024/9/27 5:41:38

Web APIs 3(事件流、事件委托)

1.事件流
  • 事件流:事件完整执行过程中的流动路径
  • 捕获阶段:从DOM根元素开始去执行对应的事件(从外到里)
DOM.addEventListener(事件类型,事件处理函数,是否使用捕获机制)

eg : 分别给document、父级div、子机div都注册同一个事件监听,则从外到内执行

  • 冒泡阶段:当一个元素的事件被触发时,同样的事件将会在该元素的所有祖先元素中依次被触发(当一个元素触发事件后,会依次向上调用所有父级元素的同类型事件)

  • 阻止冒泡

    • 问题:默认有冒泡模式的存在,容易导致事件影响父级元素
    • 需求:想把事件就限制在当前元素内,需要阻止事件冒泡
    • 前提:阻止事件冒泡要先拿到事件对象
    • 语法:阻止事件流,不仅对冒泡有用,对捕获也有用
    事件对象.stopPropagation()
    

    示例:点击son盒子时,事件流被阻止,只会弹出“我是儿子”

    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Document</title>
      <style>
        .father {
          width: 400px;
          height: 400px;
          background-color: aqua;
        }
    
        .son {
          width: 200px;
          height: 200px;
          background-color: blueviolet;
        }
      </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('我是爷爷')
        })
        fa.addEventListener('click', function () {
          alert('我是爸爸')
        })
        son.addEventListener('click', function (e) {
          alert('我是儿子')
          e.stopPropagation()
        })
      </script>
    </body>
    
  • 解绑事件

    元素.removeEventListener(‘事件类型’,事件处理函数)

    • 注意:匿名函数无法被解绑
    btn.removeEventListener('click',函数名)
    
2.事件委托
  • 优点:减少时事件监听注册的次数,提高程序性能

  • 原理:利用事件冒泡的特点,给父元素注册事件,当我们触发子元素的时候,会冒泡到父元素身上,从而触发父元素的事件

  • 实现:事件对象.target可以获得真正触发事件的元素

    <body>
      <ul>
        <li>第1个孩子</li>
        <li>第2个孩子</li>
        <li>第3个孩子</li>
        <li>第4个孩子</li>
        <li>第5个孩子</li>
        <p>我不需要变色</p>
      </ul>
      <script>
        const ul = document.querySelector('ul')
        ul.addEventListener('click', function (e) {
          console.log(e.target); //点击的对象
          //只要点li变色,p不要变色
          if (e.target.tagName === 'LI') {
            e.target.style.color = 'red'
          }
        })
      </script>
    </body>
    
  • 阻止默认行为的发生:e.preventDefault()

    eg:点击提交默认直接提交,但表单信息有误时不允许提交,就需要使用该阻止方式

    <body>
      <form action="http://www.baidu.com">
        <input type="submit" value="提交">
      </form>
      <script>
        const form = document.querySelector('form')
        form.addEventListener('click', function (e) {
          e.preventDefault()
        })
      </script>
    </body>
    
3.其他事件
  • 页面加载事件

    • 定义:加载外部资源(如图片、外联CSS、JavaScript)加载完毕时触发的事件
    • 使用场景:需要等页面资源全部处理完再做一些事情,eg:如果将script代码写到head中,直接找dom元素找不到
    • load事件:监听页面所有资源加载完毕:给window添加load事件(当然也可以给针对某个资源绑定load事件)
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Document</title>
      <script>
        //等待页面所有资源加载完毕就会执行回调函数
        window.addEventListener('load', function () {
          const btn = document.querySelector('button')
          btn.addEventListener('click', function () {
            alert("你好")
          })
        })
      </script>
    </head>
    
    <body>
      <button>点击</button>
    </body>
    
    • DOMContentLoaded事件:当HTML文档被完全加载和解析完后,无需等待样式表、图像等完全加载:给document添加DOMContenLoaded事件
  • 元素滚动事件

    • 滚动条滚动触发的事件
    • scroll事件:监听整个页面滚动(也可以监听某个元素滚动)
    <script>
        window.addEventListener('scroll', function () {
          console.log("滚动")
        })
      </script>
    
    • 获取滚动位置的属性:scrollLeft|scrollTop(可读写)
    <script>
        const div = document.querySelector('div')
        window.addEventListener('scroll', function () {
          //document.documentElement返回HTML元素
          const n = document.documentElement.scrollTop
          console.log(n)
          if (n >= 100) {
            div.style.display = 'block'
          } else {
            div.style.display = 'none'
          }
        })
      </script>
    
    • 滚动到指定坐标:元素.scrollTo(x,y)
  • 页面尺寸事件

    • 窗口尺寸发生改变时触发事件
    • resize
    <script>
        window.addEventListener('resize', function () {
          console.log(11);
        })
      </script>
    
    • 检测屏幕尺寸——获取元素宽高
      • clientWidth、clientHeight(不包含边框,margin,滚动条等,只读)
4.元素尺寸位置
  • 获取宽高:offsetWidth和offsetHeight(包含边框,只读)
  • 获取位置:offsetLeft和offsetTop(只读):元素距离父级元素左上距离

案例:实现滚动到秒杀模块位置后,顶部导航滑动出现,再返回到秒杀模块上方后,顶部导航隐藏

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }

        .content {
            overflow: hidden;
            width: 1000px;
            height: 3000px;
            background-color: pink;
            margin: 0 auto;
        }

        .backtop {
            display: none;
            width: 50px;
            left: 50%;
            margin: 0 0 0 505px;
            position: fixed;
            bottom: 60px;
            z-index: 100;
        }

        .backtop a {
            height: 50px;
            width: 50px;
            background: url(./images/bg2.png) 0 -600px no-repeat;
            opacity: 0.35;
            overflow: hidden;
            display: block;
            text-indent: -999em;
            cursor: pointer;
        }

        .header {
            position: fixed;
            top: -80px;
            left: 0;
            width: 100%;
            height: 80px;
            background-color: purple;
            text-align: center;
            color: #fff;
            line-height: 80px;
            font-size: 30px;
            transition: all .3s;
        }

        .sk {
            width: 300px;
            height: 300px;
            background-color: skyblue;
            margin-top: 500px;
        }
    </style>
</head>
<body>
    <div class="header">我是顶部导航栏</div>
    <div class="content">
        <div class="sk">秒杀模块</div>
    </div>
    <div class="backtop">
        <img src="../images/close2.png" alt="">
        <a href="javascript:;"></a>
    </div>
    <script>
        const sk = document.querySelector('.sk')
        const header = document.querySelector('.header')
        window.addEventListener('scroll', function () {
            const n = document.documentElement.scrollTop
           /* if (n >= sk.offsetTop) {
                header.style.top = 0
            } else {
                header.style.top = '-80px'
            } */
            header.style.top = n >= sk.offsetTop ? 0 : '-80px'
        })
    </script>
</body>

</html>
  • 总结:
属性作用说明
scrollLeft|scrollTop被卷去的头部和左侧配合页面滚动使用,可读写
clientWidth|clientHeight获取元素宽度和高度不包含border,margin,滚动条,用于获取元素大小,只读属性
offsetWidth|offsetHeight获得元素宽度和高度包含border、padding,滚动条等,只读
offsetLeft|offsetTop获取元素距离自己定位父级元素的左、上距离获取元素位置的时候使用,只读

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

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

相关文章

【数据结构初阶】排序算法(上)插入排序与选择排序

文章目录 1.排序概念及运用1. 1 概念1. 2 运用1.3 常见排序算法 2. 插入排序2. 1 直接插入排序2. 2 希尔排序2. 2. 1 希尔排序的时间复杂度 3. 选择排序3. 1 直接选择排序3. 2 堆排序3. 3 Top-K问题 1.排序概念及运用 1. 1 概念 排序&#xff1a;所谓排序&#xff0c;就是使一…

小米2025届软件开发工程师(C/C++/Java)(编程题AK)

选择题好像也是25来个 编程题 T1 题目描述 小明喜欢解决各种数学难题。一天&#xff0c;他遇到了一道有趣的题目:他需要帮助他的朋友们完成一个排序任务。小明得到两个长度为 n 的数组a[]和b[]。他可以在两个数组对应位置进行交换&#xff0c;即选定一个位置 i &#xff0c…

PCL 求八叉树的体素中心

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 八叉树构建 2.1.2 获取体素中心 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#xff08;长期更新&#xf…

注意力机制篇 | YOLOv8改进之在C2f模块引入EffectiveSE注意力模块 | 基于SE注意力

前言:Hello大家好,我是小哥谈。EffectiveSE(Effective Squeeze-Excitation) 是一种改进的通道注意力模块,其目的是在保持模型性能的同时减少计算复杂性和信息丢失。它基于原始的 Squeeze-Excitation (SE) 模块,但通过一些关键的改进来提高效率。🌈 目录 🚀1.基…

前端——flex布局

flex布局——弹性布局 传统布局: 浮动 定位 行内块等 1. flex布局 方法简单 不需要计算 能自动分配父级里面的子元素排版 对齐方式等等 >flex布局 可以适应不同屏幕布局 2. flex布局使用 - 给父级盒子 display: flex 开启弹性盒模型 - 子元素就会默…

栈的基本概念和及具体实现

今天给大家介绍一下栈的基本概念及实现&#xff01;话不多说&#xff0c;立即开始&#xff01; 1.栈的概念&#xff1a; 一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈 顶&#xff0c;另一端称为栈底。栈中的…

计算机网络--TCP、UDP抓包分析实验

计算机网络实验 目录 实验目的 实验环境 实验原理 1、UDP协议 2、TCP协议 实验具体步骤 实验目的 1、掌握使用wireshark工具对UDP协议进行抓包分析的方法&#xff0c;掌握UDP协议的报文格式&#xff0c;掌握UDP协议校验和的计算方法&#xff0c;理解UDP协议的优缺点&am…

vant van-pull-refresh + van-list实现list列表支持搜索和下拉刷新

1 介绍 在使用 van-pull-refresh van-list实现list列表下拉刷新时遇到几个问题在这里进行一个总结。 2 出现的问题 问题一&#xff1a;当van-pull-refresh van-list组合使用时&#xff0c;下拉刷新会调用两个加载图标。 解答&#xff1a;去除van-pull-refresh加载图标&…

leetcode-189:轮转数组

给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 3 步: [5,6,7,1,2,3,4…

快讯:腾讯轻量服务器四周年,最低一折续费,还有免费升配

最近腾讯云轻量服务器四周年庆开始了&#xff0c;免费升级配置&#xff0c;续费服务器最低一折。 最低一折续费&#xff1a; 持有多久的轻量服务器决定续费几折&#xff0c;已经持有四年就是一折&#xff0c;三年1.5折以此类推。 免费升级配置&#xff1a; 2-4-5免费升级到…

String类常用的方法

源代码&#xff1a; 输出结果&#xff1a;

Linux 之 logrotate 【日志分割】

简介 logrotate 是一个用于管理日志文件的工具。它可以自动对日志文件进行轮转、压缩、删除等操作&#xff0c;以防止日志文件无限增长占用过多磁盘空间。logrotate 通常作为一个守护进程定期运行&#xff0c;也可以通过 cron 任务来调度执行 工作原理 按照配置文件中的规则…

【Mysql多数据源实现读写分离的几种方案】

文章目录 一.什么是MySQL 读写分离二.读写分离的几种实现方式(手动控制)1.基于Spring下的AbstractRoutingDataSource1.yml2.Controller3.Service实现4.Mapper层5.定义多数据源6.继承Spring的抽象路由数据源抽象类&#xff0c;重写相关逻辑7. 自定义注解WR&#xff0c;用于指定当…

客户端数JSON据库SQL操作功能实现代码-———未来之窗行业应用跨平台架构

一、前端json结构化查询优点 以下是前端本地化查询的一些优点&#xff1a; 1. 快速响应&#xff1a;无需通过网络请求从服务器获取数据&#xff0c;查询结果能够立即返回&#xff0c;提供了几乎零延迟的用户体验&#xff0c;使应用更加流畅和响应迅速。 2. 离线可用性&#x…

9.4 Linux_I/O_访问目录、文件属性

访问目录 1、打开关闭目录 打开目录函数声明如下&#xff1a; //1.直接打开指定路径的目录文件 DIR *opendir(const char *name); //2.先用open打开目录文件&#xff0c;再用该函数访问目录文件 DIR *fdopendir(int fd); 返回值&#xff1a;成功返回指向打开的目录文件的结…

ELK-05-skywalking监控SpringCloud服务日志

文章目录 前言一、引入依赖二、增加日志配置文件三、打印日志四、skywalking网页查询链路五、日志收集5.1 修改logback-spring.xml5.2 重启SpringCloud服务并请求test接口5.3 查看skywalking网页的Log 总结 前言 基于上一章节&#xff0c;现在使用skywalkin监控SpringCloud服务…

JWT令牌技术介绍及使用

一、JWT介绍 JWT是JSON Web Token的缩写&#xff0c;即JSON Web令牌&#xff0c;是一种自包含令牌。 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。 JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息&#xff0c;以便于从资源服务…

D. Determine Winning Islands in Race (cf div2,dp、图论最短路)

D. Determine Winning Islands in Race 思路: bfs找到E到达每个点的最短时间t[i]。 如果E要超过B&#xff0c;那么一定要借助辅助桥&#xff0c;从而获胜。 假设有u->v的辅助桥&#xff0c;E能通过这个桥超过B的条件是: s>u 且 t[v] < v-s 即 s的取值要为[u1,v-t[v]-…

C++核心编程和桌面应用开发 第七天(运算符重载 智能指针)

目录 1.数组类 2.运算符重载 2.1加号运算符 2.1.1成员函数实现 2.1.2全局函数实现 2.1.3加号重载 2.2左移运算符 2.3递增运算符 2.4指针运算符 2.5赋值运算符 1.数组类 //默认构造函数 MyArray::MyArray() {m_Size 0;m_Capacity 100;pAddress new int[m_Capacity]…

【有啥问啥】深度解析迁移学习(Transfer Learning)

深度解析迁移学习&#xff08;Transfer Learning&#xff09; 在机器学习领域&#xff0c;迁移学习&#xff08;Transfer Learning&#xff09;作为一种强大的技术&#xff0c;正广泛应用于各种实际场景中。本文将详细解析迁移学习的基本概念、原理、分类、应用场景以及具体实…