1、Event

Event 对象代表事件的状态,比如事件在其中发生的元素、键盘按键的状态、鼠标的位置、鼠标按钮的状态。

事件通常与函数结合使用,函数不会在事件发生前被执行!

Event的事件都是系统自带事件,比如鼠标、键盘、焦点等等!

可以用Document.createEvent(type) 方法创建自定义事件,type 是一个字符串,表示要创建的事件类型。事件类型可能包括"UIEvents""MouseEvents""MutationEvents", 或者 "HTMLEvents"。

只有在新创建的 Event 对象被 Document 对象或 Element 对象的 dispatchEvent() 方法分派之前,才能调用 Event.initEvent() 方法:

实例:

//自定义事件
var mdiv = document.getElementById("mydiv");
var myEvent = document.createEvent("HTMLEvents");
myEvent.data = "Hello world";
myEvent.initEvent("myOwnEvent",true,true);
mydiv.addEventListener("myOwnEvent",function(e){
console.log("我是自定义事件");
console.log(e.data);
},false);
mydiv.dispatchEvent(myEvent);

输出

由此可见,通过createEvent创建自定义事件比较局限,但也可满足大部分需求!

2、CustomEvent

这个应该是自定义事件的标准格式,如果需要用到自定义事件,推荐!

构造函数CustomEvent(eventName, params) 第一个参数是事件名称,用来区分事件,必填,第二个是参数,需要注意的是,params必须是{detail:{data:data}}格式!

实例

//自定义事件
var mdiv = document.getElementById("mydiv");
var eventName = "MY_EVENT";
var myEvent = new CustomEvent(eventName,{detail:{data:"Hello myEvent"}});
mdiv.addEventListener(eventName,function(evt){
console.log(evt.detail.data);
});
mydiv.onclick = function(){
mydiv.dispatchEvent(myEvent);
}

运行点击div则输出

这种自定义事件方式简单,而且比较自由!

3、TargetEvent

MDN:

EventTarget是一个由可以接收事件的对象实现的接口,并且可以为它们创建侦听器。

Elementdocument 和 window 是最常见的事件目标,但是其他对象也可以是事件目标,比如XMLHttpRequestAudioNodeAudioContext 等等。这个事件功能比较强大,个人觉得可以任意妄为,哈哈

实例

//自定义事件
function EventTarget(){
this.handlers = {};
}
EventTarget.prototype = {
constructor:EventTarget,
addHandler:function(type,handler){
if(typeof this.handlers[type] == 'undefined'){
this.handlers[type] = [];
}
this.handlers[type].push(handler);
},
removeHandler:function(type,handler){
if(this.handlers[type] instanceof Array){
var arr = this.handlers[type];
for(var i = 0,len = arr.length;i < len;i++){
if(arr[i] == handler){
arr.splice(i,1);
}
}
}
},
dispatchEvent:function(event){
if(!event.target){
event.target = this;
}
if(this.handlers[event.type] instanceof Array){
var arr = this.handlers[event.type];
for(var i = 0,len = arr.length;i < len;i++){
arr[i](event);
}
}
}
} var mdiv = document.getElementById("mydiv");
var eventName = "MY_EVENT";
var myEvent = new EventTarget();
myEvent.addHandler(eventName,function(evt){
console.log(evt.message);
});
myEvent.dispatchEvent({type:eventName,message:"触发成功"});

这里摘抄了一位网友的封装,大部分就是这个意思,这个相当于重写EventTarget类,重新封装下!

运行结果:

这里我们看到了,其实可以随意传递data,这个自定事件的封装比较牛叉,范围比较广,几乎可以应对一切自定义事件的需求,几近完美!

综上总结了js三种自定义事件的方式,无穷无尽而又完美无暇的宇宙,请赐我最完美的结论吧!奥!

