首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >怎么创建 JavaScript 自定义事件

怎么创建 JavaScript 自定义事件

原创
作者头像
PHP开发工程师
发布于 2022-04-29 01:28:14
发布于 2022-04-29 01:28:14
1.6K00
代码可运行
举报
文章被收录于专栏:thinkphp+vuethinkphp+vue
运行总次数:0
代码可运行

你肯定处理过很多的事件监听,比如点击事件或者表单提交。事件监听对许多用例来说很有帮助,但是有时我们需要创建自己的自定义事件来处理复杂的交互。在这片短文中,我将告诉你有关创建自定义事件,侦听自定义事件以及创建双击自定义事件所要了解的内容。

怎么创建自定义事件

创建自定义事件听起来很困难,但是只需要下面简单的一行代码即可。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const myEvent = new Event("myCustomEvent")

你可以通过事件构造函数创建一个新的 Event 对象。在最基本的形式中,你只需要将一个字符串传递给构造函数,这个字符串就是你定义的事件名称。为了监听这个事件,你可以将该事件监听器添加到你要监听的元素上,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
document.addEventListener("myCustomEvent", e => {
  console.log(e)
})

最后一步,你需要做的事,触发创建并正在监听的事件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
document.dispatchEvent(myEvent)

这就需呀 dispatchEvent 函数了。每个元素都有这个方法,你要做的就是将你创建的对象传递给它。

如果我们将上面讲的组合在一起,我们就得到了一个基本的事件,这个事件在我们的 document 元素触发,相关的事件内容会被打印出来。

图中是这个事件对象的最基本形式。它包含大量信息,最重要的部分我这里突出显示了。

isTrusted 属性仅指该事件是由用户交互触发,还是由自定义 JavaScript 代码触发的。例如,当用户单击按钮时,事件将 isTrusted 设置为 true,而我们自定义的事件会将其设置为 false,因为该事件是由 JavaScript 触发的。

target 指调用 dispatchEvent 函数的元素。

type 指事件的名称。

事件定制

你可能注意到了,上面的详情中有属性 bubbles, cancelablecomposed 属性。这些实际上,在我们创建自定义事件时可以配置的选项。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const myEvent = new Event("myCustomEvent", {
  bubbles: true,
  cancelable: true,
  composed: true
})
冒泡 bubbles

当事件触发后,bubbles 属性决定这个事件是否可以通过 HTML 进行冒泡。这个值默认为 false,这意味着不可以进行冒泡行为,如果你想事件调用父 HTML 元素,你可以将其设置为 true

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const bubbleEvent = new Event("bubbleEvent", { bubbles: true })
const defaultEvent = new Event("defaultEvent", { bubbles: false })

document.addEventListener("bubbleEvent", () => {
  // This will get called since the event will bubble up to the document from the button
  console.log("Bubble")
})

document.addEventListener("defaultEvent", () => {
  // This never gets called since the event cannot bubble up to the document from the button
  console.log("Default")
})

const button = document.querySelector("button")
button.dispatchEvent(bubbleEvent)
button.dispatchEvent(defaultEvent)
可取消 cancelable

cancelable 属性决定事件是否可以通过调用 e.preventDefault() 取消。默认是 false 不可以。如果该属性是 true 值,你可以调用 e.preventDefault() 方法。e.preventDefault() 会将事件 defaultPrevented 属性设置为 true

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const cancelableEvent = new Event("cancelableEvent", { cancelable: true })
const defaultEvent = new Event("defaultEvent", { cancelable: false })

document.addEventListener("cancelableEvent", e => {
  e.preventDefault()
  console.log(e.defaultPrevented) // True
})

document.addEventListener("defaultEvent", e => {
  e.preventDefault()
  console.log(e.defaultPrevented) // False
})

document.dispatchEvent(cancelableEvent)
document.dispatchEvent(defaultEvent)
组合 composed

composed 属性决定事件是否可以通过影子 DOM 向上传播。默认值是 false。 该属性仅在你使用自定 HTML 元素和影子 DOM 的时候才适用,它所做的是允许事件在影子 DOM 外面传播。如果你想在影子 DOM 中触发的事件可以在影子 DOM 外被捕捉到,就将其设置为 true

没听懂没关系,后面学着学着就懂了

给事件传递自定义数据

当你使用自定事件时,你希望自定义的数据传递给你的事件。使用 new Event 构造函数是不可能的,这也就是为什么会有第二种创建事件的方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const myEvent = new CustomEvent("myEvent", { detail: { hello: "World" } })

