【JS基础】事件对象event、环境对象this、事件的高级操作

news2025/1/19 14:28:25

文章目录

  • 一、事件对象
    • 1.1 事件对象是什么?
    • 1.2 使用方法
  • 二、环境对象this以及回调函数
    • 2.1 它是什么?
    • 2.2 演示示例
  • 三、事件的高级操作
    • 3.1 事件流
    • 3.2 事件捕获
    • 3.3 事件冒泡以及阻止冒泡
    • 3.4 事件解绑
    • 3.5 mouseover和mouseenter事件的区别
    • 3.6 事件委托
      • 它是什么?
      • 代码示例
    • 3.7 阻止使用的默认行为
  • 总结


一、事件对象

1.1 事件对象是什么?

事件对象是什么
也是个对象,这个对象里有事件触发时的相关信息
例如:鼠标点击事件中,事件对象就存了鼠标点在哪个位置等信息
使用场景
可以判断用户按下哪个键,比如按下回车键可以发布新闻
可以判断鼠标点击了哪个元素,从而做相应的操作

1.2 使用方法

在事件绑定的回调函数的第一个参数就是事件对象
一般命名为event、ev、e

示例代码:

<!DOCTYPE html>
<html lang="ch">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        div{
            width: 100px;
            height: 100px;
            background-color: pink;
        }
    </style>
</head>
<body>

    <button>aaa</button>
    
</body>

<script>
    
    const btn = document.querySelector('button')
    btn.addEventListener('click', function(e){
        console.log(e)
    })

</script>

</html>

在这里插入图片描述
这个对象里面有非常多的属性,大家可以通过名称得到他的作用是什么,这里就不多赘述了

二、环境对象this以及回调函数

2.1 它是什么?

环境对象:指的是函数内部特殊的变量 this,它代表着当前函数运行时所处的环境,普通函数的this指向window,在事件函数里面指向的是触发这个函数的对象。

作用:弄清楚this的指向,可以让我们代码更简洁
函数的调用方式不同,this 指代的对象也不同
[谁调用,this 就是谁] 是判断 this 指向的粗略规则
直接调用函数,其实相当于是 window.函数,所以this 指代 window

2.2 演示示例

示例代码:

<!DOCTYPE html>
<html lang="ch">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        div{
            width: 100px;
            height: 100px;
            background-color: pink;
        }
    </style>
</head>
<body>

    <button>aaa</button>
    
</body>

<script>

    function fn()
    {
        console.log(this)
    }

    window.fn()
    
    const btn = document.querySelector('button')
    btn.addEventListener('click', function(e){
        console.log(this)
    })

</script>

</html>

在这里插入图片描述

三、事件的高级操作

3.1 事件流

当我们在网页上进行一些交互操作,比如点击按钮或者输入文字时,浏览器会按照一定的顺序来处理这些事件。这个顺序被称为事件流。
事件流分为两种:冒泡流(Bubbling)和捕获流(Capturing)。以点击按钮为例,冒泡流表示点击按钮后,事件会从按钮开始向外层元素冒泡,而捕获流则是从外层元素开始捕获,一直到按钮。
通俗来说,就像是在水里扔了一块石头,水波会从石头的位置开始扩散,一方面水波向外扩散,另一方面水波也会向石头的位置聚拢。在事件流中,这个石头就是触发事件的元素,而水波就是事件在元素间传播的过程。
JavaScript 允许我们在事件流的不同阶段(捕获、目标、冒泡)中注册事件处理函数,通过这些函数,我们可以在不同的阶段进行操作,影响事件的处理过程。理解事件流有助于我们更好地处理和控制用户交互。

在这里插入图片描述

3.2 事件捕获

示例代码:
addEventListener参数三的作用: 一个布尔值,用于指定事件是在捕获阶段(true)还是冒泡阶段(false)调用事件处理程序。

<!DOCTYPE html>
<html lang="ch">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        div{
            width: 100px;
            height: 100px;
            background-color: pink;
        }
    </style>
</head>
<body>

    <button>aaa</button>
    
</body>

