JavaScript -- DOM事件总结

news2024/11/17 3:29:01

文章目录

  • 事件
    • 1 事件对象简介
    • 2 Event对象
    • 3 冒泡
    • 4 事件的委派
    • 5 事件的捕获

事件

1 事件对象简介

  • 事件对象是由浏览器在事件触发时所创建的对象,这个对象中封装了事件相关的各种信息
  • 通过事件对象可以获取到事件的详细信息比如:鼠标的坐标、键盘的按键…
  • 浏览器在创建事件对象后,会将事件对象作为响应函数的参数传递,所以我们可以在事件的回调函数中定义一个形参来接收事件对象

案例:获取鼠标的坐标

const box1 = document.getElementById("box1")

// 下面两种方式都可以拿到事件对象
// box1.onmousemove = event => {
//     console.log(event)
// }

box1.addEventListener("mousemove", event => {
    console.log(event.clientX, event.clientY)

    box1.textContent = event.clientX + "," + event.clientY
})

2 Event对象

Event - Web API 接口参考

  • 在DOM中存在着多种不同类型的事件对象,多种事件对象有一个共同的祖先 Event
    • event.target 触发事件的对象
    • event.currentTarget 绑定事件的对象(同this)
    • event.stopPropagation() 停止事件的传导
    • event.preventDefault() 取消默认行为
  • 事件的冒泡(bubble)
    • 事件的冒泡就是指事件的向上传导
    • 当元素上的某个事件被触发后,其祖先元素上的相同事件也会同时被触发
    • 冒泡的存在大大的简化了代码的编写,但是在一些场景下我们并不希望冒泡存在不希望事件冒泡时,可以通过事件对象来取消冒泡

案例:阻止事件冒泡

  • 点击最小的div不会向外冒泡,点击中间的div会向外冒泡

image-20221207145636903

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8"/>
    <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
    <title>Document</title>
    <style>
        #box1 {
            width: 300px;
            height: 300px;
            background-color: greenyellow;
        }

        #box2 {
            width: 250px;
            height: 250px;
            background-color: #ff0;
        }

        #box3 {
            width: 200px;
            height: 200px;
            background-color: orange;
        }
    </style>
</head>
<body>
    <div id="box1">
        <div id="box2">
            <div id="box3"></div>
        </div>
    </div>

    <script>
        const box1 = document.getElementById("box1")
        const box2 = document.getElementById("box2")
        const box3 = document.getElementById("box3")

        box1.addEventListener("click", function (event) {
            alert("Hello 我是box1")
        })

        box2.addEventListener("click", function (event) {
            alert("我是box2")
        })

        box3.addEventListener("click", function (event) {
            event.stopPropagation() // 取消事件的传到
            alert("我是box3")
        })
    </script>
</body>
</html>

案例:取消超链接的默认跳转行为

const link = document.querySelector("a")

link.addEventListener("click", (event) => {

    event.preventDefault() // 取消默认行为

    alert("被点了~~~")

})

3 冒泡

  • 取消冒泡:event.stopPropagation()

案例:图标跟随鼠标

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        #box {
            width: 20px;
            height: 20px;
            border-radius: 50%;
            background-color: #8cdb69;
            position: absolute;
        }
    </style>
</head>
<body>
    <div id="box"></div>
    <script>
        const box = document.querySelector("#box")

        document.addEventListener("mousemove", (event) => {
            box.style.top = event.y - 10 + 'px'
            box.style.left = event.x - 10 + 'px'
        })
    </script>
</body>
</html>

案例:在一片区域中图标不跟随鼠标(使用阻止冒泡事件实现效果)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        #box {
            width: 20px;
            height: 20px;
            border-radius: 50%;
            background-color: #8cdb69;
            position: absolute;
        }

        #box2 {
            width: 400px;
            height: 400px;
            background-color: black;
        }
    </style>
