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')//最新的 L2function 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.documentElementconst 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获取元素距离自己定位祖先元素的左、上距离获取元素位置的时候使用,只读属性

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

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

相关文章

智能工厂数字化化集成落地项目(交付版 67页)PPT 解读

基于工业4.0和工业智能化转型的甲方智能工厂数字化集成落地项目。报告分析了制造业的发展趋势&#xff0c;重点介绍了甲方为应对挑战而实施的商业模式创新和产业升级策略。通过引入乙方的智能工厂规划&#xff0c;构建了一个集成的数字化工厂架构&#xff0c;以提高生产效率和响…

Linux进度条实现

Linux进度条实现 1.\r\n2.缓冲区3.缓冲区分类4.进度条实现 &#x1f31f;&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f;&#x1f31f; &#x1f680;&#x1f680;系列专栏&#xff1a;【Linux的学习】 &#x1f4dd;&#x1f4dd;本篇内容&#xff1a;\…

基于java线程池和EasyExcel实现数据异步导入

基于java线程池和EasyExcel实现数据异步导入 2.代码实现 2.1 controller层 PostMapping("import")public void importExcel(MultipartFile file) throws IOException {importService.importExcelAsync(file);}2.2 service层 Resource private SalariesListener sa…

校验收货地址是否超出配送范围实战3(day09)

优化用户下单功能&#xff0c;加入校验逻辑&#xff0c;如果用户的收货地址距离商家门店超出配送范围&#xff08;配送范围为5公里内&#xff09;&#xff0c;则下单失败。 提示&#xff1a; ​ 1. 基于百度地图开放平台实现&#xff08;https://lbsyun.baidu.com/&#xff09…

Linux系统下速通stm32的clion开发环境配置

陆陆续续搞这个已经很久了。 因为自己新电脑是linux系统无法使用keil&#xff0c;一开始想使用vscode里的eide但感觉不太好用&#xff1b;后面想直接使用cudeide但又不想妥协&#xff0c;想趁着这个机会把linux上的其他单片机开发配置也搞明白&#xff1b;而且非常想搞懂cmake…

leetcode_3092. 最高频率的 ID

https://leetcode.cn/problems/most-frequent-ids/description/ 看到这个数据范围 最极端情况 如果nums全为一个数 并且数量取到最大 那么范围是10的10次方 需要longlong储存 这题主要运用了哈希表配合multiset实现 哈希表主要用作存储某个数的出现次数 mst则用于记录出现次…

【深度学习】 自动微分

自动微分 正如上节所说&#xff0c;求导是几乎所有深度学习优化算法的关键步骤。 虽然求导的计算很简单&#xff0c;只需要一些基本的微积分。 但对于复杂的模型&#xff0c;手工进行更新是一件很痛苦的事情&#xff08;而且经常容易出错&#xff09;。 深度学习框架通过自动…

如何把jupyter的一个.ipynb文件的多个单元格cell合并为1个cell

1 jupyter的一个.ipynb文件的多个单元格cell合并为1个cell 步骤 1&#xff1a;打开 your_notebook.ipynb 文件 启动 Jupyter Notebook。 导航到你的工作目录&#xff08;例如 F:\main&#xff09;。 打开 your_notebook.ipynb 文件。 步骤 2&#xff1a;选择所有单元格 点击…

集成Sleuth实现链路追踪

文章目录 1.新增sunrays-common-cloud模块1.在sunrays-framework下创建2.pom.xml3.查看是否被sunrays-framework管理 2.创建common-cloud-sleuth-starter1.目录结构2.pom.xml3.sunrays-dependencies指定cloud版本4.SleuthAutoConfiguration.java5.spring.factories 3.创建commo…

WPF基础 | 初探 WPF:理解其核心架构与开发环境搭建

WPF基础 | 初探 WPF&#xff1a;理解其核心架构与开发环境搭建 一、前言二、WPF 核心架构2.1 核心组件2.2 布局系统2.3 数据绑定机制2.4 事件处理机制 三、WPF 开发环境搭建3.1 安装 Visual Studio3.2 创建第一个 WPF 应用程序 结束语优质源码分享 WPF基础 | 初探 WPF&#xff…

