当前位置: 首页 > news >正文

js:事件流

事件流

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

一个事件流需要经过两个阶段:捕获阶段,冒泡阶段

捕获阶段是在dom树里获取目标元素的过程,从大到小

冒泡阶段是获取以后回到开始,从小到大,像冒泡一样

实际开发中大部分只用到了冒泡阶段

事件捕获

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

事件捕获需要写对应代码才能看到效果
dom.addEventListener('事件类型',function(){},true)

true是捕获,默认是false

false是冒泡阶段,如果你只使用 L0 事件监听,那么事件监听器只会在冒泡阶段触发,不会在捕获阶段触发,因为ie等浏览器不支持捕获,或者说没有冒泡和捕获这个概念

1、事件覆盖情况:

L0(传统on<事件类型>注册):对于同一个对象,如果后面注册了相同类型的事件,它会覆盖前面注册的事件。例如,如果一个元素上先后注册了两个onclick事件,那么只有后面注册的那个事件会被触发。
L2(事件监听注册addEventListener):使用这种方法注册事件时,后面注册的同类型事件不会覆盖前面注册的事件。这意味着,可以在同一个元素上注册多个相同类型的事件,并且它们都会被触发。
2、事件解绑方式:

L0:直接使用null赋值就可以实现事件的解绑,例如对象.onclick = null。
L2:解绑事件需要使用removeEventListener方法,并传入相应的事件类型、事件处理函数以及捕获或冒泡阶段(如果绑定时指定了的话)。需要注意的是,如果使用匿名函数作为事件处理函数,那么将无法解绑该事件,因为无法再次引用到相同的匿名函数。
3、执行阶段:

L0:注册的事件都是在冒泡阶段执行的。
L2:注册事件时可以通过第三个参数来指定事件是在捕获阶段还是冒泡阶段执行。如果不指定第三个参数或传入false,则事件默认在冒泡阶段执行;如果传入true,则事件在捕获阶段执行。

事件冒泡

事件冒泡:当一个元素的事件被触发时,同意的事件将会在该元素的所有祖先元素依次触发

dom.addEventListener('事件类型',function(){})

L2事件监听的第三个参数是false

阻止冒泡

冒泡会把事件传递到父元素,有时候我们需要将事件的影响限制到当前元素里,就需要阻止事件冒泡

阻止事件冒泡首先要拿到事件对象:

这个方法不光可以阻断冒泡,可以阻断其他时间流动传播,就是说也可以阻断捕获阶段的事件传播

在哪里截断就在哪里加这句方法,记住此方法要调用事件对象e

阻止默认行为

有些网页元素有默认行为,比如右键弹出菜单栏这种,如果想阻止默认事件,就需要加上

解绑事件

之前我们只学了监听事件,有时候监听结束后不需要监听了,就需要解绑事件

在L0旧语法里是这么解绑的

L2里使用addEventListener()添加监听,就要使用removeEventListener()来解绑

removeEventListener(事件类型,事件处理函数,[获取捕获或冒泡阶段])

因为要添加事件处理函数作为参数,匿名函数没有名字,所以不能被解绑

加了中括号的参数表示可写可不写

fn不能加小括号,函数回调不用加小括号

鼠标经过事件的区别

在只有一级,没有父子级的时候,二者没什么区别

mouseover和mouseout在父子级都存在的时候会有冒泡效果,自己的效果会冒泡到父级上

mouseenter和mouseleae则没有这个问题,推荐使用这种用法

事件委托

事件相对于快递,给很多元素绑定事件的时候,在以前我们是才能for循环的方式,给每个元素绑定事件,就相当于每个快递1对1的送给每个人;但是有了驿站,就可以把快递托给驿站,就不需要一个一个的注册事件,这叫事件委托,此时的驿站和个人是一种父子级的关系

事件委托是一种事件注册的小技巧

原理:当我们想要给很多个子元素注册一样的事件的时候,例如点击小圆点切换图片(轮播图),就需要单独给每个小圆点添加监听;但是给父元素添加监听的时候,我们触发子元素的时候,会冒泡到父元素,然后触发父元素绑定的事件。

所以事件委托的原理就是事件冒泡