</head>
<body>
    <div id="box"></div>
    <div id="box2"></div>
    <script>
        const box = document.querySelector("#box")
        const box2 = document.querySelector("#box2")

        document.addEventListener("mousemove", (event) => {
            box.style.top = event.y + 'px'
            box.style.left = event.x + 'px'
        })

        box2.addEventListener("mousemove", (event) => {
            event.stopPropagation()
        })
    </script>
</body>
</html>

4 事件的委派

委派就是将本该绑定给多个元素的事件,统一绑定给父级元素,这样可以降低代码复杂度方便维护

案例:点击li标签,打印出其中的内容

思路:原来是通过在每一个li上都绑定一个点击事件,然后对新加的li也再添加事件,但是现在可以使用事件的委派来实现这个操作,也就是直接绑定在父级元素上

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        ul {
            background-color: orange;
            width: 100px;
        }
    </style>
</head>
<body>
    <ul>
        <li>链接1</li>
        <li>链接2</li>
        <li>链接3</li>
        <li>链接4</li>
    </ul>
    <script>
        const ul = document.querySelector("ul")
        ul.addEventListener("click", event => {
            alert(event.target.innerText)
        })
    </script>
</body>
</html>

5 事件的捕获

事件的传播机制

  • 在DOM中,事件的传播可以分为三个阶段:
    1. 捕获阶段 (由祖先元素向目标元素进行事件的捕获)(默认情况下,事件不会在捕获阶段触发
    2. 目标阶段 (触发事件的对象)
    3. 冒泡阶段 (由目标元素向祖先元素进行事件的冒泡)
  • 事件的捕获,指事件从外向内的传导,当前元素触发事件以后,会先从当前元素最大的祖先元素开始向当前元素进行事件的捕获
  • 如果希望在捕获阶段触发事件,可以将addEventListener的第三个参数设置为true
    • 一般情况下我们不希望事件在捕获阶段触发,所有通常都不需要设置第三个参数

通过event.eventPhase可以获得事件触发的阶段

1 捕获阶段 2 目标阶段 3 冒泡阶段
  • 捕获:由外向里传播
  • 冒泡:由里向外传播
  • 使用stopPropagation()可以停止捕获或者冒泡,在执行到的函数停止
<!DOCTYPE html>
<html lang="zh">
    <head>
        <meta charset="UTF-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Document</title>
        <style>
            #box1 {
                width: 300px;
                height: 300px;
                background-color: greenyellow;
            }

            #box2 {
                width: 200px;
                height: 200px;
                background-color: orange;
            }

            #box3 {
                width: 100px;
                height: 100px;
                background-color: tomato;
            }
        </style>
    </head>
    <body>
        <div id="box1">
            <div id="box2">
                <div id="box3"></div>
            </div>
        </div>

        <script>
            const box1 = document.getElementById("box1")
            const box2 = document.getElementById("box2")
            const box3 = document.getElementById("box3")

            box1.addEventListener("click", event => {
                alert("1" + event.eventPhase) // eventPhase 表示事件触发的阶段
                //1 捕获阶段 2 目标阶段 3 冒泡阶段
            })

            box2.addEventListener("click", event => {

                alert("2" + event.eventPhase)
            })

            box3.addEventListener("click", event => {
                alert("3" + event.eventPhase)
            })
        </script>
    </body>
</html>

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

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

相关文章

单频信号的相位谱计算与误差修正-附Matlab代码

一、问题描述 我们在实际处理时经常遇到只有一个正弦信号的情况&#xff0c;其频率为 f0{{f}_{0}}f0​&#xff0c;在谱分析以后&#xff0c;除了在频率为 f0{{f}_{0}}f0​处有相位数值外&#xff0c;其他频率处都有相位数值&#xff0c;分析其他频谱出现相位值的原因。 例如…

外部tomcat资源整合