<script>
    document.addEventListener('click', function(){
        console.log('document被点击啦')
    },true)
    
    const btn = document.querySelector('button')
    btn.addEventListener('click', function(e){
        console.log('button被点击啦');
    },true)

</script>

</html>

在这里插入图片描述

3.3 事件冒泡以及阻止冒泡

示例代码:

<!DOCTYPE html>
<html lang="ch">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        div{
            width: 100px;
            height: 100px;
            background-color: pink;
        }
    </style>
</head>
<body>

    <button>aaa</button>
    
</body>

<script>
    document.addEventListener('click', function(){
        console.log('document被点击啦')
    })
    
    const btn = document.querySelector('button')
    btn.addEventListener('click', function(e){
        console.log('button被点击啦');
    })

</script>

</html>

在这里插入图片描述
阻止冒泡,使用这个函数阻止冒泡:

事件对象.stopPropagetion()

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

3.4 事件解绑

格式:

事件对象.removeEventListener('事件类型如click',要移除的函数名称)

示例代码:

<!DOCTYPE html>
<html lang="ch">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        div{
            width: 100px;
            height: 100px;
            background-color: pink;
        }
    </style>
</head>
<body>

    <button>aaa</button>
    
</body>

<script>
    function fn()
    {
        console.log('button被点击啦');
    }

    const btn = document.querySelector('button')
    btn.addEventListener('click', fn)

    btn.removeEventListener('click',fn)

</script>

</html>

3.5 mouseover和mouseenter事件的区别

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

3.6 事件委托

它是什么?

想象一下你在一个大型音乐会上,有很多观众。每个观众手里拿着一支荧光棒,而你是负责收集这些荧光棒的工作人员。你可以选择一直巡视每个观众,看看他们是否想把荧光棒给你,然后把每支都收下来。这样做确实可以,但有点费力。

现在,想象你站在舞台上,然后大声说:“谁有荧光棒要给我,都扔到舞台上来吧!”观众们听到后,就开始把荧光棒扔到舞台上。这时,你只需要站在舞台上,集中注意力收集掉在舞台上的荧光棒,而不用一个个地巡视每个观众。这就是事件委托的概念。

在 JavaScript 中,事件委托是指我们把事件监听器添加到父元素,而不是每个子元素都添加一个监听器。当事件发生时,事件会从子元素向父元素传播。这样我们只需要在父元素上处理事件,就能捕获所有子元素上发生的事件。

举个例子,如果有一个列表,你可以把点击事件监听器添加到整个列表的父元素。当用户点击列表中的任何一个项时,事件会冒泡到列表的父元素上,你就可以通过判断事件的目标来知道用户点击了哪个列表项。这样,无论列表有多长,我们只需一个监听器就能搞定,而不用给每个列表项都添加监听器,这样更高效。这就是事件委托的作用。

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

代码示例

<!DOCTYPE html>
<html lang="ch">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        div{
            width: 100px;
            height: 100px;
            background-color: pink;
        }
    </style>
</head>
<body>

    <div>
        <button>TestButton</button><button>TestButton</button><button>TestButton</button><button>TestButton</button><button>TestButton</button>
    </div>
</body>

<script>
    const div = document.querySelector('div')
    div.addEventListener('click', (e) => {
        console.log('有按钮点击啦')
    })

</script>

</html>

在这里插入图片描述
我们可以使用event对象里面的target来分辨对象是哪个

3.7 阻止使用的默认行为

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

我们可以使用event对象的preventDefault函数来阻止默认行为

示例代码:

<!DOCTYPE html>
<html lang="ch">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        div{
            width: 100px;
            height: 100px;
            background-color: pink;
        }
    </style>
</head>
<body>

    <a href="https://baidu.com/">打开百度</a>
</body>

<script>
    const a = document.querySelector('a')

    a.addEventListener('click', function(e){
        e.preventDefault()
        console.log('点击了链接')
    })
</script>

</html>

在这里插入图片描述
这样我们点击链接就没用啦


总结

通过深入了解事件对象、环境对象和回调函数,我们能够更好地处理用户交互和构建动态的 Web 应用。同时,掌握事件的高级操作,如事件委托和自定义事件,使得我们能够更高效、灵活地管理事件流和通信。这些概念的深入理解对于成为一位优秀的前端开发者至关重要。

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

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

