WebAPIs 第三天

DOM 事件进阶

  • 事件流
  • 事件委托
  • 其他事件
  • 元素尺寸与位置

一.事件流

  • 事件流与两个阶段说明
  • 事件捕获
  • 事件冒泡
  • 阻止冒泡
  • 解绑事件

1.1 事件流与两个阶段说明

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

② 事件流分为捕获阶段和冒泡阶段

 1.2 事件捕获

  • 从DOM根元素开始去执行对应的事件(从外到里)
  • 代码: DOM.addEventListener(事件类型,事件处理函数,是否使用捕获机制)
  • 说明:addEventListener第三个参数传入true代表是捕获阶段触发(很少使用),如果不屑,默认就是false,false代表冒泡阶段触发
  • 如果用L0事件监听,只有冒泡阶段,没有捕获

1.3 事件冒泡

  • 当一个元素的事件被触发时,同样的事件将会在该元素的所有祖先元素中依次被触发,这一过程被称为事件冒泡
  • 简单理解:当一个元素触发事件后,会依次向上调用所有父级元素的同名事件
  • 事件冒泡是默认存在的
  • L2事件监听第三个参数是false,或者默认都是冒泡

1.4 阻止冒泡

① 问题:如果默认就有冒泡模式的存在,所以容易导致事件影响到父级元素,如果想把事情就限制在当前元素内,就需要阻止事件冒泡

② 阻止冒泡需要拿到事件对象

③ 语法:对象.e.stopPropagation()

④ 此方法可以阻断事件流动传播,不光在冒泡阶段有效,在捕获阶段也有效

1.5 解绑事件

 ① on事件方式:直接使用null覆盖就可以实现事件的解绑

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

const btn = document.querySelector('button')
function fn() {alert('点击了')
}
btn.addEventListener('click', fn)
// 匿名函数不能解绑
btn.removeEventListener('click', fn)

 1.6 鼠标经过事件的区别

  • mouseover 和 mouseout 有冒泡效果
  • mouseenter 和 mouseleave 没有冒泡效果(推荐)

1.7 两种注册事件的区别

① 传统on注册(L0)

  • 同一个对象,后面注册的事件会覆盖前面注册(同一个事件)
  • 直接使用null覆盖就可以实现事件的解绑
  • 都是冒泡阶段执行的

② 事件监听注册(L2)

  • 语法:addEventListener(事件类型,事件处理函数,是否使用捕获机制)
  • 后面注册的事件不会覆盖前面注册的事件(同一个事件)
  • 可以通过第三个参数去确定在冒泡或捕获阶段执行
  • 必须使用 removeEventListener(事件类型,事件处理函数,[获取捕获或者冒泡])
  • 匿名函数无法被解绑

二.事件委托 

① 事件委托是利用事件流的特征解决一些开发需求的知识技巧

