转 js自定义事件——Event和CustomEvent

之前在学习自定义事件时,在MDN的Event.initEvent()页面顶端有写:该特性已从Web标准中删除,虽然一些浏览器目前仍然支持它,但也许会在未来的某个时间停止支持,请尽量不要使用该特性。

  作为替代,我们可以通过创建Event对象和CustomEvent对象来创建自定义对象。先从Event()对象开始。

  

Event()——Event对象的构造函数

  

  咱们可以看着下面这个例子去了解如何使用Event()创建一个自定义对象:

 1 <script type="text/javascript">
 2     /* 创建一个事件对象,名字为newEvent,类型为build */
 3     var newEvent = new Event(‘build‘, { bubbles:true,cancelable:true,composed:true });
 4
 5     /* 给这个事件对象创建一个属性并赋值 */
 6     newEvent.name = "新的事件!";
 7
 8     /* 将自定义事件绑定在document对象上,这里绑定的事件要和我们创建的事件类型相同,不然无法触发 */
 9     document.addEventListener("build",function(){
10         alert("你触发了自定义事件!" + newEvent.name);
11     },false)
12
13     /* 触发自定义事件 */
14     document.dispatchEvent(newEvent);
15 </script>    

  启动文档的时候因为"document.dispatchEvent(newEvent)"的关系,会先触发一次事件:

  

  之后你每执行一次"document.dispatchEvent(newEvent)"都会触发这个事件:

  

  好,接下来我们看看Event()这个方法的语法把(disapthEvent()在我的另一个笔记里有介绍,这里就不再次介绍了):

  event = new Event(typeArg, eventInit);

  typeArg:指定事件类型,传递一个字符串。这里的事件类型指的是像点击事件(click)、提交事件(submit)、加载事件(load)等等。

  eventInit:可选,传递EventInit类型的字典。实际上这个EventInit类型的字典也就是我们使用InitEvent()时需要传递的参数,以键值对的形式传递,不过它可以多选一个参数:

    bubbles:事件是否支持冒泡,传递一个boolean类型的参数,默认值为false。

    cancelable:是否可取消事件的默认行为,传递一个boolean类型的参数,默认值为false。

    composed:事件是否会触发shadow DOM(阴影DOM)根节点之外的事件监听器,传递一个boolean类型的参数,默认值为false。(关于shadow DOM可以去看ChokCoco前辈的这篇文章,这里就不详说了,可能我会根据自己的理解也写一个关于shadow DOM的笔记)这个参数是InitEvent()中没有的新参数。

  

  用法其实和使用createEvent()结合initEvent()差不多,不过Event()不支持IE浏览器,所以怎么使用还是得看咱们。

  

CustomEvent()——CustomEvent对象的构造函数

  CustomEvent()可以像Event()那样赋值,但它可以在Web Workers中使用(与主线程分离的另一个线程),可以传递跟事件关联的相关值(detail)。(但我贼Event()中没看到又说可不可以使用Web Workers,写完这个去查查)

  我们先通过下面的例子了解一下如何使用CustomEvent()去创建一个事件对象(这里先不使用事件相关值detail):

 1 <script type="text/javascript">
 2     /* 创建一个事件对象,名字为newEvent,类型为build */
 3     var newEvent = new CustomEvent(‘build‘, { bubbles:true,cancelable:true,composed:true });
 4
 5     /* 给这个事件对象创建一个属性并赋值,这里绑定的事件要和我们创建的事件类型相同,不然无法触发 */
 6     newEvent.name = "新的事件!";
 7
 8     /* 将自定义事件绑定在document对象上 */
 9     document.addEventListener("build",function(){
10         alert("你触发了使用CustomEvent创建的自定义事件!" + newEvent.name);
11     },false)
12
13     /* 触发自定义事件 */
14     document.dispatchEvent(newEvent);
15 </script>  

  启动文档的时候因为"document.dispatchEvent(newEvent)"的关系,会先触发一次事件:

  之后你每执行一次"document.dispatchEvent(newEvent)"都会触发这个事件:

  

  然后我们来看CustomEvent()的语法:

  event = new CustomEvent(typeArg, customEventInit);

  typeArg:指定事件类型,传递一个字符串。这里的事件类型指的是像点击事件(click)、提交事件(submit)、加载事件(load)等等。

  customEventInit:可选。传递一个CustomEventInit字典。实际上这个字典就是我们使用initCustomEvent()时需要的参数,这个参数就是事件相关值(detail):

    detail:可选,默认值为null,类型为any(也就是说可以传递任意类型的参数)。这个值就是和事件相关联的值。

  在展示使用detail作为第二个参数的例子前,要先注意一件事:CustomEventInit字典也可以接受EventInit字典的参数,就像一开始的例子一样,我传递了EventInit字典的bubbles、cancelable、composed。

  下面将展示使用detail参数的例子,使用到detail的部分我会加粗处理(为了看着方便,这回就不传递EventInit字典中的参数了):

 1 <script type="text/javascript">
 2     /* 创建一个事件对象,名字为newEvent,类型为build */
 3     var newEvent = new CustomEvent(‘build‘,{
 4         detail: {
 5             dog:"wo",cat:"mio"
 6         }
 7     });
 8
 9     /* 将自定义事件绑定在document对象上 */