相关文章

架构篇21:高性能负载均衡-算法

文章目录 轮询加权轮询负载最低优先性能最优类Hash 类源地址 HashID Hash小结负载均衡算法数量较多,而且可以根据一些业务特性进行定制开发,抛开细节上的差异,根据算法期望达到的目的,大体上可以分为下面几类。 任务平分类:负载均衡系统将收到的任务平均分配给服务器进行处…

MongoDB:从容器使用到 Mongosh、Python/Node.js 数据操作

文章目录 1. 容器与应用之间的关系介绍2. 使用 Docker 容器安装 MongoDB3. Mongosh 操作3.1 Mongosh 连接到 MongoDB3.2 基础操作与 CRUD 4. Python 操作 MongoDB5. Nodejs 操作 MongoDB参考文献 1. 容器与应用之间的关系介绍 MongoDB 的安装有时候并不是那么容易的&#xff0…

C++:模板特化 非类型模板参数

目录 1.非类型模板参数 2.模板特化 2.1 为什么需要模板特化 2.2 函数模板特化 2.3 类模板特化 1.全特化 2.偏特化 1.部分特化 2.参数更进一步的限制 1.非类型模板参数 模板参数分类类型形参与非类型形参 类型形参即&#xff1a;出现在模板参数列表中&#xff0c;跟在 cl…

java正则校验,手机号,邮箱,日期格式,时间格式,数字金额两位小数

java正则校验&#xff0c;手机号&#xff0c;邮箱&#xff0c;日期格式&#xff0c;时间格式&#xff0c;数字金额两位小数 3.58是否为金额&#xff1a;true 3.582是否为金额&#xff1a;false 1284789qq.com是否为email&#xff1a;true 1284789qq.com是否为email&#xff1…

01_Anaconda环境搭建

概述 Anaconda包含了许多常用的科学计算和数据分析的库和工具。通过Anaconda&#xff0c;用户可以更方便地安装、管理和更新这些库和工具&#xff0c;从而提高工作效率。 Anaconda还提供了一个名为conda的包管理器&#xff0c;可以帮助用户方便地安装、管理和更新这些库和工具…

linux 基于科大讯飞的文字转语音使用

官方文档地址&#xff1a;离线语音合成 Linux SDK 文档 | 讯飞开放平台文档中心 一、SDK下载 1、点击上面官方文档地址的链接&#xff0c;可以跳转到以下界面。 2、点击“普通版”&#xff0c;跳转到以下界面。 3、点击“下载”跳转到以下界面 4、最后&#xff0c;点击“SDK下…

AI编译器的前端优化策略

背景 工作领域是AI芯片工具链相关&#xff0c;很多相关知识的概念都是跟着项目成长建立起来&#xff0c;但是比较整个技术体系在脑海中都不太系统&#xff0c;比如项目参与中涉及到了很多AI编译器开发相关内容&#xff0c;东西比较零碎&#xff0c;工作中也没有太多时间去做复盘…

Linux 增加 SWAP 空间

一、需求 通过阿里云启动项目时&#xff0c;使用Vuepress build编译静态页面时内存需要800MB&#xff0c;导致内存不够&#xff0c;因此考虑使用swap方式&#xff0c;置换一些内存资源存放swap磁盘。 [rootxxx myblog]# npm run docs:dev> myblog1.0.0 docs:dev > vuep…

分类预测 | Matlab实现DT决策树多特征分类预测

分类预测 | Matlab实现DT决策树多特征分类预测 目录 分类预测 | Matlab实现DT决策树多特征分类预测分类效果基本描述程序设计参考资料分类效果

ParaView更改RenderView背景颜色

如下图&#xff0c;这种蓝紫色是ParaView的RenderView默认设置颜色 想要更改背景颜色&#xff0c;需要打开Properties如果想要更改渲染物体的颜色&#xff0c;需要打开Color Map Editor 打开方式&#xff1a; 在页面上方工具栏的地方右键&#xff0c;勾选Properties和Color …

