当前位置: 首页 > news >正文

Web APIs学习第三天:事件

昨天才发现原来有markdown编辑器,遂尝试使用了一下,体验感很不错!

Web APIs学习Day3

学会通过为DOM注册事件,来实现可交互的网页特效。

  • 能够判断函数运行的环境并确字 this 所指代的对象
  • 理解事件的作用,知道应用事件的 3 个步骤

文章目录

  • Web APIs学习Day3
    • 事件
      • 事件监听
      • 事件类型
        • 鼠标事件
        • 焦点事件
        • 键盘事件
        • 文本事件(文本框输入)
      • 事件对象
        • 获取事件对象
      • 环境对象
      • 回调函数

事件

事件是编程语言中的术语,是在编程时系统内发生的动作或发生的事情。它是用来描述程序的行为或状态的,一旦行为或状态发生改变,便立即调用一个函数。

例如:用户使用【鼠标点击】网页中的一个按钮、用户使用【鼠标拖拽】网页中的一张图片

事件监听

事件监听就是让程序检测是否有事件发生,一旦有事件触发,就立即调用一个函数做出响应,也称为绑定事件或注册事件。结合 DOM 使用事件时,需要为 DOM 对象添加事件监听,等待事件发生(触发)时,便立即调用一个函数。

比如说,鼠标经过显示下拉菜单、点击可以播放轮播图等等。

addEventListener 是 DOM 对象专门用来添加事件监听的方法,它的两个参数分别为【事件类型】和【事件回调】。

语法:元素对象.addEventListener('事件类型', 要执行的函数)

事件监听三要素:

  • 事件源:哪个 DOM 元素被事件触发了,要获取 DOM 元素
  • 事件类型:用什么方式触发,比如鼠标单击 click、鼠标经过 mouseover等
  • 事件调用的函数:要做什么事

比如说,当我们点击侧边导航栏中的某个栏目,页面会滑动到对应的栏目位置。这里事件源就是那个栏目,事件类型是 click,函数是页面滑动。

注意

  1. 事件类型要加引号
  2. 函数是点击之后再去执行,每次点击都会执行一次
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>事件监听</title>
</head>
<body><h3>事件监听</h3><p id="text">为 DOM 元素添加事件监听,等待事件发生,便立即执行一个函数。</p><button class="btn">点击改变文字颜色</button><script>// 1. 获取事件源 button对应的 DOM 对象const btn = document.querySelector('.btn')// 2. 添加事件监听btn.addEventListener('click', function () {console.log('等待事件被触发...')// 改变 p 标签的文字颜色let text = document.getElementById('text')text.style.color = 'red'})// 3. 只要用户点击了按钮,事件便触发了!!!</script>
</body>
</html>

完成事件监听分成3个步骤:

  1. 获取 DOM 元素
  2. 通过 addEventListener 方法为 DOM 节点添加事件监听
  3. 等待事件触发,如用户点击了某个按钮时便会触发 click 事件类型
  4. 事件触发后,相对应的回调函数会被执行

大白话描述:所谓的事件无非就是找个机会(事件触发)调用一个函数(回调函数)。

补充知识:垃圾回收机制

在随机点名案例中,我们会在事件监听所调用的函数中使用随机数:

<button>点击</button>
<script>const btn = document.querySelector('button')btn.addEventListener('click', function () {const num = Math.random()console.log(num)})
</script>

代码没有报错,有朋友可能会注意到我们在事件调用函数中使用 const 来定义随机数,但是每点击一次随机数就不同,这和 const 不会矛盾吗?

其实由于 JavaScript 的垃圾回收机制,这是不矛盾的。每次点击后调用函数,使用完变量 num 后因为没有其他地方再次使用这个变量了,js 就把它当作垃圾变量删掉了。之后再次点击触法函数时,js 又再次新建 num 变量,分配新空间。因此旧的 num 和 新的 num 是不冲突的。