CustomEvent 构造函数取代 Event 构造函数。这与 new Event 的工作方式相同,但你可以将 detail 属性以及 bubblescancelablecomposed属性一起传递给第二个参数。detail 属性中你设置的内容都会传递给事件监听器。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const myEvent = new CustomEvent("myEvent", { detail: { hello: "World" } })

document.addEventListener("myEvent", e => {
  console.log(e.detail) // { hello: "World" }
})

document.dispatchEvent(myEvent)

命名约定

在我们讲自定义双击事件的例子前,我想先讲讲命名约定。你可以为自定义事件命名任何你想要的名字,但是还是遵循命名约定,以更方便使用自己的代码。最普遍的命名约定事件,是为事件添加 custom: 前缀。

custom: 以区分自定义事件和本身的事件,而且,如果 JavaScript 添加与你的事件同名的新事件,它还可以确保你的代码不会中断。举个例子,如果 JavaScript 添加了一个名为 doubleclick 事件,然后你已经在时候 doubleclick 自定义事件了,那么你会遇到问题,因为你自定义代码将触发该事件,并且浏览器也会尝试触发它自己的副本。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Always use some form of naming convention
const myEvent = new Event("custom:doubleClick")

双击事件

在这个例子中,我们将创建一个双击的事件,只要你在短时间内单击一个元素,就会触发该事件。该事件还会将按钮单击之间的总时间作为自定义数据传递。

首先,我们需要创建一个正常的单击事件监听器来确保是否有双击。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const button = document.querySelector("button")

const MAX_DOUBLE_CLICK_TIME = 500
let lastClick = 0
button.addEventListener("click", e => {
  const timeBetweenClicks = e.timeStamp - lastClick
  if (timeBetweenClicks > MAX_DOUBLE_CLICK_TIME) {
    lastClick = e.timeStamp
    return
  }

  // TODO: Double click happened. Trigger custom event.
  lastClick = 0
})

上面的代码使用 timeStamp 属性来确保按钮上单击事件之间的时间。如果点击之间的时间超过 500 毫秒。则会立刻返回并更新 lastClick 的值。一旦我们在 500 毫秒内点击了两次,我们将通过 if 检查并触发我们的双击事件。为此,我们需要创建我们的事件并调用它。

对于我们自定义的事件,我们将所有选项都设置为 true,因为默认情况下,单击事件将所有这些属性设置为 true,而且我们希望双击的行为类似于正常的单击。我们也将 timeBetweenClicks 传递到 detail 选项中。最后,我们在事件的目标上调度事件,这里是按钮元素。我们剩下要做的最后一件事就是监听事件。

我们刚刚向按钮田间了一个简单的事件监听器,它将打印出 Double Click 之间的时间。

总结

自定义事件是 JavaScript 中处理手势和双击事件的好方案,最重要的是,他们非常容易实现和使用。

最后

