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

news2024/10/1 1:29:28

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/2181204.html

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

相关文章

新质农业——水资源可持续管理

橙蜂智能公司致力于提供先进的人工智能和物联网解决方案&#xff0c;帮助企业优化运营并实现技术潜能。公司主要服务包括AI数字人、AI翻译、埃域知识库、大模型服务等。其核心价值观为创新、客户至上、质量、合作和可持续发展。 橙蜂智农的智慧农业产品涵盖了多方面的功能&…

基于SpringBoot+Vue的服装销售管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

C++ | Leetcode C++题解之第437题路径总和III

题目&#xff1a; 题解&#xff1a; class Solution { public:unordered_map<long long, int> prefix;int dfs(TreeNode *root, long long curr, int targetSum) {if (!root) {return 0;}int ret 0;curr root->val;if (prefix.count(curr - targetSum)) {ret pref…

CaChe的基本原理

目录 一、Cache的定义与结构 二、Cache的工作原理 三、Cache的映射与替换策略 四、Cache的写操作处理 Cache&#xff0c;即高速缓冲存储器&#xff0c;是计算机系统中位于CPU与主存之间的一种高速存储设备。它的主要作用是提高CPU对存储器的访问速度&#xff0c;从而优化系…

YOLOv8改进 - 注意力篇 - 引入SCAM注意力机制

一、本文介绍 作为入门性篇章&#xff0c;这里介绍了SCAM注意力在YOLOv8中的使用。包含SCAM原理分析&#xff0c;SCAM的代码、SCAM的使用方法、以及添加以后的yaml文件及运行记录。 二、SCAM原理分析 SCAM官方论文地址&#xff1a;SCAM文章 SCAM官方代码地址&#xff1a;SC…

解决 Macos下 Orbstack docker网络问题

两种解决方法&#xff0c;第一种开代理 参考 —— 但是我这一种没成功&#xff0c;第二种方法是换镜像源 { "registry-mirrors": ["http://hub-mirror.c.163.com","https://docker.mirrors.ustc.edu.cn","https://mirrors.tencent.com&q…

安防监控/视频系统EasyCVR视频汇聚平台如何过滤134段的告警通道?

视频汇聚/集中存储EasyCVR安防监控视频系统采用先进的网络传输技术&#xff0c;支持高清视频的接入和传输&#xff0c;能够满足大规模、高并发的远程监控需求。平台支持国标GB/T 28181协议、部标JT808、GA/T 1400协议、RTMP、RTSP/Onvif协议、海康Ehome、海康SDK、大华SDK、华为…

大麦演唱会门票

切勿再令您所爱的人耗费高昂的价格去购置黄牛票 ⚠️核心内容参考: 据悉&#xff0c;于购票环节&#xff0c;大麦凭借恶意流量清洗技术&#xff0c;于网络层实时甄别并阻拦凭借自动化手段发起下单请求的流量&#xff0c;强化对刷票脚本、刷票软件以及虚拟设备的识别能力&#…

开源 AI 智能名片 2+1 链动模式 S2B2C 商城小程序的数据运营策略与价值创造

一、引言 1.1 研究背景 在当今数字化时代&#xff0c;数据运营已成为企业发展的核心驱动力。开源 AI 智能名片 21 链动模式 S2B2C 商城小程序作为一种创新的营销工具&#xff0c;与数据运营紧密相连。该小程序通过集成人工智能、大数据分析等先进技术&#xff0c;能够实时收集…

【问题解决】Xshell终端双击或者选中文字自动发送Ctrl+C

问题 在xshell终端&#xff0c;当鼠标双击或者选中一行文字时&#xff0c;xshell会自动发送一个 CtrlC 的命令。如下图&#xff1a; 原因 已知可能会导致这个问题的软件&#xff0c;关掉就没问题了&#xff1a; 有道词典金山词典词霸秒译bing翻译钉钉AI助理360极速搜索… …

Python保留数据删除Excel单元格的函数和公式

