范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

怎么创建JavaScript自定义事件

  #头条创作挑战赛#
  banner
  本文同步本人掘金平台的原创翻译:https://juejin.cn/post/7091657693362356255
  你肯定处理过很多的事件监听,比如点击事件或者表单提交。事件监听对许多用例来说很有帮助,但是有时我们需要创建自己的自定义事件来处理复杂的交互。在这片短文中,我将告诉你有关创建自定义事件,侦听自定义事件以及创建双击自定义事件所要了解的内容。怎么创建自定义事件
  创建自定义事件听起来很困难,但是只需要下面简单的一行代码即可。const myEvent = new Event("myCustomEvent") 复制代码
  你可以通过事件构造函数创建一个新的 Event 对象。在最基本的形式中,你只需要将一个字符串传递给构造函数,这个字符串就是你定义的事件名称。为了监听这个事件,你可以将该事件监听器添加到你要监听的元素上,如下:document.addEventListener("myCustomEvent", e => {   console.log(e) }) 复制代码
  最后一步,你需要做的事,触发创建并正在监听的事件。document.dispatchEvent(myEvent) 复制代码
  这就需呀 dispatchEvent 函数了。每个元素都有这个方法,你要做的就是将你创建的对象传递给它。
  如果我们将上面讲的组合在一起,我们就得到了一个基本的事件,这个事件在我们的 document 元素触发,相关的事件内容会被打印出来。
  图中是这个事件对象的最基本形式。它包含大量信息,最重要的部分我这里突出显示了。
  isTrusted 属性仅指该事件是由用户交互触发,还是由自定义 JavaScript 代码触发的。例如,当用户单击按钮时,事件将 isTrusted 设置为 true,而我们自定义的事件会将其设置为 false,因为该事件是由 JavaScript 触发的。
  target 指调用 dispatchEvent 函数的元素。
  type 指事件的名称。事件定制
  你可能注意到了,上面的详情中有属性 bubbles, cancelable 和 composed 属性。这些实际上,在我们创建自定义事件时可以配置的选项。const myEvent = new Event("myCustomEvent", {   bubbles: true,   cancelable: true,   composed: true }) 复制代码冒泡 bubbles
  当事件触发后,bubbles 属性决定这个事件是否可以通过 HTML 进行冒泡。这个值默认为 false,这意味着不可以进行冒泡行为,如果你想事件调用父 HTML 元素,你可以将其设置为 true。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。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 构造函数是不可能的,这也就是为什么会有第二种创建事件的方法。const myEvent = new CustomEvent("myEvent", { detail: { hello: "World" } }) 复制代码
  CustomEvent 构造函数取代 Event 构造函数。这与 new Event 的工作方式相同,但你可以将 detail 属性以及 bubbles,cancelable 和 composed属性一起传递给第二个参数。detail 属性中你设置的内容都会传递给事件监听器。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 自定义事件了,那么你会遇到问题,因为你自定义代码将触发该事件,并且浏览器也会尝试触发它自己的副本。// Always use some form of naming convention const myEvent = new Event("custom:doubleClick") 复制代码双击事件
  在这个例子中,我们将创建一个双击的事件,只要你在短时间内单击一个元素,就会触发该事件。该事件还会将按钮单击之间的总时间作为自定义数据传递。
  首先,我们需要创建一个正常的单击事件监听器来确保是否有双击。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 中处理手势和双击事件的好方案,最重要的是,他们非常容易实现和使用。
  本文为译文,采用意译
  【完】✅

累计传播量1。5亿!这场元宵焰火秀让南阳全网出圈顶端新闻记者黄亚芳张玥颖建强副中心,奔向新辉煌。在灯光秀无人机秀焰火秀的三重元宵视觉盛宴中,南阳市各大文旅景区顶端携手,邀请全国网友在2023年三顾南阳。2月5日晚,一场元宵焰火盛去广州有花的地方,打卡许红豆同款浪漫花墙刚刚过去的一月,旅游业重启,打开朋友圈几乎就能云游大半个中国,其中最热门的就是云南了。热播剧去有风的地方到如今依旧话题不断,除了刘亦菲李现的剧情好嗑,里面的风景也是治愈感十足,刘亦终于迎来梅花季!走啊,去醉美梅园奔赴2023年第一场花事!风软,日丽。入梅园。梅树灿灿而开。红白淡粉,灿若云霞。在温州,赏梅之处颇多。但你也许不知道,在温州最经典的赏梅去处,是位于永嘉县东城街道的梅园村。梅花绽放时,漫山遍野,无数的梅花压土耳其16名女排队员遇难,最小仅12岁!唐小强也在该酒店遇难,建筑质量遭质疑2月11日,土耳其排球联合会宣布一女排球队在土耳其境内遇难。据多家媒体报道,北塞浦路斯有39人来到土耳其交流,年龄最小的只有12岁,住在东南部城市阿德亚曼有7层楼高的伊萨斯酒店。地一张图看懂,广西中北部深度9日怎么玩大家好,我是爱自驾旅行的Max,以下是我曾经旅行过的地方。国内西藏新疆青海甘肃云南贵州福建广东海南国外美国加拿大新西兰澳大利亚新西兰泰国南非意大利冰岛挪威法国塞尔维亚黑山波黑伊朗这从莲塘口岸去香港有多香?免排队,停车免费,8分钟极速通关在香港与内地恢复全面通关后,有半夜穿拖鞋来深圳吃宵夜的香港人,也有凌晨穿睡衣去办理签注的深圳人,这个周末的口岸,也许会比节假日更加热闹。而且可以预见,不久的将来,罗湖福田深圳湾等几20天20队之浙江稠州金租并非三分大队,但是联盟第一!距离202223赛季CBA联赛第三阶段开赛还有20天时间,各支球队也是铆足了劲儿,迎接三年来第一个主客场赛制。从今天开始,我们就梳理一下20支球队在前两个阶段积累的战果和数据吧!首关于坐国际航班的那些事(一)不是第一次出国,但是却是第一次在高空中连续飞行26个小时,当到了目的地位于南美洲的厄瓜多尔首都基多,脑子还是晕乎乎的!(飞越大西洋)当我们在海关录入资料,过完海关,推着行李走出机场出境游重启旅行社琢磨新菜单新变化让市场迎来大洗牌2月7日,我省首个精品旅游团前往柬埔寨2月6日,被按下暂停键三年的旅行社出境游业务(跟团游和机酒自由行)试点恢复,无疑为春节假期已经火出圈的旅游市场再添重大利好。一石激起千层浪。当keepalived使用子网卡的ip创建HA失败Keepalived是个一个基于VRRP协议来实现的LVS服务高可用方案的开源组件,可以利用其来解决单点故障问题。一个LVS服务器(LinuxVirtualServerLinux虚虹口区筑起了云南富宁县瓦蚌村的乌托邦待我了无牵挂,从此归隐天涯。深山草屋为家,了却人世浮华。忙时修篱种菊,闲时小酒清茶。相邀三五知己,余生共度清雅。在这如痴如醉的诗词里,流露出诗人向往静谧的田园生活,这样的生活,不也
十年两会温暖记忆光明的路,我们越走越宽敞!编者按2013年起,习近平总书记连续10年出席全国两会,50余次参加团组审议讨论,面对面听取数百位代表委员发言,留下许多暖心瞬间。今年全国两会就要召开了,新华社记者近日走访了10位ChatGPT对于2023年的数字化的看法,这几点你要知道!近期ChatGPT的火热程度已无法言表,为此我也注册了个账号和ChatGPT进行了深入的探讨,对于中国的数字化进程想取得进一步的探索,因此提出了很多疑问。本期内容主题关于2023年太阳是否具有像三体中讲述的,将电磁波信号放大的功能?三体一书中描述的是叶文洁在红岸基地使用太阳作为信号放大器向全宇宙发射信号,通过利用太阳对宇宙微波背景辐射的放大作用来传送信息。这个想法并非纯粹的虚构,而是建立在现有物理知识上的想象即时零售被写进中央一号文件背后重新发现县域经济解法solution寻找新经济和垂直行业的100种打法原创科技考拉2023开年伊始,不少零售商和创业者就嗅到了新的机会和风口。2月13日,中共中央国务院关于做好2023年全面推进乡爱奇艺调整VIP投屏规则恢复老会员1080P投屏服务前段时间有不少用户表示,现在一些视频平台限制了投屏功能。比如你以前能投4K高清视频,但现在只能投480P清晰度的,想要投4K高清就只能购买更贵的会员套餐。该事件在网上迅速发酵,甚至大都市城市水网中微污染物变化的系统研究2022年8月17日,水研究(WaterResearch)期刊在线发布大都市城市水网中微污染物变化的系统研究(Asystematicstudyofmicroplasticoccur一加BudsPro2R于海外正式发布,支持主动降噪2月21日消息,一加在此前于印度市场发布一加11与一加11R时,也公布了旗下的音频产品,其中包含有一款面向印度市场的一加BudsPro2R。据了解,一加BudsPro2R应该是一加云原生卷进政企市场深水区虽然在传统概念中,政企客户并不像互联网是生于云长于云的云原生企业,但到2027年,预计中国2000强公司40的收入将源于数字化产品和服务。从某种意义上说,未来企业都将成为云原生企业每日智讯230221IntelAVX512指令集性能暴涨17倍Intel近日更新了开源的C头文件库,正式支持AVX512SIMD指令集,相比此前的AVX2指令集,可以提供更高性能的SIMD排序。基于A特斯拉modelS德国车主行驶160万公里,电池换2次,电机换10个!近日,德国一位特斯拉车主在推特上说,自己购买的ModelS的行驶里程足足达到了100万英里(约合160万公里),估计这是为数不多的行驶了这么长距离的车主。他表示更换过两个电池组和1宣泄反美情绪,德国用慕尼黑安全会议证明中国5G通讯设备最安全德国用慕尼黑安全会议证明中国5G通讯设备在欧洲也是最安全通讯设备。尤其是在欧洲政客和外交人士云集的场合,更要命的是对中国5G通讯设备恨之入骨美国入会者面前,狠狠抽打着美国政客在中国