JS-Web API -day03

一、事件流

1.1 事件流与两个阶段说明

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

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

捕获阶段:Document - Element html - Elementbody - Element div 简单来说就是父到子

冒泡阶段:Element div - Elementbody - Element html - Document 简单来说就是子到父

事件冒泡的过程与事件捕获完全相反

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

事件对象.stopPropagation()

1.2 事件捕获

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

语法:

        元素对象.addEventListener('事件类型',function (){}, 是否使用捕获机制)

说明:

        addEventListener的第三个参数传入true代表是捕获阶段触发

        若传入false代表冒泡阶段触发,默认就是false

        若是使用L0事件监听,则只有冒泡阶段,没有捕获

例:

<style>
  .father{
    width: 500px;
    height: 300px;
    background-color: lightskyblue;
  }
  .son{
    width: 200px;
    height: 100px;
    background-color: black;
  }
</style>
<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>

弹出顺序 我是一级,我是二级,我是三级。

1.3 事件冒泡

定义:

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

事件冒泡是默认存在的

L2事件监听的第三个参数默认传的就是false,代表这个事件进行冒泡

例:

<style>
  .father{
    width: 500px;
    height: 300px;
    background-color: lightskyblue;
  }
  .son{
    width: 200px;
    height: 100px;
    background-color: black;
  }
</style>
<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()  // 借助事件对象 进行流的阶段
  })
  // 默认的就是false  就是冒泡   冒泡同名事件
  // 三级  二级 一级

  // 阻止冒泡 或者 捕获 就是  事件对象.stopPropagation()
</script>
</body>

触发顺序:

        我是三级,我是二级,我是一级

1.4 阻止冒泡

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

语法:

        事件对象.stopPropagation() 不仅可以阻止事件冒泡还和阻止事件捕获。

<style>
  .father{
    width: 500px;
    height: 300px;
    background-color: lightskyblue;
  }
  .son{
    width: 200px;
    height: 100px;
    background-color: black;
  }
</style>
<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()  // 借助事件对象 进行流的阶段
  })

  // 阻止冒泡 或者 捕获 就是  事件对象.stopPropagation()
</script>
</body>

还有其他的阻止默认行为,比如表单的默认提交,链接的跳转,表单域跳转。

如:事件对象.preventDefault()

<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>

1.5 解绑事件

对应L0的on事件 可以直接使用null覆盖就可以实现事件的解绑

<body>
<button>按钮</button>
<script>
  const btn = document.querySelector('button')
  // L0的解绑方式
  btn.onclick = function (){
    alert('点击了')
  }
  btn.onclick = null  // 给一个空对象 进行解绑
</script>
</body>

addEventListener方式,必须使用:removeEventListener(事件类型, 事件处理函数, [获取捕获或者冒泡阶段])

<body>
<button>按钮</button>
<script>
  const btn = document.querySelector('button')
  //最新的 L2
  function fn() {
    alert('点击了')
  }
  btn.addEventListener('click',fn)
  // L2 事件解绑  函数不能使用匿名函数
  btn.removeEventListener('click',fn)
</script>
</body>

注: 匿名函数无法被解绑

二、事件委托

定义:

        事件委托是利用事件流的特征解决一些开发需求的知识技巧,可以同时给多个元素注册相同事件。

优点:

        减少注册次数,可以提高程序性能

原理:

        事件委托其实是利用事件冒泡的特点。给父元素注册事件,当我们触发子元素的时候,会冒泡到父元素身上,从而触发父元素的事 件

实现

        事件对象.target 是获取点击触发事件的元素对象

        事件对象.target. tagName 可以获得真正触发事件的元素的名称(大写),如li的tagName就是‘LI’

<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才会有效果  // 找到真正触发的元素
    e.target.tagName === 'LI' ? e.target.style.color = 'red' : null
  })
</script>
</body>

三、其他事件

3.1 页面加载事件

页面加载事件一

定义:加载外部资源(如图片、外联CSS和JavaScript等)加载完毕时触发的事件

事件名:load

监听页面所有资源加载完毕:给window添加load事件

注:

        不光可以监听整个页面资源加载完毕,也可以针对某个资源绑定load事件

<head>
    <meta charset="UTF-8">
    <title>页面加载事件</title>
<!--JS写在上面 必须要用的加载事件-->
  <script>
    // 监听整个页面资源加载完毕
    // 等待页面所有资源加载完成后,再去执行回调函数  load
    //给window 添加 load事件
    window.addEventListener('load',function (){
      const btn = document.querySelector('button')
      btn.addEventListener('click',function (){
        alert('点击了 按钮')
      })
    })
    // 针对某个资源绑定 load 事件
    document.querySelector('img').addEventListener('load',function (){
      // 等待图片加载完毕,再去执行里面的代码
    })
  </script>