字节跳动自研HTTP开源框架Hertz简介附使用示例

字节跳动自研 HTTP 框架 Hertz Hertz 是字节跳动自研的高性能 HTTP 框架&#xff0c;专为高并发、低延迟的场景设计。它基于 Go 语言开发&#xff0c;结合了字节跳动在微服务架构中的实践经验&#xff0c;旨在提供更高效的 HTTP 服务开发体验。 1. 背景介绍 随着字节跳动业务…

实战演示:利用ChatGPT高效撰写论文

在当今学术界&#xff0c;撰写论文是一项必不可少的技能。然而&#xff0c;许多研究人员和学生在写作过程中常常感到困惑和压力。幸运的是&#xff0c;人工智能的快速发展为我们提供了新的工具&#xff0c;其中ChatGPT便是一个优秀的选择。本文将通过易创AI创作平台&#xff0c…

在线可编辑Excel

1. Handsontable 特点&#xff1a; 提供了类似 Excel 的表格编辑体验&#xff0c;包括单元格样式、公式计算、数据验证等功能。 支持多种插件&#xff0c;如筛选、排序、合并单元格等。 轻量级且易于集成到现有项目中。 具备强大的自定义能力&#xff0c;可以调整外观和行为…

spring-springboot -springcloud

目录 spring: 动态代理: spring的生命周期(bean的生命周期): SpringMvc的生命周期: SpringBoot: 自动装配: 自动装配流程: Spring中常用的注解&#xff1a; Spring Boot中常用的注解&#xff1a; SpringCloud: 1. 注册中心: 2. gateway(网关): 3. Ribbon(负载均…

DAY9,递归实现计算 :1 + 1/3 - 1/5 + 1/7 - 1/9 + .... 1/n 的值

题目 用递归实现计算 :1 1/3 - 1/5 1/7 - 1/9 .... 1/n 的值&#xff0c;n通过键盘输入 思路 递进阶段&#xff1a;n、...... 、9、7、5、3、1 函数出口&#xff1a;递进到1 开始返回&#xff1b;函数返回值视为“总和” 回归阶段&#xff1a;对当前n取倒数&#xff1b;“总…

Formality:不可读(unread)的概念

相关阅读 Formalityhttps://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482https://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482 在Formality中有时会遇到不可读(unread)这个概念&#xff0c;本文就将对此…

【27】Word:徐雅雯-艺术史文章❗

目录 题目​ NO1.2 NO3 NO4 NO5 NO6.7 NO8.9 NO10.11 注意&#xff1a;修改样式的字体颜色/字号&#xff0c;若中英文一致&#xff0c;选择所有脚本。格式相似的文本→检查多选/漏选格式刷F4重复上一步操作请❗每一步检查和保存 题目 NO1.2 F12另存为布局→行号布局…

关于ARM和汇编语言

一图流 ARM 计算机组成 输入设备 输出设备 存储设备 运算器 控制器 处理器读取内存程序执行的过程 取指阶段&#xff1a;控制器器通过地址总线向存储器发送想要获取的指令的地址编号&#xff0c;存储器将指定的指令发送给处理器 译码阶段&#xff1a;控制器对指令进行分…

PyTorch使用教程(9)-使用profiler进行模型性能分析

1、简介 PyTorch Profiler是一个内置的性能分析工具&#xff0c;可以帮助开发者定位计算资源&#xff08;如CPU、GPU&#xff09;的瓶颈&#xff0c;从而更好地优化PyTorch程序。通过捕获和分析GPU的计算、内存和带宽利用情况&#xff0c;能够有效识别并解决性能瓶颈。 2、原…

2025-01-22 Unity Editor 1 —— MenuItem 入门

文章目录 1 Editor 文件夹2 MenuItem3 使用示例3.1 打开网址3.2 打开文件夹3.3 Menu Toggle3.4 Menu 代码复用3.5 MenuItem 激活与失活4 代码示例 1 Editor 文件夹 ​ Editor 文件夹是 Unity 中的特殊文件夹&#xff0c;Unity 中所有编辑器相关的脚本都需要放置在其中&#xf…