这样可以提高性能,减少注册次数

写一个看看:

父元素里的子元素在监听到事件以后会执行父元素绑定的函数:

 const box = document.querySelector('div')box.addEventListener('click', function (e) {//alert('点上了')console.log(e.target);})

点击不同的span,e.target的属性值也不一样

根据事件对象的特性改变span的背景颜色:

 <script>const box = document.querySelector('div')box.addEventListener('click', function (e) {//alert('点上了')console.log(e.target);e.target.style.backgroundColor='purple'})</script>

但是这样有一个问题:父级绑定了以后所有的子级触发事件后都会执行父元素绑定的函数,有时候并不是所有的子级都需要触发,类名不同或者标签不同的元素不需要这个事件,怎么做到分离父级和  一部分子级?

事实证明人类对事件对象的开发程度不足1%:

展开这个箭头:

可以发现这些目标是有nodeName的,我们可以靠nodeName来区分,只对span添加委托:

 const box = document.querySelector('div')box.addEventListener('click', function (e) {//alert('点上了')//console.log(e);if(e.target.nodeName==='SPAN')e.target.style.backgroundColor='purple'})

使用事件委托来重做一下之前的小圆点切换图片功能:

一个需要注意的点:之前我们是用i来访问选择的li,现在没有i了,怎么知道选中的是哪个li?

使用自定义属性

定义:

<div data-id="0"></div>

获取:

   const div=document.querySelector('div')console.log(div.dataset.id)

像这样,来访问li

但是!孩子们,注意一个问题,此时你获得的data-id是字符串,不能之间当数字使,取过来会当字符串使用

js:

  //事件委托写法const ul = document.querySelector('ul')ul.addEventListener('click', function (e) {//console.log(e.target.dataset.id);// 隐式转换,转换为数字型const id =+e.target.dataset.idtoggle(id)clearInterval(timeId)i = idtimeId = setInterval(function () {next.click()}, 1000)})

html:

  <ul class="slider-indicator"><li class="active" data-id="0"></li><li data-id="1"></li><li data-id="2"></li><li data-id="3"></li></ul>

其它事件

除了之前学的鼠标事件、键盘事件、焦点事件、文本事件等,还有其他事件

页面加载事件

在打开一个网页的时候,会有许多外部资源被加载,比如图片、外联CSS、JavaScript等,我们需要等这些元素加载完在打开网页;或者在body前面写的js没办法加载dom树,所以我们需要等待(load)

事件名:load

window.addEventListener('load',function(){})

load事件的意思是等加载完毕,再去执行回调函数

但是现在没什么人这么写,因为如果要等待dom树加载完为什么要写body前面呢?直接写在body后面就不用操心这个问题了

有时候网络出了问题或者网页加载比较慢的时候,网页里会先加载出来html元素,css和js等还没有渲染出来。这种只加载出html骨架就触发的事件叫DOMContentLoaded

相比load事件,DOMContentLoaded事件触发会比load快,因为不用等样式表、图片等外部资源加载好,用户体验更好

document.addEventListener('DOMContentLoaded',function(){})

元素滚动事件

页面内有些元素是根据滚动在不同地方的时候出现的,这个关于网页滚动的事件就叫scroll(滚动事件)

首先要确定的是谁在滚动?window

   window.addEventListener('scroll', function () {console.log('页面滚动了');})

每滚动1像素就会检测到:

介绍页面的新属性

srcollLeft:左侧被卷去的距离

srcollTop:顶部被卷去的距离

出现的数字有两个特点:不带单位、可读写(简称可访问可赋值)

可以通过页面滚动的距离来设置元素的显示:

   const elevator = document.querySelector('.xianshi')window.addEventListener('scroll', function () {//console.log('页面滚动了');//console.log(document.documentElement.scrollTop)let top = document.documentElement.scrollTopif (top >= 300) {elevator.style.opacity = 1}})

说明数据可读可写

页面尺寸事件

随着页面的放大和缩小触发事件

通过clientWidth和clientHeight来获取盒子的宽度:

但是clientWidth和clientHeight是不包含padding和border的

而offsetWidth和offsetHeight则可以包含padding和border,可以获取宽高

获取尺寸的数据为数值,可以方便计算

前提是盒子为可视化盒子,如果盒子被隐藏起来了,获取的数值为0

offsetLeft和offsetTop可以获取元素距离定位父级元素(如果最近一级的父级元素不带定位,就往上找一级,直到找到带定位的父级元素,测量和该元素的距离为offsetLeft的值)的左、上距离,是只读属性做不了计算

demo

解决问题:初次没有active类的报错问题

解决办法:先获取类,分情况讨论:有active这个类/没有这个类

如果当前对象没有这个类,就为他添加此类/如果有这个类就去除

html{scroll-behavior: smooth;/* 滑动流畅 */
}

在点击事件之后,电梯字体的颜色也要改变,来告诉用户当前处于哪个模块

所以只要一滚动,就要移除当前的active,在滚动之后再加上

本来我觉得单独获取与for循环获取还是后者更方便,但是品客老师说这样不方便后期的修改,降低的代码的可用性

//电梯函数模块(function () {const elevator = document.querySelector('.xtx-elevator')window.addEventListener('scroll', function () {const n = document.documentElement.scrollTop// if (n > 300) {//   elevator.style.opacity = 1// } else {//   elevator.style.opacity = 0// }elevator.style.opacity = n >= 300 ? 1 : 0})const backTop = document.querySelector('#backTop')backTop.addEventListener('click', function () {document.documentElement.scrollTop = 0//window.scrollTo(0, 0)将页面滚动到指定坐标})})();(function () {//模块变色和点击跳转效果const list = document.querySelector('.xtx-elevator-list')list.addEventListener('click', function (e) {if (e.target.tagName === 'A' && e.target.dataset.name) {const old = document.querySelector('.xtx-elevator-list .active')// if (old) old.classList.remove('active')// e.target.classList.add('active')//console.log(document.querySelector(`.xtx_goods_${e.target.dataset.name}`).offsetTop)const top = document.querySelector(`.xtx_goods_${e.target.dataset.name}`).offsetTopdocument.documentElement.scrollTop = top}})window.addEventListener('scroll', function () {const old = document.querySelector('.xtx-elevator-list .active')if (old) old.classList.remove('active')// 获取所有 <li> 元素const news = document.querySelector('.xtx_goods_new')const popular = document.querySelector('.xtx_goods_popular')const brand = document.querySelector('.xtx_goods_brand')const topic = document.querySelector('.xtx_goods_topic')const n=document.documentElement.scrollTopif(n>=news.offsetTop&&n<popular.offsetTop){document.querySelector('[data-name=new]').classList.add('active')}else if(n>=popular.offsetTop&&n<brand.offsetTop){document.querySelector('[data-name=popular]').classList.add('active')}else if(n>=brand.offsetTop&&n<topic.offsetTop){document.querySelector('[data-name=brand]').classList.add('active')}else if(n>=topic.offsetTop){document.querySelector('[data-name=topic]').classList.add('active')}})})();

就在此时此刻,我的外卖被偷了

我永远痛恨偷外卖的4全家

相关文章:

js:事件流

事件流 事件流是指事件完整执行过程中的流动路径 一个事件流需要经过两个阶段&#xff1a;捕获阶段&#xff0c;冒泡阶段 捕获阶段是在dom树里获取目标元素的过程&#xff0c;从大到小 冒泡阶段是获取以后回到开始&#xff0c;从小到大&#xff0c;像冒泡一样 实际开发中大…...

Linux对比Windows

1. 性能和资源占用 Linux 更轻量级&#xff1a;Linux 内核设计简洁&#xff0c;占用系统资源&#xff08;如内存、CPU&#xff09;较少&#xff0c;适合高负载的服务器环境。 高效的多任务处理&#xff1a;Linux 在多任务处理和并发请求方面表现优异&#xff0c;适合处理大量并…...

Excel 技巧03 - 如何对齐小数位数? (★)如何去掉小数点?如何不四舍五入去掉小数点?

这几个有点儿关联&#xff0c;我都给放到一起了&#xff0c;不影响大家分别使用。 目录 1&#xff0c;如何对齐小数位数&#xff1f; 2&#xff0c;如何去掉小数点&#xff1f; 3&#xff0c;如何不四舍五入去掉小数点&#xff1f; 1&#xff0c;如何对齐小数位数&#xff…...

Vue3国际化多语言的切换

参考链接: link Vue3国际化多语言的切换 一、安装 vue-i18n 和 element-plus vue-i18n 是一个国际化插件&#xff0c;专为 Vue.js 应用程序设计&#xff0c;用于实现多语言支持。它允许你将应用程序的文本、格式和消息转换为用户的首选语言&#xff0c;从而提供本地化体验。…...

使用XAML语言仿写BiliBil登录界面

实现步骤 实现左右布局 使用了Grid两列的网格布局&#xff0c;第一列宽度占35%&#xff0c;第二列宽度占65%。使用容器布局Border包裹左右布局内容&#xff0c;设置背景色、设置圆角 <!-- 定义两列--> <Grid.ColumnDefinitions><ColumnDefinition Width &quo…...

机器学习和深度学习

机器学习&#xff08;Machine Learning&#xff0c;简称 ML&#xff09;和深度学习&#xff08;Deep Learning&#xff0c;简称 DL&#xff09;都是人工智能&#xff08;AI&#xff09;领域的重要技术&#xff0c;它们的目标是使计算机通过数据学习和自主改进&#xff0c;从而完…...

Word表格批量提取数据到Excel,Word导出到Excel,我爱excel

Word表格批量提取数据到Excel&#xff0c;Word导出到Excel - 我爱Excel助你高效办公 在日常办公中&#xff0c;Word表格常常用于记录和整理数据&#xff0c;但将这些数据从Word提取到Excel&#xff0c;特别是当涉及多个文件时&#xff0c;常常让人头疼。如果你经常需要将多个W…...

SpringSecurity抛出异常但AccessDeniedHandler不生效

文章目录 复现原因 复现 Beanpublic SecurityFilterChain securedFilterChain(HttpSecurity http) throws Exception {//...//异常http.exceptionHandling(except -> {except.authenticationEntryPoint(new SecurityAuthenticationEntryPoint());except.accessDeniedHandle…...

高清绘画素材3600多张动漫线稿线描上色练习参考插画原画

工作之余来欣赏一波线稿&#xff0c;不务正业版... 很多很多的线稿... 百度网盘 请输入提取码...

EXCEL技巧

1. EXCEL技巧 1.1. 截取表格内某个字符之前的所有字符 1.1.1.样例 在单元格内输入函数&#xff1a; # 截取A1单元格内“分”字符左边的所有字符 LEFT(A1,FIND("分",A1)-1)1.1.2.截图...

python制作翻译软件

本文复刻此教程&#xff1a;制作属于自己的翻译软件-很简单【Python】_哔哩哔哩_bilibili 一、明确需求&#xff08;以搜狗翻译为例&#xff09; &#xff08;1&#xff09;网址&#xff1a;https://fanyi.sogou.com/text &#xff08;2&#xff09; 数据&#xff1a;翻译内容…...

ollama+FastAPI部署后端大模型调用接口

ollamaFastAPI部署后端大模型调用接口 记录一下开源大模型的后端调用接口过程 一、ollama下载及运行 1. ollama安装 ollama是一个本地部署开源大模型的软件&#xff0c;可以运行llama、gemma、qwen等国内外开源大模型&#xff0c;也可以部署自己训练的大模型 ollama国内地…...

BERT:深度双向Transformer的预训练用于语言理解

摘要 我们介绍了一种新的语言表示模型&#xff0c;名为BERT&#xff0c;全称为来自Transformer的双向编码器表示。与最近的语言表示模型&#xff08;Peters等&#xff0c;2018a&#xff1b;Radford等&#xff0c;2018&#xff09;不同&#xff0c;BERT旨在通过在所有层中联合调…...

【AI-23】深度学习框架中的神经网络3

神经网络有多种不同的类型&#xff0c;每种类型都针对特定的任务和数据类型进行优化。根据任务的特点和所需的计算能力&#xff0c;可以选择适合的神经网络类型。以下是一些主要的神经网络类型及其适用的任务领域。 1. 深度神经网络&#xff08;DNN&#xff09; 结构&#xf…...

网站运营数据pv、uv、ip

想要彻底弄清楚pv uv ip的区别&#xff0c;首先要知道三者的定义&#xff1a; IP(独立IP)的定义&#xff1a; 即Internet Protocol,指独立IP数。24小时内相同公网IP地址只被计算一次。 PV(访问量)的定义&#xff1a; 即Page View,即页面浏览量或点击量&#xff0c;用户每次刷…...

高阶知识库搭建实战五、(向量数据库Milvus安装)

以下是关于在Windows环境下直接搭建Milvus向量数据库的教程: 本教程分两部分,第一部分是基于docker安装,在Windows环境下直接安装Milvus向量数据库,目前官方推荐的方式是通过Docker进行部署,因为Milvus的运行环境依赖于Linux系统。 如果你希望在Windows上直接运行Milvus…...

【TR369】RTL8197FH-VG+RTL8812F增加TR369 command节点

sdk说明 ** Gateway/AP firmware v3.4.14b – Aug 26, 2019**  Wireless LAN driver changes as:  Refine WiFi Stability and Performance  Add 8812F MU-MIMO  Add 97G/8812F multiple mac-clone  Add 97G 2T3R antenna diversity  Fix 97G/8812F/8814B MP issu…...

FPGA实现UART对应的电路和单片机内部配合寄存器实现的电路到底有何区别?

一、UART相关介绍 UART是我们常用的全双工异步串行总线&#xff0c;常用TTL电平标准&#xff0c;由TXD和RXD两根收发数据线组成。 那么&#xff0c;利用硬件描述语言实现UART对应的电路和51单片机内部配合寄存器实现的电路到底有何区别呢&#xff1f;接下来我们对照看一下。 …...

数据库模型全解析:从文档存储到搜索引擎

目录 前言1. 文档存储&#xff08;Document Store&#xff09;1.1 概念与特点1.2 典型应用1.3 代表性数据库 2. 图数据库&#xff08;Graph DBMS&#xff09;2.1 概念与特点2.2 典型应用2.3 代表性数据库 3. 原生 XML 数据库&#xff08;Native XML DBMS&#xff09;3.1 概念与…...

【Java基础】Java异常捕捉,throws/throw、finally、try、catch关键字的含义与运用

1. Java 异常处理&#xff1a; 异常是程序中的一些错误&#xff0c;但并不是所有的错误都是异常&#xff0c;并且错误有时候是可以避免的。 比如说&#xff0c;你的代码少了一个分号&#xff0c;那么运行出来结果是提示是错 java.lang.Error&#xff1b;如果你用System.out.p…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

接口自动化测试:HttpRunner基础

相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具&#xff0c;支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议&#xff0c;涵盖接口测试、性能测试、数字体验监测等测试类型…...

深入理解Optional:处理空指针异常

1. 使用Optional处理可能为空的集合 在Java开发中&#xff0c;集合判空是一个常见但容易出错的场景。传统方式虽然可行&#xff0c;但存在一些潜在问题&#xff1a; // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...

微服务通信安全:深入解析mTLS的原理与实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言&#xff1a;微服务时代的通信安全挑战 随着云原生和微服务架构的普及&#xff0c;服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...

实现p2p的webrtc-srs版本

1. 基本知识 1.1 webrtc 一、WebRTC的本质&#xff1a;实时通信的“网络协议栈”类比 将WebRTC类比为Linux网络协议栈极具洞察力&#xff0c;二者在架构设计和功能定位上高度相似&#xff1a; 分层协议栈架构 Linux网络协议栈&#xff1a;从底层物理层到应用层&#xff08;如…...

在 Vue 的template中使用 Pug 的完整教程

在 Vue 的template中使用 Pug 的完整教程 引言 什么是 Pug&#xff1f; Pug&#xff08;原名 Jade&#xff09;是一种高效的网页模板引擎&#xff0c;通过缩进式语法和简洁的写法减少 HTML 的冗长代码。Pug 省略了尖括号和闭合标签&#xff0c;使用缩进定义结构&#xff0c;…...