② 优点

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

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

  <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) {//  真正触发元素if (e.target.tagName === 'LI') {e.target.style.color = 'red'}})</script>

三.其他事件

3.1 阻止冒泡

① 某些情况下组要阻止默认行为的发生,比如阻止链接的跳转,表单域跳转

② 语法:e.preventDefault()

代码:

  <form action="http://www.baidu.com"><input type="submit" value="免费注册"></form><a href="http://www.baidu.com">百度一下</a><script>const form = document.querySelector('form')form.addEventListener('submit', function(e) {e.preventDefault()})const a = document.querySelector('a')a.addEventListener('click', function(e) {e.preventDefault()})</script>

3.2 页面加载事件

① 概念:加载外部资源,加载完毕时触发的事件

② 为什么要学:

  • 有时候需要等页面资源全部处理完了做一些事情
  • 老代码喜欢把script写到head中,这时候直接找dom元素找不到

③ 事件名:load

④ 监听页面所有资源加载完毕

  • 给window添加load事件
window.addEventListener('load', function () {const btn = document.querySelector('button')btn.addEventListener('click', function () {alert('hello')})
})
  • 不光可以监听整个页面资源加载完毕,也可以针对某个资源绑定load事件

⑤ DOMContentLoaded

  • 当初始的HTML文档被完全加载和解析完成之后,DOMContentLoaded事件被触发,无序等到样式表和图像完全加载
  • 事件:DOMContentLoaded
  • 给document添加 DOMContentLoaded 事件
document.addEventListener('DOMContentLoaded', function () {const btn = document.querySelector('button')btn.addEventListener('click', function () {alert('hello')
})
})

3.3 页面滚动事件

① 滚动条在滚动的时候持续触发的事件

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

③ 事件名:scroll

④ 监听整个页面滚动:  给window或document 添加scroll事件

⑤ 监听某个元素内部滚动直接给某个元素添加即可    

// scrollLeft 和 scrollTop
① 获取被卷去的大小
② 获取元素往左,往上滚出去看不到的距离
③ 这两个值都是可读写的 
document.documentElement.scrollTop = 800const div = document.querySelector('div')window.addEventListener('scroll', function() {// 必须写到里面,得到的是一个数字型,不带单位const n = document.documentElement.scrollTopconsole.log(n)if (n >= 100) {div.style.display = 'block'} else {div.style.display = 'none'}})

3.4 页面尺寸事件

① 会在窗口尺寸改变的时候触发事件

② resize

const div = document.querySelector('div')console.log(div.clientWidth)window.addEventListener('resize', function() {console.log('hahah')})

③ 检测屏幕宽度

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

四.元素的尺寸与位置

  • 获取宽高

    ① 获取元素自身的宽和高,包含元素自身设置的宽高,padding,border

    ② offsetWidth 和 offsetHeight

    ③ 包含边框

  • 获取位置

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

   ② offsetLeft和pffsetTop 这两个是只读属性

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

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

相关文章

探讨uniapp的生命周期问题

在uniapp中,生命周期函数分为应用生命周期函数、页面生命周期函数和组件生命周期函数. 1应用声明周期 应用生命周期函数只能在 App.vue 中监听有效&#xff0c;在其他页监听无效。 onLaunch&#xff1a;当uni-app 初始化完成时触发&#xff08;全局只触发一次&#xff09;on…

AI 绘画Stable Diffusion 研究(七) 一文读懂 Stable Diffusion 工作原理

大家好&#xff0c;我是风雨无阻。 本文适合人群&#xff1a; 想要了解AI绘图基本原理的朋友。 对Stable Diffusion AI绘图感兴趣的朋友。 本期内容&#xff1a; Stable Diffusion 能做什么 什么是扩散模型 扩散模型实现原理 Stable Diffusion 潜扩散模型 Stable Diffu…

VMware Workstation中安装了Windows7系统但是VMware Tools选项为灰色及无法安装的解决方法

一、问题描述 当我们在使用VMware Workstation安装好了Windows7系统后;该安装好的Windows7系统并不能自动适配WMware的界面,只能在中间显示很小的一部分内容;此时我们就需要给Windows7系统安装VMware Tools工具; 问题一:WMware中的【安装VMware Tools】选项则是灰色的无法…

邻接表创建无向表(C++ 代码)

#include<iostream>//邻接表创建无向表 #define MVNum 100 using namespace std; typedef char VerTexType; typedef struct Arcnode//边节点 {int adjvex;//该边所指向的顶点的位置struct Arcnode* nextarc;//指向下一条边的指针 }Arcnode; typedef struct vnode//顶点节…

【瑞吉外卖】Linux学习

Linux常用命令 Linux命令初体验 Linux的命令都是由一个或几个单词的缩写构成的 命令对应英文作用lslist查看当前目录下的内容pwdprint work directory查看当前所在目录cd [目录名]change directory切换目录touch [文件名]touch如果文件不存在&#xff0c;新建文件mkdir [目录…

软件测试基础篇——LAMP环境搭建

LAMP 1、Linux系统的其他命令 find命令&#xff1a;在目录下查找文件 ​ 格式一&#xff1a;find 路径 参数 文件名 ​ 路径&#xff1a;如果没有指定路径&#xff0c;默认是在当前目录下 ​ 参数&#xff1a;-name 根据文件名来查找&#xff0c;区分大小写&#xff1b; -…

【多模态】25、ViLT | 轻量级多模态预训练模型(ICML2021)

文章目录 一、背景二、ViLT 方法三、效果3.1 数据集3.2 分类任务 VQA 和 NLVR23.3 Image Retrieval 论文&#xff1a;ViLT: Vision-and-Language Transformer Without Convolution or Region Supervision 代码&#xff1a;https://github.com/dandelin/vilt 出处&#xff1a;…

JVM相关知识

文章目录 JMM主内存与工作内存工作内存与主内存的交互的8种方法JVM内存结构运行时数据区 类加载机制类加载器类加载分类获取类加载器的途径双亲委派机制双亲委派的机制的弊端是什么?怎么打破双亲委派机制代码热替换、模块热部署自定义类加载器对类加载器的引用 String底层stri…

sentinel核心流程源码解析

sentinel的处理槽(ProcessorSlot) 可以说&#xff0c;sentinel实现的各种功能就是由各处理槽完成的 ,ProcessorSlot定义了四个方法&#xff1a; 当进入该处理槽时触发该方法 处理完 entry方法之后触发该方法 退出该处理槽时触发该方法 exit方法处理完成时触发该方法 sentinel的…

枚举缓存工具

此文章为笔记&#xff0c;为阅读其他文章的感受、补充、记录、练习、汇总&#xff0c;非原创&#xff0c;感谢每个知识分享者。 文章目录 1. 背景2. 枚举缓存3. 样例展示4. 性能对比5. 总结 本文通过几种样例展示如何高效优雅的使用java枚举消除冗余代码。 1. 背景 枚举在系统…

一文读懂HTML

文章目录 HTML的历史HTML的作用HTML的基本语言 HTML的历史 HTML&#xff08;HyperText Markup Language&#xff09;的历史可以追溯到20世纪90年代早期&#xff0c;它是互联网发展的重要里程碑之一。以下是HTML的历史概述&#xff1a; 早期阶段&#xff08;1980年代末 - 1990年…

创新引领城市进化:人工智能和大数据塑造智慧城市新面貌

人工智能和大数据等前沿技术正以惊人的速度融入智慧城市的方方面面&#xff0c;为城市的发展注入了强大的智慧和活力。这些技术的应用不仅令城市管理更高效、居民生活更便捷&#xff0c;还为可持续发展和创新奠定了坚实的基础。 在智慧城市中&#xff0c;人工智能技术正成为城市…

Unity使用C# Protobuf源码

目录 第一步&#xff1a;下载源码 第二步&#xff1a;运行C#构建文件 第三步&#xff1a;处理报错&#xff08;如果你已安装对应的SDK则不会报错&#xff09; 第四步&#xff1a;复制库文件到你的工程 第一步&#xff1a;下载源码 protobuf github源码https://github.com/p…

《甲午》观后感——GPT-3.5所写

《甲午》是一部令人深思的纪录片&#xff0c;通过生动的画面和真实的故事&#xff0c;向观众展示了中国历史上的一段重要时期。观看这部纪录片&#xff0c;我深受触动&#xff0c;对历史的认识也得到了深化。 首先&#xff0c;这部纪录片通过精心搜集的历史资料和珍贵的影像资料…

Xamarin.Android实现手写板的功能

目录 1、背景说明2、实现效果3、代码实现3.1 整体思路3.2 核心绘画类-PaintView.cs3.3 对话框类-WritePadDialog.cs3.4 前端实现类-MainActivity3.5 布局文件3.5.1 write_pad.xml3.5.2 activity_main布局文件 4、知识总结5、代码下载6、参考资料 1、背景说明 在实际使用过程中…

vector的模拟实现

什么是vector vector是一个封装了动态大小数组的顺序容器跟任意其它类型容器一样&#xff0c;它能够存放各种类型的对象。 模拟实现 实现前的准备 在实现vector之前&#xff0c;为了和库里的区分开需要将实现的vector放在一个自定义的命名空间里。而且vector需要实现成模版…

ITIL4—度量和报告实践

1. 关于本文 本文为度量和报告实践提供了实用指南&#xff0c;分为五个主要部分&#xff0c;涵盖&#xff1a; 本实践的基本信息本实践相关的流程和活动&#xff0c;及其在服务价值链中的作用参与本实践的组织和人员支持本实践的信息和技术合作伙伴和供应商在本实践中的注意事…

P1123 取数游戏

取数游戏 题目描述 一个 N M N\times M NM 的由非负整数构成的数字矩阵&#xff0c;你需要在其中取出若干个数字&#xff0c;使得取出的任意两个数字不相邻&#xff08;若一个数字在另外一个数字相邻 8 8 8 个格子中的一个即认为这两个数字相邻&#xff09;&#xff0c;求…

React源码解析18(1)------ React.createElement 和 jsx

1.React.createElement 我们知道在React17版本之前&#xff0c;我们在项目中是一定需要引入react的。 import React from “react” 即便我们有时候没有使用到React&#xff0c;也需要引入。原因是什么呢&#xff1f; 在React项目中&#xff0c;如果我们使用了模板语法JSX&am…

性能测试—Jmeter工具

文章目录 性能测试1. 术语介绍2. 方法3. 应用场景4. 工具&#xff08;Jmeter&#xff09;4.1 介绍4.2 元件和组件4.2.2 元件4.2.1 组件 4.3 作用域4.4 参数化4.5 执行脚本 性能测试 1. 术语介绍 响应时间(Response time)&#xff1a;对请求作出响应所需要的时间。 在互联网上对…