</head>
<body>
<button>按钮</button>
<img src="">
</body>

页面加载事件二

定义:当初始的 HTML 文档被完全加载和解析完成之后,DOMContentLoaded 事件被触发,而无需等待样式表、图像等完全加载

事件名:DOMContentLoaded

监听页面DOM加载完毕:给 document 添加 DOMContentLoaded事件

<head>
    <meta charset="UTF-8">
    <title>页面加载事件</title>
<!--JS写在上面 必须要用的加载事件-->
  <script>
    //监听页面DOM加载完毕
    //给document添加DOMContentLoaded事件
    // 无需等待样式表 图像等完全加载
    document.addEventListener('DOMContentLoaded',function (){
      // 执行的操作
    })
  </script>
</head>
<body>
<button>按钮</button>
<img src="">
</body>

3.2 页面滚动事件

使用场景:很多网页需要检测用户把页面滚动到某个区域后做一些处理, 比如固定导航栏,比如返回顶部

定义:滚动条在滚动的时候持续触发的事件

事件名:scroll

作用:监听整个页面滚动,给 window 或 document 添加 scroll 事件(监听某个元素的内部滚动直接给某个元素加即可)

  // 页面滚动事件
  // 可以给window 也可以给 document 加
  // 检测滚动的距离
  //document.documentElement.scrollTop = 800   被卷去的头部
  window.addEventListener('scroll',function (){
    console.log('gun了')

3.2.1 页面滚动事件-获取位置

属性:scrollLeft和scrollTop

        获取被卷去的大小

        获取元素内容往左、往上滚出去看不到的距离

        这两个值是可读写的

注:

        尽量在scroll事件里面获取被卷去的距离

        获取html 页面的最大标签元素 document.documentElement

        开发中,我们经常检测页面滚动的距离,比如页面滚动100像素,就可以显示一个元素,或者固定一个元素。

<style>
  body {
      padding-left: 100px;
    height: 3000px;
  }
  div {
      overflow: scroll;
      margin: 0 auto;
      height: 500px;
      width: 300px;
      border: 1px solid black;
  }
</style>
<body>
<div>里面有很多文字里面有很多文字里面有很多文字里面有很多文字里面有很多文字里面有很多文字里面有很多文字里面有很多文字
    里面有很多文字里面有很多文字里面有很多文字里面有很多文字里面有很多文字里面有很多文字里面有很多文字里面有很多文字
    里面有很多文字里面有很多文字里面有很多文字里面有很多文字里面有很多文字里面有很多文字里面有很多文字里面有很多文字
    里面有很多文字里面有很多文字里面有很多文字里面有很多文字里面有很多文字里面有很多文字
    里面有很多文字里面有很多文字里面有很多文字里面有很多文字里面有很多文字里面有很多文字里面有很多文字......
</div>
<script>
  window.addEventListener('scroll',function (){
    // 获取html 页面的最大标签元素 document.documentElement
    const n = document.documentElement.scrollTop  // 是数字型数据 可读写
    if (n>= 100){
        div.style.display = 'block'
    }  else {
        div.style.display = 'none'
    }
  })
</script>
</body>

 3.2.2页面滚动事件-滚动到指定的坐标

方法:scrollTo() 方法可把内容滚动到指定的坐标

语法:

        元素对象.scrollTo(x, y)

例:让页面滚动到 y 轴(页面垂直方向)1000像素的位置

window.scrollTo(0, 1000)
// 也相当于
document.documentElement.scrollTop = 0

3.3 页面尺寸事件

事件名:resize,会在窗口尺寸改变的时候触发事件

获取元素宽高

        事件名:clientWidth和clientHeight,获取元素的可见部分宽高(不包含边框,margin,滚动条等)

<style>
  div {
    display: inline-block;
    height: 200px;
    background-color: lightskyblue;
    padding: 10px;
    border: 20px solid black;
  }
</style>
<body>
<div>121235453134532</div>
<script>
  const div = document.querySelector('div');
  // 获取盒子的宽 或者 高  不包含边框 滚动条等
  console.log(div.clientWidth)

  // resize  页面缩放 浏览器窗口 大小发生变化的时候触发的事件
  // 目前更好的是CSS的媒体查询
  window.addEventListener('resize',function (){
    console.log(1)
  })
</script>
</body>

四、元素尺寸与位置

作用:

        就是通过js的方式,得到元素在页面中的位置

获取宽高:

        获取元素的自身宽高、包含元素自身设置的宽高、padding、border

        offsetWidth和offsetHeight

        获取出来的是数值,方便计算

  注意: 获取的是可视宽高, 如果盒子是隐藏的,获取的结果是0

获取位置1:

        获取元素距离自己定位父级元素的左、上距离

        offsetLeft和offsetTop (注意是只读属性)

<style>
  div {
    margin: 100px;
    width: 300px;
    height: 300px;
    border: 1px solid black;
    background-color: lightskyblue;
  }
  div p {
    padding: 50px;
    width: 100px;
    height: 100px;
    background-color: pink;
  }
</style>
<body>
  <div>
    <p></p>
  </div>
<script>
  // 获取元素距离自己定位祖先元素的左offsetLeft 上offsetTop 距离
  // 获取的位置 是包含 边框的
  const  div = document.querySelector('div')
  const p = document.querySelector('p')
  // 外边框 到 最左边的距离  margin + body 的8外边框
  console.log(div.offsetLeft)
  // 加上外边框到最左边的距离 margin + body 的8外边框 + div的1外边框
  console.log(p.offsetLeft)
</script>
</body>

获取位置2:

         元素对象.getBoundingClientRect(),方法返回元素的大小及其相对于视口的位置

<style>
  body {
    height: 2000px;
  }
  div {
    width: 300px;
    height: 300px;
    margin: 100px auto;
    background-color: lightskyblue;
  }
</style>
<body>
<div></div>
<script>
  const div = document.querySelector('div')
  // 是盒子相对于当前视口的位置
  console.log(div.getBoundingClientRect());
</script>
</body>

五、 页面滚动事件和元素尺寸事件的属性总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用LabVIEW的History功能实现队列数据的读取而不清空

在LabVIEW中&#xff0c;有多种方法可以读取队列中的数据而不清空它。使用 Dequeue Element 和 Enqueue Element 函数可以实现读取并重新插入数据回队列&#xff0c;但当需要处理大数据流或需要更动态的解决方案时&#xff0c;这种方法可能会变得繁琐。一个更高效的解决方案是利…

【Redis】Redis入门以及什么是分布式系统{Redis引入+分布式系统介绍}

文章目录 介绍redis的引入 分布式系统单机架构应用服务和数据库服务分离【负载均衡】引入更多的应用服务器节点 单机架构 分布式是什么 数据库分离和负载均衡 理解负载均衡 数据库读写分离 引入缓存 数据库分库分表 引入微服务 介绍 The open source, in-memory data store us…

线上内存泄漏排查思路

“内存泄漏”是开发者最害怕的问题之一&#xff0c;尤其是在高并发、高负载的线上环境中。它往往不易察觉&#xff0c;却能悄悄吞噬系统的性能&#xff0c;最终导致应用崩溃或响应变慢。你是否曾在项目上线后遇到过性能下降或宕机的问题&#xff0c;而问题根源竟然是内存泄漏&a…

【Redis】在ubuntu上安装Redis

文章目录 提权搜索软件包安装修改配置文件ip保护模式配置密码 重新启动服务器使用 redis 自带的客户端来连接服务器 提权 先切换到 root 用户,su 命令切换到 root. 搜索软件包 使用 apt 命令来搜索 redis 相关的软件包 apt search redis 安装 使用 apt 命令安装 redisapt …

人形机器人,自动驾驶“老炮”创业第二站

造一台人形机器人&#xff0c;或许正在成为2025年最炙手可热的事情。 从去年第四季度开始&#xff0c;伴随着大模型应用的深入&#xff0c;具身智能概念被点燃&#xff0c;其中最鲜明的一个特点是&#xff0c;大量自动驾驶大佬的转行加入。 随便说几个比较有分量的&#xff0…

《SwinIR:使用Swin-Transformer图像恢复》学习笔记

paper&#xff1a;2108.10257 GitHub&#xff1a;GitHub - JingyunLiang/SwinIR&#xff1a; SwinIR&#xff1a; 使用 Swin Transformer 进行图像修复 &#xff08;官方仓库&#xff09; 目录 摘要 1、Introduction 2、Related Work 2.1 图像修复 2.2 视觉Transformer…

力扣hot100-->滑动窗口、贪心

你好呀&#xff0c;欢迎来到 Dong雨 的技术小栈 &#x1f331; 在这里&#xff0c;我们一同探索代码的奥秘&#xff0c;感受技术的魅力 ✨。 &#x1f449; 我的小世界&#xff1a;Dong雨 &#x1f4cc; 分享我的学习旅程 &#x1f6e0;️ 提供贴心的实用工具 &#x1f4a1; 记…

Top 30的AI应用产品出海经验分享

榜单说明 本文基于对AI图片产品的分类和流量分析&#xff0c;旨在洞察AI图片应用的出海趋势。以下是分类和收录标准&#xff1a; 分类标准 将AI图片产品分为三大类&#xff1a;图片生成、图片编辑和平面设计。 图片生成&#xff1a;以基于大模型生成图片并展示结果&#xff0…

Hive之加载csv格式数据到hive

场景&#xff1a; 今天接了一个需求&#xff0c;将测试环境的hive数据导入到正式环境中。但是不需要整个流程的迁移&#xff0c;只需要迁移ads表 解决方案&#xff1a; 拿到这个需求首先想到两个方案&#xff1a; 1、将数据通过insert into语句导出&#xff0c;然后运行脚本 …

73,【5】BUUCTF WEB [网鼎杯 2020 玄武组]SSRFMe(未解出)

进入靶场 又是代码又是代码又是代码又是代码又是代码又是代码又是代码又是代码又是代码又是代码又是代码又是代码又是代码又是代码 <?php // 检查 URL 是否为内部 IP 地址 function check_inner_ip($url) {// 使用正则表达式检查 URL 格式是否以 http、https、gopher 或 d…

如何实现各种类型的进度条

文章目录 1 概念介绍2 使用方法3 示例代码 我们在上一章回中介绍了浮动按钮相关的内容&#xff0c;,本章回中将介绍进度条相关的Widget,闲话休提&#xff0c;让我们一起Talk Flutter吧。 1 概念介绍 进度条是常用的组件之一&#xff0c;它主要用来显示某种动作的完成进度。Flu…

复位信号的同步与释放(同步复位、异步复位、异步复位同步释放)

文章目录 背景前言一、复位信号的同步与释放1.1 同步复位1.1.1 综述1.1.2 优缺点 1.2 recovery time和removal time1.3 异步复位1.3.1 综述1.3.2 优缺点 1.4 同步复位 与 异步复位1.5 异步复位、同步释放1.5.1 总述1.5.2 机理1.5.3 复位网络 二、思考与补充2.1 复…

欢迎来到linux大陆!本次试炼地点——秩序“权限”圣殿

一篇关于权限的学习笔记~ 1、权限的概念2、权限管理2.1 角色的不同分类2.2 文件权限原理剖析2.2.1 熟悉指令2.2.2 普通用户只能更改自己的文件权限&#xff0c;但是sudo提权可以更改其他文件权限2.2.3 没有权限&#xff0c;系统拒绝访问2.2.4 权限匹配2.2.5 root用户不受任何限…

Spring 定时任务:@Scheduled 注解四大参数解析

本文主要介绍了在 Spring 框架中使用Scheduled注解实现定时任务的方法&#xff0c;重点讲解了fixedRate、fixedDelay、cron和initialDelay这四个参数的用法&#xff0c;并通过实例代码进行了详细说明。 1. fixedRate 参数 参数含义 fixedRate指定任务固定时间间隔执行。如设…

使用频谱仪:测量宽带信号的功率

marker默认只测一个频率点的功率&#xff0c;当测试宽带信号&#xff0c;如20MHz&#xff0c;不能直接使用marker来测量功率。 有2种方式&#xff1a; 宽带信号需要使用Measure-> channel power 来测量。 meas setup integ BW&#xff1a;500mhz Freq&#xff1a;中心频…

postman请求参数化

postman界面介绍 一、使用环境变量(Environment Variables)进行参数化 1、在请求中使用环境变量 在请求的url、请求头(Headers)、请求体(Body)等部分都可以使用环境变量。 URL 部分示例 点击 Postman 界面右上角的 “眼睛” 图标(Environment Quick Look)打开环境管理…

优选算法——哈希表

目录 1. 哈希表简介 2. 两数之和 3. 判定是否为字符重排 4. 存在重复元素 5. 字母异位词分组 1. 哈希表简介 2. 两数之和 题目链接&#xff1a;1. 两数之和 - 力扣&#xff08;LeetCode&#xff09; 题目展示&#xff1a; 题目分析&#xff1a; 大家来看上面的图&…

【C语言学习】:C语言补充:转义字符,<<,>>操作符,IDE

&#x1f381;个人主页&#xff1a;我们的五年https://blog.csdn.net/djdjiejsn?typeblog &#x1f50d;系列专栏&#xff1a;C课程学习https://blog.csdn.net/djdjiejsn/category_12617142.html &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 C语言学…

Cesium特效——城市白模的科技动效的各种效果

最终效果图如下&#xff1a; 实现方法&#xff1a; 步骤一&#xff1a;使用cesiumlib生产白模&#xff0c;格式为3dtiles 注意事项&#xff1a;采用其他方式可能导致白模贴地&#xff0c;从而导致不能实现该效果&#xff0c;例如把步骤二的服务地址改为Cesium Sandcastle 里的…

仿 RabbitMQ 的消息队列3(实战项目)

七. 消息存储设计 上一篇博客已经将消息统计文件的读写代码实现了&#xff0c;下一步我们将实现创建队列文件和目录。 实现创建队列文件和目录 初始化 0\t0 这样的初始值. //创建队列对应的文件和目录&#xff1a;public void createQueueFile(String queueName) throws IO…