stable diffusion学习笔记——文生图(二)

LORA和Embeddings都可以对画面内容进行调整。目前LORA主要用来定义画面特征&#xff0c;如具体的人物&#xff0c;衣物&#xff0c;画风等。Embeddings目前主要用于反面提示词中&#xff0c;用来避免错误的画面表现。 LORA lora的全称为&#xff1a;低秩适应模型。lora的基本…

算法,不再难学!揭秘两款让你迅速学会算法的在线工具

1. VisuAlgo VisuAlgo 是一个由 Dr. Steven Halim 创立的在线平台,用于通过可视化的方式帮助学生和开发者理解和掌握各种复杂的数据结构和算法。该网站特别适合那些视觉学习者,也就是通过看图形、动画和演示来更好地理解概念的人。 以下是 VisuAlgo 的一些关键特点和功能: …

深兰科技入选亿欧《“制”敬不凡先锋榜·智能机器人Top10》榜单

日前&#xff0c;由亿欧协办的2023工博会工业智能化发展高峰论坛于上海成功举办&#xff0c;会上发布了《2023智能制造&#xff1a;“制”敬不凡先锋者》系列名单。深兰科技凭借在智能机器人开发中的技术创新和模式应用&#xff0c;入选《“制”敬不凡先锋榜——智能机器人Top1…

Java8-Stream 流基本应用-groupBy进行分组

groupBy进行分组 Testpublic void testStreamGroupBy(){List<UserInfoModel> resultnew ArrayList<>();for (int i 0; i < 10; i) {UserInfoModel usernew UserInfoModel();user.setUserId(i"");user.setUserName("kangshihang");result.a…

基于深度学习的狗狗类别检测

探索狗狗识别技术 引言1. 数据集介绍1.1 语境1.2 内容1.3 致谢 2. 项目背景与意义3. 项目实现流程3.1 数据处理与准备3.2 环境准备与工具安装3.3 模型配置与训练3.4 模型评估与预测3.5 模型推理与部署 4. 总结 服务 引言 随着人工智能技术的不断发展&#xff0c;图像识别已成为…

LabVIEW信号时间间隔测量

用LabVIEW软件平台开发一个用于测量两路信号时间间隔的系统。系统利用LabVIEW的数据采集和处理能力&#xff0c;能够准确测量并分析来自不同硬件板卡的信号时间间隔&#xff0c;这对于精确控制和数据分析至关重要。 系统主要由以下几部分组成&#xff1a;数据采集卡、信号处理…

【Linux】命名管道

文章目录 命名管道一、命名管道的原理二、命名管道的创建命令行中创建程序中创建 - mkfifo函数&#xff1a; 三、命名管道的使用命名管道实现server&client通信 四、匿名管道与命名管道的区别 命名管道 如果涉及到在文件系统中创建一个有名的管道&#xff0c;那么就是在使…

【c语言】详解操作符(下)

前言&#xff1a; 在上文中&#xff0c;我们已经学习了 原码、反码、补码、移位 操作符、移位操作符、位操作符、逗号表达式、下标访问[ ]、函数调用&#xff08; &#xff09;&#xff0c;接下来我们将继续学习剩下的操作符。 1. 结构成员访问操作符 1.1 结构体成员的直接访…

技术书评和笔记【01】脑机接口-电路与系统 【2020版】

前言: 荷兰作者,Amir Zjajo博士,毕业于荷兰代尔夫特理工大学,方向 面向移动健康的低功耗混合型号电路与系统,以及,面向认知的神经形态电路。 ,脑机接口 - 电路与系统一书,系统介绍了,脑机接口电路与系统的实现技术,尤其,提到了量产和设计的问题,难能可贵,摘录如…

预训练语言模型transformer

预训练语言模型的学习方法有三类&#xff1a;自编码&#xff08;auto-encode, AE)、自回归&#xff08;auto regressive, AR&#xff09;&#xff0c;Encoder-Decoder结构。 决定PTM模型表现的真正原因主要有以下几点&#xff1a; 更高质量、更多数量的预训练数据增加模型容量…