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:事件流
事件流 事件流是指事件完整执行过程中的流动路径 一个事件流需要经过两个阶段:捕获阶段,冒泡阶段 捕获阶段是在dom树里获取目标元素的过程,从大到小 冒泡阶段是获取以后回到开始,从小到大,像冒泡一样 实际开发中大…...
Linux对比Windows
1. 性能和资源占用 Linux 更轻量级:Linux 内核设计简洁,占用系统资源(如内存、CPU)较少,适合高负载的服务器环境。 高效的多任务处理:Linux 在多任务处理和并发请求方面表现优异,适合处理大量并…...
Excel 技巧03 - 如何对齐小数位数? (★)如何去掉小数点?如何不四舍五入去掉小数点?
这几个有点儿关联,我都给放到一起了,不影响大家分别使用。 目录 1,如何对齐小数位数? 2,如何去掉小数点? 3,如何不四舍五入去掉小数点? 1,如何对齐小数位数ÿ…...
Vue3国际化多语言的切换
参考链接: link Vue3国际化多语言的切换 一、安装 vue-i18n 和 element-plus vue-i18n 是一个国际化插件,专为 Vue.js 应用程序设计,用于实现多语言支持。它允许你将应用程序的文本、格式和消息转换为用户的首选语言,从而提供本地化体验。…...
使用XAML语言仿写BiliBil登录界面
实现步骤 实现左右布局 使用了Grid两列的网格布局,第一列宽度占35%,第二列宽度占65%。使用容器布局Border包裹左右布局内容,设置背景色、设置圆角 <!-- 定义两列--> <Grid.ColumnDefinitions><ColumnDefinition Width &quo…...
机器学习和深度学习
机器学习(Machine Learning,简称 ML)和深度学习(Deep Learning,简称 DL)都是人工智能(AI)领域的重要技术,它们的目标是使计算机通过数据学习和自主改进,从而完…...
Word表格批量提取数据到Excel,Word导出到Excel,我爱excel
Word表格批量提取数据到Excel,Word导出到Excel - 我爱Excel助你高效办公 在日常办公中,Word表格常常用于记录和整理数据,但将这些数据从Word提取到Excel,特别是当涉及多个文件时,常常让人头疼。如果你经常需要将多个W…...
SpringSecurity抛出异常但AccessDeniedHandler不生效
文章目录 复现原因 复现 Beanpublic SecurityFilterChain securedFilterChain(HttpSecurity http) throws Exception {//...//异常http.exceptionHandling(except -> {except.authenticationEntryPoint(new SecurityAuthenticationEntryPoint());except.accessDeniedHandle…...
高清绘画素材3600多张动漫线稿线描上色练习参考插画原画
工作之余来欣赏一波线稿,不务正业版... 很多很多的线稿... 百度网盘 请输入提取码...
EXCEL技巧
1. EXCEL技巧 1.1. 截取表格内某个字符之前的所有字符 1.1.1.样例 在单元格内输入函数: # 截取A1单元格内“分”字符左边的所有字符 LEFT(A1,FIND("分",A1)-1)1.1.2.截图...
python制作翻译软件
本文复刻此教程:制作属于自己的翻译软件-很简单【Python】_哔哩哔哩_bilibili 一、明确需求(以搜狗翻译为例) (1)网址:https://fanyi.sogou.com/text (2) 数据:翻译内容…...
ollama+FastAPI部署后端大模型调用接口
ollamaFastAPI部署后端大模型调用接口 记录一下开源大模型的后端调用接口过程 一、ollama下载及运行 1. ollama安装 ollama是一个本地部署开源大模型的软件,可以运行llama、gemma、qwen等国内外开源大模型,也可以部署自己训练的大模型 ollama国内地…...
BERT:深度双向Transformer的预训练用于语言理解
摘要 我们介绍了一种新的语言表示模型,名为BERT,全称为来自Transformer的双向编码器表示。与最近的语言表示模型(Peters等,2018a;Radford等,2018)不同,BERT旨在通过在所有层中联合调…...
【AI-23】深度学习框架中的神经网络3
神经网络有多种不同的类型,每种类型都针对特定的任务和数据类型进行优化。根据任务的特点和所需的计算能力,可以选择适合的神经网络类型。以下是一些主要的神经网络类型及其适用的任务领域。 1. 深度神经网络(DNN) 结构…...
网站运营数据pv、uv、ip
想要彻底弄清楚pv uv ip的区别,首先要知道三者的定义: IP(独立IP)的定义: 即Internet Protocol,指独立IP数。24小时内相同公网IP地址只被计算一次。 PV(访问量)的定义: 即Page View,即页面浏览量或点击量,用户每次刷…...
高阶知识库搭建实战五、(向量数据库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是我们常用的全双工异步串行总线,常用TTL电平标准,由TXD和RXD两根收发数据线组成。 那么,利用硬件描述语言实现UART对应的电路和51单片机内部配合寄存器实现的电路到底有何区别呢?接下来我们对照看一下。 …...
数据库模型全解析:从文档存储到搜索引擎
目录 前言1. 文档存储(Document Store)1.1 概念与特点1.2 典型应用1.3 代表性数据库 2. 图数据库(Graph DBMS)2.1 概念与特点2.2 典型应用2.3 代表性数据库 3. 原生 XML 数据库(Native XML DBMS)3.1 概念与…...
【Java基础】Java异常捕捉,throws/throw、finally、try、catch关键字的含义与运用
1. Java 异常处理: 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。 比如说,你的代码少了一个分号,那么运行出来结果是提示是错 java.lang.Error;如果你用System.out.p…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...
STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...
Docker拉取MySQL后数据库连接失败的解决方案
在使用Docker部署MySQL时,拉取并启动容器后,有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致,包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因,并提供解决方案。 一、确认MySQL容器的运行状态 …...