Spring Boot应用默认是以jar包方式运行的&#xff0c;Springboot默认有内置的tomcat&#xff0c;在启动的时候会自动的将项目发布&#xff0c;这样各有利弊。 优点&#xff1a;简单&#xff0c;便携 缺点&#xff1a;不支持jsp, 定制优化比较麻烦&#xff0c;需要自己编写ser…

如何开发一个婚恋交友系统?开发功能特点有什么?

婚恋平台为年轻人开启了一个交流恋爱的方式&#xff0c;一方面为的是适龄的年轻单身人士&#xff0c;另一方面为一部分大龄单身人士&#xff0c;解决单很多身人 士的需求&#xff0c;婚恋平台的开发&#xff0c;跟随着互联网的发展&#xff0c;抢占了小程序的热门市场&#xf…

Java线程实现

内容引用自《深入理解Java虚拟机&#xff1a;JVM高级特性与最佳实践&#xff08;第3版&#xff09;周志明》 线程的实现 我们知道&#xff0c;线程是比进程更轻量级的调度执行单位&#xff0c;线程的引入&#xff0c;可以把一个进程的资源分配和 执行调度分开&#xff0c;各个…

React框架入门

React是用于构建用户界面的JavaScript库&#xff0c; 起源于Facebook的内部项目&#xff0c;该公司对市场上所有 JavaScript MVC框架都不满意&#xff0c;决定自行开发一套&#xff0c;用于架设Instagram的网站。于2013年5月开源 一、React简介 React以声明式编写 UI&a…

0119 动态规划 Day8

剑指 Offer 10- I. 斐波那契数列 写一个函数&#xff0c;输入 n &#xff0c;求斐波那契&#xff08;Fibonacci&#xff09;数列的第 n 项&#xff08;即 F(N)&#xff09;。斐波那契数列的定义如下&#xff1a; F(0) 0, F(1) 1 F(N) F(N - 1) F(N - 2), 其中 N > 1…

计算机的硬件系统和软件系统的关系

计算机的硬件系统和软件系统的关系是缺一不可。 硬件它是所有软件运行的物质基础。 与硬件直接接触的是操作系统&#xff0c;它处在硬件和其他软件之间&#xff0c;表示它向下控制硬件&#xff0c;向上支持其他软件。 在操作系统之外的各层分别是各种语言处理程序、数据库管理…

CleanMyMacX4.12.1Crack版本频繁弹密码 菜单浮窗无法显示显示空白解决办法

你们有没有出现过在使用 CleanMyMac 清理系统垃圾文件的时候会频繁弹出输入开机密码&#xff1f;那么该如何解决这个问题呢&#xff1f;跟着小编来看看解决方法吧&#xff01; 频繁输入密码 更新CleanMyMacX到4.12.1的Crack版本之后&#xff0c;发现做一些操作要一直输入密码&…

科技云报道:PingCAP黄东旭:Serverless是数据库的未来形态

科技云报道原创。 30年前&#xff0c;程序员要想写代码&#xff0c;必须使用复杂的汇编语言。 但在今天&#xff0c;几乎没有程序员知道如何使用汇编语言&#xff0c;更加简易的高级语言如C&#xff0c;C#&#xff0c;JAVA&#xff0c;Rust&#xff0c;Go已成为开发主流。 随…

分布式文件存储系统FastDFS[3]-通过Docker安装并且从客户端进行上传下载测试

一、FastDFS安装 FastDFS的安装我们还是通过Docker来安装实现吧&#xff0c;直接在Linux上还装还是比较繁琐的&#xff0c;但就学习而言Docker安装还是非常高效的。Docker环境请自行安装哦&#xff0c;不清楚的可以看看我的Docker专题的内容。https://blog.csdn.net/qq_3852657…

【jenkins】1. 安装jenkins (docker-compose)