js自定义事件CustomEvent、Event、TargetEvent的更多相关文章

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

    一.说明.引言 我JS还是比较薄弱的,本文的内容属于边学边想边折腾的碎碎念,可能没什么条理,可能有表述不准确的地方,可能内容比较拗口生僻.如果您时间紧迫,或者JS造诣已深,至此您就可以点击右侧广告(木 ...

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

    一.说明.引言 我JS还是比较薄弱的,本文的内容属于边学边想边折腾的碎碎念,可能没什么条理,可能有表述不准确的地方,可能内容比较拗口生僻.如果您时间紧迫,或者JS造诣已深,至此您就可以点击右侧广告(木 ...

  3. js 自定义事件 包含 添加、激活、销毁

    1.思路 (1)构思 var eventTarget = { addEvent: function(){ //添加事件 }, fireEvent: function(){ //触发事件 }, remo ...

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

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

  5. js自定义事件

    自定义事件的本质,创建一个对象,然后把事件的名字作为对象的一个属性,然后value是一个[],把此事件的所以回调都push进去. 写一个很基本的,没有把对象暴露出去的js的自定义事件. var eve ...

  6. JS自定义事件(Dom3级事件下)

    原文出处:  http://www.w3cfuns.com/notes/11861/e21736a0b15bceca0dc7f76d77c2fb5a.html . 我拿出作者中的一段,感谢作者原创. ...

  7. Javascript 自定义事件 (custom event)

    Javascript 中经常会用到自定义事件.如何创建一个简单的自定义事件呢?在创建自定义的事件之前,我们应该考虑一下和事件有关的东西.例如 click 事件,首先我们要能注册一个click事件(在一 ...

  8. 转: JS自定义事件的定义和触发(createEvent, dispatchEvent)

    四.伪DOM自定义事件 这里的“伪DOM自定义事件”是自己定义的一个名词,用来区分DOM自定义事件的.例如jQuery库,其是基于包装器(一个包含DOM元素的中间层)扩展事件的,既与DOM相关,又不直 ...

  9. cocos2d JS 自定义事件分发器(接收与传递数据) eventManager

    简而言之,它不是由系统自动触发,而是人为的干涉 较多情况用于传递数据 var _listener1 = cc.EventListener.create({ event: cc.EventListene ...

随机推荐

  1. C++类的对象和类的指针的区别

    #include <iostream> #include <string> using namespace std; class Student { public: stati ...

  2. PB赋值粘贴

    复制:string ls_templs_temp = trim(sle_1.text)Clipboard(ls_temp) 粘贴:string ls_templs_temp = Clipboard() ...

  3. SharePoint 创建页面布局

    一.前言 文章成体系,如果有不明白的地方请查看前面的文章. 二.目录 1.创建页面布局 2.首次使用页面布局 3.修改页面布局 4.使用页面布局 5.最终效果 1.创建页面布局 (1)打开设计管理器, ...

  4. AutoCAD2013 以上利用AccoreConsole+ c# NetApi Windows Froms 封装

    1# 封装类 public static class CmdHelper { /// <summary> /// 调用AutoCAD 安装目录下的AccoreConsole.exe来实现批 ...

  5. 【题解】P3391 文艺平衡树

    用pb_ds库中的rope水过去的,忽然发现这玩意能水好多模拟题. 详见这个博客:背景的小姐姐真的好看 声明 #include <ext/rope> using namespace __g ...

  6. QPushButton样式

    QPushButton:hover:!pressed { border: 1px solid #434E7A; }

  7. Oracle的FIXED

    今天发现一个有意思的问题,我们知道,在Oracle数据库中正常执行 select sysdate from dual 都可以返回当前主机的系统时间.正常修改系统时间,对应的查询结果也会变成修改后的系统 ...

  8. canvas签名

    <template> <div class="share" style="background:#fff"> <div class ...

  9. Python编写工具Pycharm破解

    我这边使用的是Pycharm2019.1.3 Pycharm下载地址 官网:https://www.jetbrains.com/pycharm/?fromMenu网盘:链接:https://pan.b ...

  10. MySQL计算两个日期相差的天数、月数、年数

    MySQL自带的日期函数TIMESTAMPDIFF计算两个日期相差的秒数.分钟数.小时数.天数.周数.季度数.月数.年数,当前日期增加或者减少一天.一周等等. SELECT TIMESTAMPDIFF ...