实现一个EventTarget类
EventTarget
EventTarget
是一个由可以接收事件的对象实现的接口,并且可以为它们创建侦听器。
Element
,document
和 window
是最常见的事件目标,但是其他对象也可以是事件目标,比如XMLHttpRequest
,AudioNode
,AudioContext
等等。
许多事件目标(包括元素,文档和 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类相关推荐
- 设计一个矩形类rectangle_万字长文带你捋清六种设计模式的设计原则(建议收藏)...
对于设计模式,自己很早之前就看了好多本设计模式书籍,其中一些还看了好几遍,也一直希望自己能在编码的时候把这些设计模式用上去.可是,在日常的打码中,用的最多的就是单例,其次是观察者和建造者模式 ( bu ...
- 写一个ArrayList类的动态代理类
动态代理可以提供对另一个对象的访问,同时隐藏实际对象的具体事实,代理对象对客户隐藏了实际对象.动态代理可以对请求进行其他的一些处理,在不允许直接访问某些类,或需要对访问做一些特殊处理等,这时候可以考虑 ...
- vue2 构建一个旅游类WebApp
前言 从看了慕课上面黄易老师的饿了么课程后,总感觉学了VUE之后要做点什么,趁着热情兴趣还在,自己也用VUE全家桶写了一个旅游类的APP,为什么选择做旅游类的呢??呵呵,我不会告诉你虽然很多地方都没去 ...
- python 多线程 类_Python中如何自定义一个多线程类呢?
摘要: 下文讲述Python中自定义一个多线程类的方法分享,如下所示: 实现思路: 1.定义一个类继承threading.Thread 2.在自定义类中构造函数重写run方法 例: Python3中自 ...
- 《JAVA练习题目9》 创建一个Person类和一个Family类。(这次的OJ实在写的没有状态,被样例搞崩了,这次代码还有好多代码复制等一系列不良现象,就是为了过OJ写的。。大家凑活看一下吧)
题目内容: 创建一个Person类和一个Family类.其中, Person类包含编号id(整型).名字name(字符串).性别gender(字符串)三个属性,和一个初始化对象所有属性的有参构造方法, ...
- 第一个OC类、解析第一个OC程序
01第一个OC 类 本文目录 • 一.语法简介 • 二.用Xcode创建第一个OC的类 • 三.第一个类的代码解析 • 四.添加成员变量 • 五.添加方法 • 六.跟Java的比较 • 七.创建对象 ...
- 一个有趣的算法问题:如何定义一个分数类
一个来自于C++程序设计的经典问题.如何定义一个分数类,实现分数的约分化简,分数之间的加法.减法.乘法.除法四则运算? 1.初见 刚看到这道题的时候,第一感觉是挺简单的啊,就是基本的面向对象,定义对应 ...
- 我的第一个ASP类(显示止一篇下一篇文章)
面向对象是现今编程语言的潮流,不过,ASP对面向对象的支持可是寒碜地很.现在感觉ASP的类也不过是一堆函数而已. 不过,在学校时没有学过面向对象的语言,我对面向对象的认识仍然是从ASP开始的. 记下我 ...
- 发布一个实体类属性生成小工具,给开发加点料
做了很久的代码生成工具,基本上都是基于表生成实体类属性的,把数据库表的信息拿出来,然后之乎者也后生成一个标准的实体类,包含字段.属性.描述等东西. 是基于整个数据库生成整个框架代码的工具,如我的代码生 ...
最新文章
- 收藏 | 深度学习损失函数大全
- lucene 多索引目录搜索实现方法
- 训练日志 2019.1.10
- Bootstrap3 表格的情景类
- 如何打破线下流量瓶颈?三四线城市实体门店的生存之道
- 小议新版GB9706.1-2020的基本性能
- 不是有效的win32程序_Python实用案例编程入门:第十一章 做一个年会抽奖程序
- 【Unity3D 灵巧小知识点】 ☀️ | 层级面板中的 ‘小手指‘ 作用: 在Scen中将该物体设置为不可选中状态
- iOS_CLLocation定位
- 外貌测试软件准确吗,相貌测试(史上最准的颜值测试)
- 5月第2周业务风控关注 | 央行:严禁未经授权认可的APP接入征信系统
- 什么是前端渲染和后端渲染和SPA页面
- Python入门(二十二)- 常见模块2(正则表达式及容器)
- 魔兽地图编辑器插件YDWE的使用与基本设置2之空格、复制、粘贴、撤销、重做键
- 如何解决Redis缓存雪崩、击穿与穿透
- 登陆梦幻显示服务器列表错误,常见问题——17173.com网络游戏:《梦幻西游》专区...
- ART世界探险(5) - 计算指令
- 旅游网站后台信息管理——简单版(增删改查)
- Docker CE 安装
- 接口文档包含哪些内容?怎么才能写好接口文档?十年测试老司机来告诉你