10     document.addEventListener("build",function(){
11         alert(" event.detail.dog:" + event.detail.dog
12          + "\n event.detail.cat:" + event.detail.cat );
13     },false)
14
15     /* 触发自定义事件 */
16     document.dispatchEvent(newEvent);
17 </script>  

  启动文档的时候因为"document.dispatchEvent(newEvent)"的关系,会先触发一次事件:

  

  之后你每执行一次"document.dispatchEvent(newEvent)"都会触发这个事件:

  

  



参考资料:

MDN - 创建和触发Event:https://developer.mozilla.org/zh-CN/docs/Web/Guide/Events/Creating_and_triggering_events

MDN - Event():https://developer.mozilla.org/zh-CN/docs/Web/API/Event/Event

MDN - CustomEvent():https://developer.mozilla.org/zh-CN/docs/Web/API/CustomEvent/CustomEvent

MDN - CustomEvent.initCustomEvent():https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/initCustomEvent

MDN - CustomEvent.detail:https://developer.mozilla.org/zh-CN/docs/Web/API/CustomEvent/detail

原文地址:https://www.cnblogs.com/xiaozhang666/p/11582740.html

时间: 2024-07-31 01:22:14

转 js自定义事件——Event和CustomEvent的相关文章

漫谈js自定义事件、DOM/伪DOM自定义事件

一.说明.引言 我JS还是比较薄弱的,本文的内容属于边学边想边折腾的碎碎念,可能没什么条理,可能有表述不准确的地方,可能内容比较拗口生僻.如果您时间紧迫,或者JS造诣已深,至此您就可以点击右侧广告(木有?则RSS或盗版)然后撤了. 事件是个大课题,真要从断奶开始讲起的话,可以写个12期的连载.关于JS事件的文章(类似DOM/BOM事件模型,IE与其他浏览器事件差异,DOM1/DOM2事件定义等)落叶般随处可见.熟豆子反复炒一点意思都没有,因此,这里谈谈自己感兴趣的自定义事件以及周边. 所谓自定义

js自定义事件、DOM/伪DOM自定义事件

一.说明.引言 我JS还是比较薄弱的,本文的内容属于边学边想边折腾的碎碎念,可能没什么条理,可能有表述不准确的地方,可能内容比较拗口生僻.如果您时间紧迫,或者JS造诣已深,至此您就可以点击右侧广告(木有?则RSS或盗版)然后撤了. 事件是个大课题,真要从断奶开始讲起的话,可以写个12期的连载.关于JS事件的文章(类似DOM/BOM事件模型,IE与其他浏览器事件差异,DOM1/DOM2事件定义等)落叶般随处可见.熟豆子反复炒一点意思都没有,因此,这里谈谈自己感兴趣的自定义事件以及周边. 所谓自定义

js自定义事件的实现探索

我们一般所熟悉的事件,都是这样的:onclick,onmouseover,ontouchstart,onfocus... 但这里要讨论自定义事件的实现,包含:事件注册/监听.事件分发. 有两种方式去实现: 自己实现事件管理器:CustomEventManager 使用document.createEvent 先说第一种方式 CustomEventManager的实现 要实现一个完整的事件体系,必须包含2大功能:注册/监听.触发,用伪代码表示: function CustomEventManage

js自定义事件模式

---恢复内容开始--- js事件用的最多的就是默认事件.不过有时候需要自定义事件来使用. 参照默认事件的模式,例如click事件,鼠标点击dom,先触发click事件,然后执行dom上的事件处理程序. <p>点我</p> document.getElementByTagName('p')[0].addEventLisener('click',()=>{ alert('click'); }) 同理,自定义事件也需要三个部分,即事件注册.事件触发.处理程序. 这里使用原型方法做

vue.js 自定义事件

<div id="app"> <h2>{{num}}</h2> <h1>全局组件</h1> <my-component @myclick="vueAdd"></my-component> <!-- 渲染全局组件--> </div> </body> </html> <script>/* */ Vue.component('my

js自定义事件

var Event = { _listeners: {}, // 添加 addEvent: function (type, fn) { if(typeof this._listeners[type] === 'undefined') { this._listeners[type] = []; } if(typeof fn === 'function') { this._listeners[type].push(fn); } return this; }, // 触发 fireEvent: fun

js 自定义事件

<!DOCTYPE html> <html> <head lang="zh-CN"> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title></title> <style> .button

js 自定义事件观察者模式(发布/订阅)

/* * 示例: * Event.create("namespace1").listen('click', function(a){ * console.log(a); * }); * Event.create("namespace1").trigger("click", 1); */ window.myEvent = (function() { var global = this, Event, _default = 'default'; Ev

js 自定义事件 document.createEvent

小demo 图片查看器 <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>图片查看器</title> <style> ul{ list-style: none; display: flex; flex-wrap: wrap; } ul img{ width: 400px; } #mask{ posi