如果你觉得这篇文章对你有点用的话,麻烦请给我们的开源项目点点star:http://github.crmeb.net/u/defu不胜感激 !

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Mysql进阶优化篇02——索引失效的10种情况及原理
上一篇mysql进阶优化篇,我们介绍了数据库的性能分析工具,知道了怎么发现数据库的性能问题,这一篇博客我们将介绍索引失效的10种情况及原理
半旧518
2022/10/26
1.3K0
Mysql进阶优化篇02——索引失效的10种情况及原理
Mysql进阶优化篇05——子查询的优化和排序优化
MySQL 从 4.1 版本开始支持子查询,使用子查询可以进行 SELECT 语句的嵌套查询,即一个 SELECT 查询的结果作为另一个 SELECT 语句的条件。子查询可以一次性完成很多逻辑上需要多个步骤才能完成的操作 。
半旧518
2022/10/26
2.5K0
Mysql进阶优化篇05——子查询的优化和排序优化
第10章_索引优化与查询优化
🧑个人简介:大家好,我是 shark-Gao,一个想要与大家共同进步的男人😉😉
程序员Leo
2023/08/02
5530
第10章_索引优化与查询优化
B+树挑选索引(2)---mysql从入门到精通(二十三)
上篇文章介绍了条件列,排序,分组都可以建立索引,select查询不需要建立,长字符串建立二级索引可以用索引前缀建立或者建立hash索引,避免时间和空间的浪费。建立索引的时候,列的类型尽量小点。还要看当前列的基数,基数越小,所有数据都一样,都无法排序,大量数据需要回表查询,所以基数越大才适合建立所以。
keying
2022/07/26
2480
1w字MySQL索引面试题(附md文档)
小熊学Java个人网站:https://javaxiaobear.gitee.io/,每周持续更新干货,建议收藏!
小熊学Java
2023/07/16
4310
1w字MySQL索引面试题(附md文档)
深分页怎么导致索引失效了?提供6种优化的方案!
在MySQL的limit中:limit 100,10MySQL会根据查询条件去存储引擎层找到前110条记录,然后在server层丢弃前100条记录取最后10条
菜菜的后端私房菜
2024/06/21
7591
Explain详解与索引优化实践
使用explain关键字可以模拟优化器执行SQL语句,从而知道MySQL是如何使用索引来处理你的SQL查询语句以及连接表,可以分析查询语句或是结构的性能瓶颈,帮助我们选择更好的索引和写出更优化的查询语句。(说白了,就是优化SQL的工具)
星哥玩云
2022/08/18
7360
Explain详解与索引优化实践
MySQL中InnoDB及索引深入剖析
我的博客: https://www.luozhiyun.com/archives/273
luozhiyun
2020/04/24
7870
MySQL中InnoDB及索引深入剖析
我去,为什么最左前缀原则失效了?
最近,在 mysql 测试最左前缀原则,发现了匪夷所思的事情。根据最左前缀原则,本来应该索引失效,走全表扫描的,但是,却发现可以正常走索引。
烟雨星空
2020/06/16
1.3K0
面试官:单表使用索引失效的场景有八种,还有其他场景吗?
可以通过建立了 索引,SQL如下 : CREATE INDEX idx_age_deptid_name ON emp(age,deptid,NAME);
小冷coding
2023/05/24
3150
面试官:单表使用索引失效的场景有八种,还有其他场景吗?
MySQL索引实战附带存储过程
索引虽然是个可以提高查询效率的好东西,但是吗世间万物自然有好有坏,索引有索引的好处,自然就会有其不完美的地方,建立索引之后,MySQL除了维护数据文件之外自然又多了一份维护索引文件的任务,如果数据频繁的变动,维护两份索引文件的MySQL自然是有些招架不住。反馈的效率自然就会慢于没有索引的时候,索引文件自然是要有它落盘的地方,所以就要占用空间喽,虽然硬盘不贵但是这些都是要加进项目的预算哦。所以我们就要了解一下索引的特性才能有效地趋利避坏。
姜同学
2022/10/27
7480
MySQL索引实战附带存储过程
一文读懂 MySQL 索引
从上面定义中我们可以分析出索引本质是一个数据结构,他的作用是帮助我们高效获取数据,在正式介绍索引前,我们先来了解一下基本的数据结构
说故事的五公子
2022/10/30
7801
一文读懂 MySQL 索引
性能优化|索引优化最佳实战
查看索引长度是74=(3*24+2),可以算出联合索引中只使用了name前缀索引.
AI码师
2020/11/19
4260
性能优化|索引优化最佳实战
第8章_索引的创建与设计原则
🧑个人简介:大家好,我是 shark-Gao,一个想要与大家共同进步的男人😉😉
程序员Leo
2023/08/02
4050
第8章_索引的创建与设计原则
SQL优化思路+经典案例分析
SQL调优这块呢,大厂面试必问的。最近金九银十嘛,所以整理了SQL的调优思路,并且附几个经典案例分析。
捡田螺的小男孩
2023/02/24
1.1K0
SQL优化思路+经典案例分析
【MySQL高级】索引优化
索引是数据库优化最常用也是最重要的手段之一, 通过索引通常可以帮助用户解决大多数的MySQL
陶然同学
2023/02/24
5730
【MySQL高级】索引优化
Mysql的SQL优化指北
在一次和技术大佬的聊天中被问到,平时我是怎么做Mysql的优化的?在这个问题上我只回答出了几点,感觉回答的不够完美,所以我打算整理一次SQL的优化问题。
luozhiyun
2020/02/11
1.1K0
【MySQL】七种SQL优化方式 你知道几条
如果一次性需要插入大批量数据 ( 比如 : 几百万的记录 ) ,使用 insert 语句插入性能较低,此时可以使
陶然同学
2023/10/14
6770
【MySQL】七种SQL优化方式 你知道几条
索引策略,性能爆炸!!!
相信大家在面试时候也会遇到如何进行查询优化的问题,其中索引相关的策略就是重点考察项,比如怎么设置索引列等。
Liusy
2021/03/21
1.1K0
MySQL索引失效分析
第三种情况,就是全值匹配。即我们建立的索引一楼是name,二楼是age,三楼是pos,查询的条件也是先name再age最后pos,从上面图中第三条语句的执行计划可以看出,使用三个const,效率是很高的。
贪挽懒月
2021/05/10
1.2K0
MySQL索引失效分析
相关推荐
Mysql进阶优化篇02——索引失效的10种情况及原理
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
加入讨论
的问答专区 >
技术总监架构部总经理擅长3个领域
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验