EventTarget

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

Elementdocumentwindow 是最常见的事件目标,但是其他对象也可以是事件目标,比如XMLHttpRequestAudioNodeAudioContext 等等。

许多事件目标(包括元素,文档和 window)还支持通过 on... 属性和属性设置事件处理程序。

构造函数节

  • EventTarget()

    创建一个新的 EventTarget 对象实例。

方法节

  • EventTarget.addEventListener()

    在EventTarget上注册特定事件类型的事件处理程序。

  • EventTarget.removeEventListener()

    EventTarget中删除事件侦听器。

  • EventTarget.dispatchEvent()

    将事件分派到此EventTarget。

Mozilla chrome 代码的其他方法节

Mozilla扩展,供JS实现的事件目标使用以 实现 on* 属性。另见 WebIDL bindings 绑定。

  • void setEventHandler(DOMString type, EventHandler handler)
  • EventHandler getEventHandler(DOMString type)

示例节

EventTarget 的简单实现节

function EventTarget() {this.listeners = {};
}Object.assign(EventTarget.prototype, {// listeners: null,// prefix:"on",addEventListener: function (type, callback) {if (!(type in this.listeners)) {this.listeners[type] = [];}this.listeners[type].push(callback);},removeEventListener: function (type, callback) {if (type in this.listeners) {let stack = this.listeners[type];let index = stack.indexOf(callback);console.log(index);//可能会添加多个while (index !== -1) {stack.splice(index, 1);index = stack.indexOf(callback);}}},dispatchEvent: function (event) {if (event.type in this.listeners) {let stack = this.listeners[event.type];event.target = this;stack.forEach(callback => {callback.call(this,event);})}}
});let target = new EventTarget();
let remove = (e) => {console.log(e)};
target.addEventListener("test",remove);
target.addEventListener("test",remove);
target.addEventListener("test",(e) => {console.log(e)});
target.removeEventListener("test",remove);
target.dispatchEvent({type:"test"});

当单击这个例子中的按钮时, this 和 currentTarget 都等于 document.body,因为事件处理程 序是注册到这个元素上的。然而, target 元素却等于按钮元素,因为它是 click 事件真正的目标。由 于按钮上并没有注册事件处理程序,结果 click 事件就冒泡到了 document.body,在那里事件才得到 了处理。

document.body.onclick = function(event){alert(event.currentTarget === document.body); //truealert(this === document.body); //truealert(event.target === document.getElementById("myBtn")); //true
};

所有问事件的target和currentTarget区别的问题,都是在变相的问事件委托。

因为子元素将事件委托到父级的时候,event的target指向的还是子元素,而currentTarget指的是父元素

<ul><li>w</li><li>m</li><li>x</li>
</ul>
//子元素将事件委托给了父元素
document.querySelector('ul').addEventListener('click',(e) => {let text = e.target.innerText || e.target.textContent;swicth(text){case 'w':{console.info('this first li');break;}case 'm':{console.info('this second li');break;}case 'x':{console.info('this third li');break;}default:{new Error('No such Element')}}
},false)

事件模拟

事件创建

参数事件类型字符串UIEvents

document.createEvent(EventTypeString)

  • UIEvents:一般化的 UI 事件。 鼠标事件和键盘事件都继承自 UI 事件。 DOM3 级中是 UIEvent;
  • MouseEvents:一般化的鼠标事件。 DOM3 级中是 MouseEvent;
  • MutationEvents:一般化的 DOM 变动事件。 DOM3 级中是 MutationEvent;
  • HTMLEvents:一般化的 HTML 事件。没有对应的 DOM3 级事件(HTML 事件被分散到其他类 别中);
  • KeyboardEvents :DOM3级中添加
var btn = document.getElementById("myBtn");
//创建事件对象
var event = document.createEvent("MouseEvents");
//初始化事件对象
event.initMouseEvent("click", true, true, document.defaultView, 0, 0, 0, 0, 0,false, false, false, false, 0, null);
//添加事件监听
btn.addEventListener("click",e => console.log(e))
//触发事件dispatch中动态将this绑定到event.target上,也就是btn
btn.dispatchEvent(event);
//执行监听函数
//e