环境 ubuntu 20docker服务器 ip:xxx.xxx.xxx.xxx 步骤 1. 【编写安装文件】windows下 - 编写 docker-compose.yaml version: "3.1" services:jenkins:image: jenkins/jenkinsrestart: alwayscontainer_name: jenkinsports:- 58080:8080- 50000:50000volumes:- ./…

5.31 综合案例2.0 - 在线MP3音乐播放器

综合案例2.0 - 在线MP3音乐播放器一、案例说明二、准备器件三、案例连线四、代码代码说明复制五、测试一、案例说明 本案例制作一个联网下载声音文件的MP3播放器。 案例功能说明&#xff1a; 案例使用一块IC035串口屏和两个按键通过按键可以切换音乐&#xff0c;下载播放或删除…

瑜岿科技综合能源管理系统助力企业节能降耗工作

能源是国民经济的基础&#xff0c;更是城市赖以发展的动力。优化能源结构、大力发展可再生能源、提高机房能效、实现建筑智慧节能是行业绿色发展重点。在国家碳达峰碳中和的重大战略决策背景下&#xff0c;我国能源体制改革深入推进&#xff0c;能源生产和消费发生重大变革&…

如今社交电商不可忽略的一个点——消费增值

消费增值是一个基于消费返利理论的全新商业消费生态&#xff0c;一个让用户从优惠消费—免单消费—挣钱消费&#xff0c;所突破的新消费、新业态模式—增值消费&#xff0c;一个从电商化的平台走向品牌化的平台&#xff0c;让平台脱离单打独斗的方式&#xff0c;通过商家联盟方…

编译原理 2 - 词法分析

第3章 词法分析3.1 词法分析器的功能和结构3.2 状态转换图3.3 正则文法 和 正则表达式3.4 有限自动机 DFA与NFA测试第3章 词法分析 重点&#xff1a;① 词法分析器的输入、输出&#xff1b;② 用于识别符号的状态转移图的构造&#xff1b;③ 根据状态转移图实现词法分析器 难点…

【MATLAB教程案例55】GoogleNet网络的MATLAB编程学习和实现,以步态识别为例进行仿真分析

欢迎订阅《FPGA学习入门100例教程》、《MATLAB学习入门100例教程》 目录 1.软件版本 2.GoogleNet理论概述

基于Qt的桌面客户端组件化框架DT 开源啦

这个是本人在工作中基于QT开发的组件化桌面开发框架&#xff0c;目前打算开源出来提供给大家&#xff0c;节省大家的开发时间和效率&#xff0c;希望对大家的开发有所帮助&#xff0c;也欢迎提出意见和改进建议 1. 为什么开源DT框架 DT框架&#xff0c;本身就是基于QT为基础搭…

深度学习——含并行连接的网络(GoogLeNet)笔记

GoogLeNet中基本的卷积块是Inception块。 1.Inception块&#xff1a;4个路径从不同的层面抽取信息&#xff0c;然后在输出通道合并 ①1*1的卷积层&#xff0c;减少通道数&#xff0c;降低模型的复杂度 ② 1*1的卷积层&#xff0c;减少通道数&#xff0c;降低模型复杂度。然后…

volatile关键字和synchronized关键字

参考博客&#xff1a;https://www.cnblogs.com/cg-ww/p/14540450.html 1、volatile的作用&#xff1a;关键作用是使变量在多个线程之间可见 程序并没有因为我修改之后结束运行&#xff0c;因为线程对共享变量具有不可见性&#xff0c;main线程修改布尔值之后&#xff0c;子线…

【读点论文】MicroNet: Towards Image Recognition with Extremely Low FLOPs,在极高限制下的轻量化网络

MicroNet: Towards Image Recognition with Extremely Low FLOPs Abstract 这篇论文旨在以极低的计算成本解决性能大幅下降的问题。提出了微分解卷积&#xff0c;将卷积矩阵分解为低秩矩阵&#xff0c;将稀疏连接整合到卷积中。 提出了一个新的动态激活函数-- Dynamic Shift …