在分析处理Excel表格时&#xff0c;我们可能需要使用各种公式或函数对表格数据进行计算&#xff0c;从而分析出更多的信息。但在展示、分享或再利用分析结果时&#xff0c;我们可能需要将含有公式的单元格转换为静态数值&#xff0c;从而简化数据、保护计算结果不被更改&#x…

(c++)内存四区:1.代码区2.全局区(静态区)3.栈区4.堆区

//内存四区&#xff1a;1.代码区 2.全局区 3.栈区 4.堆区 1.放在代码区的有&#xff1a;1.写的代码&#xff1a;只读的、共享的、存放的二进制机器指令、由操作系统直接管理 2.放在全局区的有&#xff1a;1.全局的&#xff08;变量或常量&#xff09; 2.静态的&#xff0…

【毕业/转行】想从事GIS开发工程师?如何规划?

既然是GIS开发&#xff0c;那就离不开学习编程 那如何学习才能掌握呢?如何才能达到企业的用人标准? 给大家梳理了学习的路线&#xff0c;想从事gis开发的小伙伴可以直接按这个路线学习! 共分为6大阶段&#xff0c;让你从纯小白到成熟的三维GIS开发工程师! 大纲&#xff1a…

Python:import语句的使用(详细解析)(一)

相关阅读 Pythonhttps://blog.csdn.net/weixin_45791458/category_12403403.html?spm1001.2014.3001.5482 import语句是Python中一个很重要的机制&#xff0c;允许在一个文件中访问另一个文件的函数、类、变量等&#xff0c;本文就将进行详细介绍。 在具体谈论import语句前&a…

linux驱动编程——等待队列

一、等待队列 可实现调用read函数时阻塞等。 1、流程 &#xff08;1&#xff09;初始化等待队列头&#xff08;带参宏&#xff09; init_waitqueue_head(q) 等待队列头wq数据类型&#xff1a; wait_queue_head_t&#xff0c;等待条件condition&#xff1a;int型变量。 &…

Actor 并发控制模型

目录 一、模型概述 二、模型特点 三、模型组成 四、模型优势 五、应用实例 一般来说&#xff0c;我们有两种策略来在并发线程中实现通信&#xff1a;共享内存和消息传递。大多数传统语言&#xff0c;并发线程之间的通信使用的都是共享内存&#xff0c;共享内存最大的问题就…

分糖果C++

题目&#xff1a; 样例解释&#xff1a; 样例1解释 拿 k20 块糖放入篮子里。 篮子里现在糖果数 20≥n7&#xff0c;因此所有小朋友获得一块糖&#xff1b; 篮子里现在糖果数变成 13≥n7&#xff0c;因此所有小朋友获得一块糖&#xff1b; 篮子里现在糖果数变成 6<n7&#xf…

为本地生活赛道从业者赋能,易播易赚开启“抖音直播分享会”

9月22日&#xff0c;由杭州易播易赚科技有限公司主办的“抖音直播分享会”在杭州市富阳区召开&#xff0c;此次会议吸引了来自全国各地的抖音直播从业者、有志于加入抖音直播事业的创业者以及行业内知名专家齐聚一堂&#xff0c;共同探讨行业发展趋势、分享实战经验&#xff0c…

tomcat版本升级导致的umask问题

文章目录 1、问题背景2、问题分析3、深入研究4、umask4.1、umask的工作原理4.2、umask的计算方式4.3、示例4.4、如何设置umask4.5、注意事项 1、问题背景 我们的java服务是打成war包放在tomcat容器里运行的&#xff0c;有一天我像往常一样去查看服务的日志文件&#xff0c;却提…

Mysql高级篇(中)——多版本并发控制 MVCC

多版本并发控制 MVCC 一、概述二、基本原理三、实现原理四、示例解释五、MVCC 优点六、现实中的实现七、MVCC 三剑客1. ReadView2. Undo Log3. Purge4. 三者之间的关系&#xff1a;5. 示例6. 总结 八、MVCC 整体操作流程⭐、readview1. 作用2. 工作机制3. 数据版本的可见性判断…