实现一个EventTarget类相关推荐

  1. 设计一个矩形类rectangle_万字长文带你捋清六种设计模式的设计原则(建议收藏)...

    对于设计模式,自己很早之前就看了好多本设计模式书籍,其中一些还看了好几遍,也一直希望自己能在编码的时候把这些设计模式用上去.可是,在日常的打码中,用的最多的就是单例,其次是观察者和建造者模式 ( bu ...

  2. 写一个ArrayList类的动态代理类

    动态代理可以提供对另一个对象的访问,同时隐藏实际对象的具体事实,代理对象对客户隐藏了实际对象.动态代理可以对请求进行其他的一些处理,在不允许直接访问某些类,或需要对访问做一些特殊处理等,这时候可以考虑 ...

  3. vue2 构建一个旅游类WebApp

    前言 从看了慕课上面黄易老师的饿了么课程后,总感觉学了VUE之后要做点什么,趁着热情兴趣还在,自己也用VUE全家桶写了一个旅游类的APP,为什么选择做旅游类的呢??呵呵,我不会告诉你虽然很多地方都没去 ...

  4. python 多线程 类_Python中如何自定义一个多线程类呢?

    摘要: 下文讲述Python中自定义一个多线程类的方法分享,如下所示: 实现思路: 1.定义一个类继承threading.Thread 2.在自定义类中构造函数重写run方法 例: Python3中自 ...

  5. 《JAVA练习题目9》 创建一个Person类和一个Family类。(这次的OJ实在写的没有状态,被样例搞崩了,这次代码还有好多代码复制等一系列不良现象,就是为了过OJ写的。。大家凑活看一下吧)

    题目内容: 创建一个Person类和一个Family类.其中, Person类包含编号id(整型).名字name(字符串).性别gender(字符串)三个属性,和一个初始化对象所有属性的有参构造方法, ...

  6. 第一个OC类、解析第一个OC程序

    01第一个OC 类 本文目录 • 一.语法简介 • 二.用Xcode创建第一个OC的类 • 三.第一个类的代码解析 • 四.添加成员变量 • 五.添加方法 • 六.跟Java的比较 • 七.创建对象 ...

  7. 一个有趣的算法问题:如何定义一个分数类

    一个来自于C++程序设计的经典问题.如何定义一个分数类,实现分数的约分化简,分数之间的加法.减法.乘法.除法四则运算? 1.初见 刚看到这道题的时候,第一感觉是挺简单的啊,就是基本的面向对象,定义对应 ...

  8. 我的第一个ASP类(显示止一篇下一篇文章)

    面向对象是现今编程语言的潮流,不过,ASP对面向对象的支持可是寒碜地很.现在感觉ASP的类也不过是一堆函数而已. 不过,在学校时没有学过面向对象的语言,我对面向对象的认识仍然是从ASP开始的. 记下我 ...

  9. 发布一个实体类属性生成小工具,给开发加点料

    做了很久的代码生成工具,基本上都是基于表生成实体类属性的,把数据库表的信息拿出来,然后之乎者也后生成一个标准的实体类,包含字段.属性.描述等东西. 是基于整个数据库生成整个框架代码的工具,如我的代码生 ...

最新文章

  1. 收藏 | 深度学习损失函数大全
  2. lucene 多索引目录搜索实现方法
  3. 训练日志 2019.1.10
  4. Bootstrap3 表格的情景类
  5. 如何打破线下流量瓶颈?三四线城市实体门店的生存之道
  6. 小议新版GB9706.1-2020的基本性能
  7. 不是有效的win32程序_Python实用案例编程入门:第十一章 做一个年会抽奖程序
  8. 【Unity3D 灵巧小知识点】 ☀️ | 层级面板中的 ‘小手指‘ 作用: 在Scen中将该物体设置为不可选中状态
  9. iOS_CLLocation定位
  10. 外貌测试软件准确吗,相貌测试(史上最准的颜值测试)
  11. 5月第2周业务风控关注 | 央行:严禁未经授权认可的APP接入征信系统
  12. 什么是前端渲染和后端渲染和SPA页面
  13. Python入门(二十二)- 常见模块2(正则表达式及容器)
  14. 魔兽地图编辑器插件YDWE的使用与基本设置2之空格、复制、粘贴、撤销、重做键
  15. 如何解决Redis缓存雪崩、击穿与穿透
  16. 登陆梦幻显示服务器列表错误,常见问题——17173.com网络游戏:《梦幻西游》专区...
  17. ART世界探险(5) - 计算指令
  18. 旅游网站后台信息管理——简单版(增删改查)
  19. Docker CE 安装
  20. 接口文档包含哪些内容?怎么才能写好接口文档?十年测试老司机来告诉你

热门文章

  1. 猎豹网校数据结构与算法
  2. tcp建立连接的时的几种状态
  3. 常考数据结构和算法:链表中环的入口节点
  4. jvm四:常量的本质含义以及助记符基本认识
  5. 开发人员需知的Web缓存知识(转)
  6. linux screen 配置(下标高亮)
  7. 《R语言初学指南》一2.3 找到R脚本中的错误
  8. PyMySQL 的decode坑
  9. 检测msmq里消息的数量
  10. Nginx+Keepalived+Tomcat之动静分离的web集群