同理,全局变量和局部变量不冲突。

事件类型

将众多的事件类型分类可分为:鼠标事件、键盘事件、表单事件、焦点事件等,我们逐一展开学习:

在这里插入图片描述

鼠标事件

鼠标事件是指跟鼠标操作相关的事件,如单击、双击、移动等。

click 译成中文是【点击】的意思,它的含义是监听(等着)用户鼠标的单击操作,除了【单击】还有【双击】dblclick

<script>// 双击事件类型btn.addEventListener('dblclick', function () {console.log('等待事件被触发...');// 改变 p 标签的文字颜色const text = document.querySelector('.text')text.style.color = 'red'})// 只要用户双击击了按钮,事件便触发了!!!
</script>

【事件类型】决定了事件被触发的方式,如 click 代表鼠标单击,dblclick 代表鼠标双击。

鼠标经过mouseenter监听鼠标是否移入 DOM 元素;

鼠标离开mouseleave监听鼠标是否移出 DOM 元素:

<!DOCTYPE html>
<html lang="en"><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></div><script>const div = document.querySelector('div')// 鼠标进入事件 盒子背景颜色变成红色div.addEventListener('mouseenter', function () {div.style.backgroundColor = 'red'})// 鼠标离开事件 盒子背景颜色变成粉色div.addEventListener('mouseleave', function () {div.style.backgroundColor = 'pink'})</script>
</body></html>
焦点事件

focus获得焦点(光标),blur失去焦点(光标)。

<input type="text">
<script>const input = document.querySelector('input')// 1. 获得焦点事件input.addEventListener('focus', function () {console.log('获得焦点')})// 2. 失去焦点事件input.addEventListener('blur', function () {console.log('失去焦点')})
</script>
键盘事件

keydown键盘按下触发,keyup键盘抬起触发。在开发中还是建议使用keyup

<input type="text">
<script>const input = document.querySelector('input')// 1. 获得键盘事件 键盘按下任意键触发input.addEventListener('keydown', function () {console.log('键盘按下')})// 2. 失去键盘事件 不再按压键盘input.addEventListener('keyup', function () {console.log('键盘抬起')})
</script>
文本事件(文本框输入)

input用户输入文本:

<input type="text">
<script>const input = document.querySelector('input')// 4. 文本事件input.addEventListener('input', function () {console.log(input.value) // 获得用户输入的内容})
</script>

事件对象

事件对象也是个对象,这个对象里有事件触发时的相关信息,例如:鼠标点击事件中,事件对象就存了鼠标点在哪个位置等的信息。

使用场景:

  • 可以判断用户按下哪个键,比如按下回车键可以发布新闻
  • 可以判断鼠标点击哪个元素,从而做出相应的操作
获取事件对象

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

语法:元素.addEventListener('事件类型', function (e) {})

其中的e就是事件对象。

我们在代码中来查看一下这个e里到底有哪些东西:

<button>点击我</button>
<script>// 1. 获取元素const btn = document.querySelector('button')// 2. 绑定事件btn.addEventListener('click', function (e) {console.log(e)})
</script>

点击按钮后,在浏览器控制台中,我们可以看到一个对象,里面包含很多属性:

在这里插入图片描述

部分常用属性:

  • type:获取当前的事件类型
  • clientX / clientY:获取光标(鼠标)相对于浏览器可见窗口左上角的位置
  • offsetX / offsetY:获取光标(鼠标)相对于当前DOM元素左上角的位置
  • key:用户按下的键盘键的值,注意,现在已不提倡使用 keyCode

环境对象

能够分析判断函数运行在不同环境中 this 所指代的对象。

环境对象指的是函数内部特殊的变量 this ,它代表着当前函数运行时所处的环境

作用:弄清楚 this 的指向,可以让我们代码更简洁。

每个函数都有 this 环境变量。我们现在代码中体会一下什么是 this:

function fn(){console.log(this)
}fn()
// 相当于 window.fn() this指向window

打开控制台,可以发现:

在这里插入图片描述

这就说明了在普通函数中,this 其实指向的是 window。也就是说,是 window 调用了 this。

在事件监听中,又是不同的情况:

<button>点击我</button>
<script>const btn = document.querySelector('button')btn.addEventListener('click', function(){console.log(this)})
</script>

在控制台中,返回的是:

在这里插入图片描述

这说明在这个事件绑定函数中,this 指向的是 button。

其实,在不同函数中,this 指向的对象不同。根据经验,我们得到总结:

  • 函数的调用方式不同,this 指代的对象也不同
  • 谁调用函数,this 就是谁,就指向谁。这是判断 this 指向的粗略规则。其实 this 的指向是可以修改的,这是重难点
  • 直接调用函数,其实相当于是 window.函数,所以 this 指代 window

现在认识了 this,在代码中,我们可以直接:

<button>点击我</button>
<script>const btn = document.querySelector('button')btn.addEventListener('click', function(){// btn.style.color = 'red' 相当于:this.style.color = 'red'})
</script>

有的时候,我们不知道当前调用函数的对象是谁,可以使用 this 来指代,这样就不需要再特意去找它了,是不是很方便~

回调函数

如果将函数 A 做为参数传递给函数 B 时,我们称函数 A 为回调函数

简单来说,就是当一个函数当作参数来传递给另外一个函数的时候,这个函数就是回调函数。

常见的场景:定时器函数

function fn() {console.log('我是回调函数...')
}
// fn传递给了 setInterval fn就是回调函数
setInterval(fn, 1000)

还有事件监听:

btn.addEventListener('click', function(){console.log('我是回调函数...')
})

回调回调,可以理解为回头调用,当然这么理解是不准确的,只是为了方便记忆。使用匿名函数作为回调函数比较常见。

http://www.dtcms.com/a/560652.html

相关文章:

  • UVa 1597 Searching the Web
  • 5分钟读懂MySQL+Redis双写一致性实现流程
  • 从零开始构建PDF文档生成器(二)- 添加页眉页脚
  • PostgreSQL 中 pg_stat_database 视图的 tup_returned 字段详解
  • 网络原理--HTTP
  • 网站开发宣传标语2017做网站还赚钱吗
  • 海南网站建设公司哪家好wordpress 有点慢
  • Flutter 存储管理:从基础到进阶的完整指南
  • 鸿蒙Flutter三方库适配指南:09.版本升级适配
  • AutoAnalyze智能数据分析助手开源项目
  • “监狱”风云:如何设计爬虫的自动降级与熔断机制?
  • 关于力扣3721. 最长平衡子数组 II线段树解法的反思
  • Visual Basic.NET 的特性
  • LabVIEW的Vision边缘工具(Edge Tool)功能
  • LabVIEW工业零件尺寸测量
  • 网站建设自建的优点百度指数在线查询前100
  • 【AI智能体】Docker 部署 Coze应用服务实战操作详解
  • QAxios研发笔记(二):在Qt环境下基于Promise风格简化Http的Post请求
  • 用 Flink CDC 将 MySQL 实时同步到 StarRocks
  • 基础开发工具---软件包装管理器及vim
  • 邮箱登陆嵌入网站义乌网站建设方案详细
  • 榨干 CPU 性能:通过绑核将 Redis 尾延迟减半!
  • 数据结构之栈和队列-队列
  • 十九、STM32的TIM(十)(编码器)
  • FSDP(Fully Sharded Data Parallel)全分片数据并行详解
  • Transformer 模型详解:从输入到输出的全流程剖析
  • 网站开发工单营销型网站建设设定包括哪些方面
  • EF Core 数据库迁移
  • 【攻防实战】通达OA文件上传联动Cobalt Strike打穿三层内网(下)
  • 网站备案 教程广州花都区网站建设