实现一个自定义event事件,包括on ,off,trigger,once
on监听事件,off取消事件 ,trigger触发事件,once只执行一次
class Event {
constructor() {
this.handlers = {};//记录所有的事件以及处理函数
/*
{
click:[fn1,fn2],
mouseover: [fn3,fn4]
}
*/
}
/**
* on 添加事件监听
* @param {事件类型} type
* @param {事件处理函数} handler
*/
on(type, handler, once = false) {
if (!this.handlers[type]) {
this.handlers[type] = [];
}
if (!this.handlers[type].includes(handler)) {
this.handlers[type].push(handler);
handler.once = once;
}
}
/**
* off 取消事件监听
* @param {要取消的事件类型} type
* @param {要取消的事件函数,如果不传则清除所有} handler
*/
off(type, handler) {
if (this.handlers[type]) {
if (handler === undefined) {
this.handlers[type] = [];
} else {
this.handlers[type] = this.handlers[type].filter(f => f != handler);
}
}
}
/**
* trigger 执行函数
* @param {要执行哪个类型的函数} type
* @param {事件对象} eventData
* @param {this执行} point
*/
trigger(type, eventData = {}, point = this) {
if (this.handlers[type]) {
this.handlers[type].forEach(f => {
f.call(point, eventData);
if (f.once) {
this.off(type, f);
}
});
}
}
/**
* once 只执行一次
* @param {事件类型} type
* @param {要执行的函数} handler
*/
once(type, handler) {
this.on(type, handler, true);
}
}
测试脚本
let e = new Event;
e.on("click", () => {
console.log(1); })
e.on("click", () => {
console.log(2); })
function fn3() {
console.log(3); }
e.on("click", fn3);
console.log(e);
或者可以使用上一章节的内容进行测试https://www.cnblogs.com/yinping/p/10697083.html
在function函数添加监听函数
(function () {
let box = document.querySelector("#box");
let dragbox = new Drag(box);
dragbox.on("dragstart", function (e) { //这里不可以使用箭头函数,否则trigger的call方法无效
console.log(e, this);
console.log("开始拖拽");
this.style.background = "yellow";
})
dragbox.on("dragend", function (e) {
console.log(e, this);
this.style.background = "red";
})
dragbox.once("drag", function () {
console.log("drag");
})
})()
同时在move,start中添加触发函数
class Drag extends Event {
//构造函数
constructor(el) {
super();
this.el = el;
//鼠标摁下时的元素位置
this.startOffset = {};
//鼠标摁下时的鼠标位置
this.startPoint = {};
let move = (e) => {
this.move(e);
};
let end = (e) => {
document.removeEventListener("mousemove", move);
document.removeEventListener("mouseup", end);
this.trigger("dragend", e, this.el);
};
el.addEventListener("mousedown", (e) => {
this.start(e);
document.addEventListener("mousemove", move);
document.addEventListener("mouseup", end);
})
}
//摁下时的处理函数
start(e) {
let { el } = this;
this.startOffset = {
x: el.offsetLeft,
y: el.offsetTop
}
this.startPoint = {
x: e.clientX,
y: e.clientY
}
this.trigger("dragstart", e, el);
}
//鼠标移动时的处理函数
move(e) {
let { el, startOffset, startPoint } = this;
let newPoint = {
x: e.clientX,
y: e.clientY
}
let dis = {
x: newPoint.x - startPoint.x,
y: newPoint.y - startPoint.y,
}
el.style.left = dis.x + startOffset.x + "px";
el.style.top = dis.y + startOffset.y + "px";
this.trigger('drag', e, el);
}
}
实现一个自定义event事件,包括on ,off,trigger,once的更多相关文章
- CAD由一个自定义实体事件中的id得到自定义实体对象(com接口VB语言)
由一个自定义实体事件中的id得到自定义实体对象.该函数只能在自定义实体事件中调用. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 2 ...
- spring中自定义Event事件的使用和浅析
在我目前接触的项目中,用到了许多spring相关的技术,框架层面的spring.spring mvc就不说了,细节上的功能也用了不少,如schedule定时任务.Filter过滤器. intercep ...
- Spring学习六:自定义Event事件
Spring 中的自定义事件 编写和发布自己的自定义事件有许多步骤.按照在这一章给出的说明来编写,发布和处理自定义 Spring 事件. 步骤 描述 1 创建一个名称为 SpringExample 的 ...
- WPF路由事件三:自定义路由事件
与依赖项属性类似,WPF也为路由事件提供了WPF事件系统这一组成.为一个类型添加一个路由事件的方式与为类型添加依赖项属性的方法类似,添加一个自定义路由事件的步骤: 一.声明路由事件变量并注册:定义只读 ...
- JQuery常用API 核心 效果 JQueryHTML 遍历 Event事件
JQuery 常用API 参考资料:JQuery 官网 jQuery API 中文文档 核心 jQuery 对象 jQuery() 返回匹配的元素集合,无论是通过在DOM的基础上传递的参数还是创建 ...
- [.NET] C# 知识回顾 - Event 事件
C# 知识回顾 - Event 事件 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6060297.html 序 昨天,通过<C# 知识回顾 - ...
- Event事件
妙味课堂-Event事件 1.焦点:当一个元素有焦点的时候,那么他就可以接受用户的输入(不是所有元素都能接受焦点) 给元素设置焦点的方式: 1.点击 2.tab 3.js 2.(例子:输入框提示文字) ...
- JS学习笔记9之event事件及其他事件
-->鼠标事件-->event事件对象-->默认事件-->键盘事件(keyCode)-->拖拽效果 一.鼠标事件 onclick ---------------鼠标点击事 ...
- WPF:自定义路由事件的实现
路由事件通过EventManager,RegisterRoutedEvent方法注册,通过AddHandler和RemoveHandler来关联和解除关联的事件处理函数:通过RaiseEvent方法来 ...
随机推荐
- C# SqlConnection连接sql server
try { SqlConnection conn = new SqlConnection(); conn.ConnectionString = "Data Source=127.0.0.1; ...
- iOS如何解析crash文件中的地址
1.目录中存放app文件 2.打开文件 3.执行命令otool -arch arm64 -l ./QQStock | grep -B 1 -A 10 "LC_SEGM" | gr ...
- eclipse maven构建的java web工程项目 在修改了工程项目名时,tomcat启动异常java.lang.IllegalArgumentException: Can't convert argument:null
问题 我修改了前一个项目的名称.重新启动该项目至tomcat,报错:Java.lang.IllegalArgumentException: Can't convert argument: null 因 ...
- mysql宕机,导致innodb_force_recovery恢复不了
https://serverfault.com/questions/698038/mysql-innodb-recovery-from-datafiles https://serverfault.co ...
- (转)如何安装 easy installer+pip
http://blog.csdn.net/wuxiaobingandbob/article/details/42457807
- Spring+微信小程序 卡券打通
近期公司项目需要使用到微信卡券模块,主要做的是在小程序打通微信卡券,实现小程序领取卡券的功能效果. 简单说下涉及的东西: Springboot—使用springboot做后端接口,非常便捷 并且根本是 ...
- 三星平板SM-T320刷机
三星 Galaxy Tab Pro 8.4 (SM-T320) / 国行 固件下载 刷机教程 下载手机驱动,刷机工具Odin,相应的固件包,手机和电脑用数据线连接安装好手机的驱动. 手机先完全的关机, ...
- RabbitMQ学习以及与Spring的集成(三)
本文介绍RabbitMQ与Spring的简单集成以及消息的发送和接收. 在RabbitMQ的Spring配置文件中,首先需要增加命名空间. xmlns:rabbit="http://www. ...
- 《Python核心编程》笔记
1 python是大小写敏感的 2 遍历一个字典的键值: for a in dict_obj.keys(): print a 3 列表解析功能可以让代码很简洁,比如:squared = [x ** 2 ...
- ascii2native 转码 解码
//把十六进制的编码转为原码function asciiHex2native(strAscii) { var output = ""; var posFrom = 0; var p ...