WebAPIs 第三天

news2024/11/26 22:18:29

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 = 800
        const div = document.querySelector('div')
        window.addEventListener('scroll', function() {
            // 必须写到里面,得到的是一个数字型,不带单位
            const n = document.documentElement.scrollTop
            console.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.coloradmin.cn/o/872177.html

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

相关文章

opsForHash() 与 opsForValue 请问有什么区别?

&#x1f449;&#xff1a;&#x1f517;官方API参考手册 如图&#xff0c;opsForHash()返回HashOperations<K,HK,HV>但是 opsForValue()返回ValueOperations<K,V>… 区别就是opsForHash的返回值泛型中有K,HK,HV,其中K是Redis指定的某个数据库里面某一个关键字(由…

三分钟带你快速掌握MongoDB数据库和集合基础操作

文章目录 前言一、案例需求二、数据库操作1. 选择和创建数据库2. 数据库的删除 三、集合操作1. 集合的显式创建&#xff08;了解&#xff09;2. 集合的隐式创建3. 集合的删除 总结 前言 为了巩固所学的知识&#xff0c;作者尝试着开始发布一些学习笔记类的博客&#xff0c;方便…

太牛了!国内版ChatDoc企业知识库,直接操作Doc、Docx、PDF、txt等文件

自ChatGPT问世以来&#xff0c;国外就有ChatPDF、ChatDOC等基于文档问答的项目&#xff0c;但是国内还一直处于对话类产品的研发中。 贵州猿创科技研发了基于本地向量模型的ChatDoc知识库系统&#xff0c;可以直接上传Doc、Docx、PDF、txt、网页链接等进行问答。 体验地址&…

【算法篇C++实现】常见查找算法

文章目录 &#x1f680;一、预备知识⛳&#xff08;一&#xff09;查找的定义⛳&#xff08;二&#xff09;数组和索引 &#x1f680;二、二分查找&#x1f680;三、穷举搜索&#x1f680;四、并行搜索⛳&#xff08;一&#xff09;并发的基本概念⛳&#xff08;二&#xff09;…

修改VS Code终端的显示行数

文章目录 前言修改VS Code终端显示行数参考 前言 在我们使用VS Code运行代码的过程中&#xff0c;有时需要再终端中显示很多的运行过程信息或者结果。然而&#xff0c;VS Code的终端默认显示1000行的内容&#xff0c;随着显示内容的增多&#xff0c;之前的内容就丢失了。为了解…

【单片机毕业设计2-基于stm32c8t6的智能台灯系统】

【单片机毕业设计2-基于stm32c8t6的智能台灯系统】 前言一、功能介绍二、硬件部分三、软件部分总结 前言 &#x1f525;这里是小殷学长&#xff0c;单片机毕业设计篇2 基于stm32的智能台灯系统 &#x1f9ff;创作不易&#xff0c;拒绝白嫖 企鹅号&#xff1a;2836235214 一、功…

Java IO流——【从零构建信息管理系统】

Java I/O流——【从零构建信息管理系统】 文章目录 什么是Java I/O流介绍理解字节流和字符流的区别 Java I/O流的作用Java I/O流方法InputStream方法Reader方法OutputStream方法Writer方法Java I/O体系的全体类 使用示例Java I/O流在实际应用中使用效果 什么是Java I/O流 介绍…

多线程事务怎么回滚?

项目中用到了多线程去批量处理一些数据&#xff0c;当时想当然认为只要方法上加上Transactional注解就好了&#xff0c;实际并未达到想要的处理效果。特此去学习了下关于多线程事务回滚相关方案&#xff0c;参考了网上其他资料&#xff0c;这里整理并记录下学习历程。 站在巨人…

在 IntelliJ IDEA 中使用 Docker 开发指南

目录 一、IDEA安装Docker插件 二、IDEA连接Docker 1、Docker for Windows 连接 2、SSH 连接 3、Connection successful 连接成功 三、查看Docker面板 四、使用插件生成镜像 一、IDEA安装Docker插件 打开 IntelliJ IDEA&#xff0c;点击菜单栏中的 "File" -&g…

山西电力市场日前价格预测【2023-08-14】

日前价格预测 预测明日&#xff08;2023-08-14&#xff09;山西电力市场全天平均日前电价为322.03元/MWh。其中&#xff0c;最高日前电价为366.98元/MWh&#xff0c;预计出现在19: 30。最低日前电价为286.57元/MWh&#xff0c;预计出现在13: 15。 价差方向预测 1&#xff1a; 实…

腾讯出了一个新聊天软件M8

众所周知&#xff0c;如今国内互联网&#xff0c;微信和QQ无疑是社交领域的霸主。 下载:https://www.123pan.com/s/BP5A-RW4xh.html 不过&#xff0c;它们也有各自局限性&#xff0c;比如难以结识新朋友、功能过于复杂等。 这让用户产生厌倦&#xff0c;再加上近几年AI、元宇…

标记垃圾,有三种色彩:四千长文带你深入了解三色标记算法

&#x1f52d; 嗨&#xff0c;您好 &#x1f44b; 我是 vnjohn&#xff0c;在互联网企业担任 Java 开发&#xff0c;CSDN 优质创作者 &#x1f4d6; 推荐专栏&#xff1a;Spring、MySQL、Nacos、Java&#xff0c;后续其他专栏会持续优化更新迭代 &#x1f332;文章所在专栏&…

SCSS的基本用法

1、声明变量 $ 声明变量的符号 $ 下面这张图左半部分是scss的语法&#xff0c;右半部分是编译后的css。&#xff08;整篇文章皆是如此&#xff09; 2、默认变量 !default sass 的默认变量仅需要在值后面加上 !default 即可。 如果分配给变量的值后面添加了 !default 标志…

jmeter通过BeanShell对接口参数进行MD5和HmacSHA256加密【杭州多测师_王sir】

一、在eclipse里面编写MD5加密算法 package com.Base64;import java.security.MessageDigest; import java.security.NoSuchAlgorithmException;public class Md5Utils {public static String md5(String sourceStr) {String result "";try {MessageDigest md Mess…

教你10分钟内学习如何CSS 设置网页打印时的样式

本文将教您开始为要打印的页面编写CSS所需要的一切提供帮助。 media 规则 If you’ve done any responsive design, you’ll already know about the media rule. As well as different screen sizes, media also lets you target “print” media. Here’s an example: 如果…

【CTF-web】修改请求头(XFF)

题目链接&#xff1a;https://ctf.bugku.com/challenges/detail/id/79.html 随意输入后可以看到需要本地管理员登录&#xff0c;得知这是一道需要修改XFF头的题。 XFF即X-Forwarded-For&#xff0c;该请求标头是一个事实上的用于标识通过代理服务器连接到 web 服务器的客户端的…

腾讯轻量云服务器搭建Node.js开发环境

1.购买腾讯云轻量应用服务器&#xff0c;登录 轻量应用服务器控制台&#xff0c;在 服务器 页面单击 新建。安装运行环境&#xff0c;选择为应用模板 > Web 开发场景 > Node.js 应用模板。 Node.js 是一个事件驱动 I/O 服务端 JavaScript 环境&#xff0c;基于 Chrome V…

分布式文件存储系统-FastDFS

前言&#xff1a;FastDFS 是一个分布式文件存储系统&#xff0c;主要用于存储和管理大规模的文件数据&#xff0c;如图片、视频、文档等&#xff0c;是淘宝前架构师为了存储图片用C语言开发出来的系统。 服务端有两个组件 Tracker Server 与 Storage Server &#xff0c;对应两…

​API网关类型与区别​

什么是API网关&#xff1f; 在现代软件架构中&#xff0c;API&#xff08;应用程序编程接口&#xff09;网关起着重要的作用。它是一个中间层&#xff0c;用于管理和控制应用程序之间的通信。API网关可以提供一些关键功能&#xff0c;如流量控制&#xff0c;安全认证&#xff…

java项目打包运行报异常:Demo-1.0-SNAPSHOT.jar中没有主清单属性

检查后发现pom文件中有错误&#xff0c;需要添加build内容才能恢复正常。 添加下面文件后再次启动恢复正常。 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactI…