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

怎么创建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 中处理手势和双击事件的好方案,最重要的是,他们非常容易实现和使用。
  本文为译文,采用意译
  【完】

西红柿不能随便吃?提醒这3类人,平时尽量少吃,要听劝西红柿颇得古今医家赏识。其性微寒味甘酸,生津止渴,凉血养肝,清热解毒,治疗高血压坏血病,预防动脉硬化肝脏病等。陆川本草记载西红柿健胃消食,治口渴食欲不振。西红柿含有丰富的营养,又有戴伟浚深足年薪曝光,数字感人却仍被欠薪,下赛季天价工资引争议中超开赛遥遥无期,原本定于五月中旬开启新赛季,不过因为场地检验等原因,无奈只能无限期延迟。虽然中超短时间内无法正常化,但是转会市场却相对活跃,很多球员不满俱乐部的限薪和欠薪,纷纷转大疆与GoPro决裂背后的暴风雨说起大疆和GoPro,熟悉数码产品的粉丝肯定都是耳熟能详。在相机市场的细分领域内,一个是消费级无人机领域的绝对霸主,一个是运动相机领域的领头羊。两者看似毫无关联,但是因为运动相机和小马智卡最新进展曝光中国高速,风雨雾交加,连续6小时不接管浩楠雷刚发自副驾寺智能车参考公众号AI4Auto盆友们,要论自动驾驶技术的卷王,是不是非小马智行莫属?就在去年,他们秀出过一段1小时连续无接管的广州城市内完全无人驾驶的Robota我眼中的江南古有白居易称赞江南日出江花红胜火,春来江水绿如蓝,当你读到这首诗,会不会想到一幅画?在碧蓝的湖面上,一叶小舟向着初升的太阳飘去,在小舟的不远处,湖边的花儿被出升的阳光一照,比火还要姚明捐赠自己的大鞋子,身材发福严重,体重400斤引担忧篮球巨星姚明向中国体育博物馆捐赠了一双自己的签名运动鞋。看照片就知道,这双鞋子真的很大。据报道,姚明穿的鞋子是53码,长31。5公分。普通人的鞋子一般是45码左右,姚明身高达到2米奥拉朱旺的4个徒弟,小斯,霍华德白学姚明入门只有他学到精髓在90年代,NBA出现了四大中锋,分别是奥拉朱旺大卫罗宾逊尤因以及奥尼尔。在这四人当中,技术最好的毫无疑问就是奥拉朱旺,他也是被誉为NBA历史上技术最全面的一名中锋球员。作为一名大恩比德拇指韧带撕裂,哈登夺冠又要等一年,猛龙有望创历史76人主教练里弗斯在接受采访时表示,恩比德的MRI结果证实为右手拇指韧带撕裂。NBA名记Woj报道,由于76人正处在季后赛的关键时刻,所以恩比德不会手术,而是采取保守治疗,带伤打完带伤拼到无法出场!孙铭徽打光最后的子弹,广厦男篮虽败犹荣昨晚,CBA总决赛又进行了一场交锋。不得不说,今年的CBA总决赛关注度极低,已经没什么人去关心了,因为胜负悬念基本没有,缺少了常规赛MVP胡金秋和队内最佳第六人赵岩昊的广厦男篮完全再现水花消失术!全红婵击败2大奥运冠军队友,发育关伤病难挡她中国跳水队测试赛继续进行,在女子10米台比赛中,全红婵陈芋汐张家齐三位奥运冠军,再次同场竞技。最终,全红婵毫无悬念击败张家齐和陈芋汐,拿到这次测试赛的第一名。值得一提的是,此前全红女篮2米26高塔独霸篮下!曾爆砍4225受WNBA关注许利民亲自考察中国女篮本年度最重要的比赛莫过于世界杯的争夺,九月份女篮国家队即将迎战韩国波黑美国比利时等众多强队,距离比赛还有四个多月时间,女篮队员们已经开启了短暂的假期模式。目前中国女篮的世界
马克杰克逊期待有朝一日重掌NBA帅印北京时间12月31日,据TMZ体育报道,前勇士主帅马克杰克逊希望自己能够得到重掌帅印的机会。我的手机是开着的,所以我随时有空,马克杰克逊如是说,他们知道该如何找到我,期待着那一天的男篮前锋广东占0位,张镇麟跟曾凡博被破格提拔,5巨头足以拿金牌男篮18人锁定5大前锋,广东锋线0人入选,曾凡博张镇麟跟胡金秋将被大力提拔,而乔尔杰维奇取代杜锋之后,将会带领男篮国家队打得风生水起。对于杜锋的爱徒,任俊飞要被抛弃掉了,在球场当中广东18分击败北京!杜锋点评曾凡博汉密尔顿加盟宏远真实感受曝光CBA常规赛第20轮,广东男篮10284北京首钢,这场比赛广东全场处于领跑的状态下,丝毫没有给到北京机会,上一场17分大胜对手后,此役也是18分赢球,第四节完全练兵时间,杜锋一边磨解析学习少儿编程的四大阶段,快来看看您的孩子在哪个阶段?如今这个时代,人工智能越来越发达,很多家长为了让孩子跟上时代的脚步,在选择让孩子学习编程时,会常常纠结选择什么样的编程语言。现在编程语言有很多,什么CPythonScratchVBChiplet是昙花一现?还是国内半导体弯道超车的机会?前言近年来,在几大厂商的推动下,Chiplet成为了业界的关注点。AMDEYPC系列的成功,真正让Chiplet进入主流业界视线。通过Chiplet方案中国大陆或将可以弥补目前芯片三星展示亮度高达2000尼特的智能手机OLED屏幕IT之家1月5日消息,三星显示今日在CES2023上展示了亮度高达2000尼特的智能手机OLED屏幕,该屏幕已通过全球检测机构UL(UnderwritersLaboratories深蓝SL03月销量破万,长安新能源又成功了?新能源电动车市场的竞争日渐激烈,所以各车企也是使出了浑身解数,甚至推出专属的新能源品牌,长安深蓝就是长安在新能源领域的一把利剑。长安深蓝SL03作为品牌推出的第一款车型,在7月底正36氪独家丨李斌全员信细数蔚来8大问题将优化低效项目和团队文丨李勤彭苏平编辑丨杨轩我们要清醒地认识到,不少同行的同期表现比我们更加出色。我们的交付量增速落后于中国智能电动汽车市场的整体增速。2022年,新造车行业度过了动荡艰险的一年,蔚来努比亚Z50新配色中国红兔年限定版,官宣1月12日上市随着2023年春节一天天的临近,为了赶上年底换新机热潮,近期各大厂商纷纷加快新机发布节奏,不到一个月的时间内,市场便涌现出10余款搭载骁龙8Gen2的旗舰机型,带给消费者更丰富选择苹果市值跌破2万亿美元新华社北京1月5日电美国苹果公司股票价格3日下跌超过3,报收于每股125。07美元,总市值跌到2万亿美元以下。这是自去年5月以来,苹果市值首次跌破2万亿美元。美国消费者新闻与商业频银保监会最新发布!首部银行托管业务监管办法来了,划清150万亿托管财产边界银保监会12月29日发布商业银行托管业务监督管理办法(征求意见稿)(下称办法),即日起至2023年1月29日进行公开意见征集。办法是我国首部适用于各类托管产品的监管法规,业内人士普