You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
63 lines
1.7 KiB
63 lines
1.7 KiB
/*
|
|
@ author: leeenx
|
|
@ 事件封装
|
|
@ object.on(event, fn) // 监听一个事件
|
|
@ object.off(event, fn) // 取消监听
|
|
@ object.once(event, fn) // 只监听一次事件
|
|
@ object.dispacth(event, arg) // 触发一个事件
|
|
*/
|
|
|
|
export default class Events {
|
|
constructor() {
|
|
// 定义的事件与回调
|
|
this.defineEvent = {};
|
|
}
|
|
// 注册事件
|
|
register(event, cb) {
|
|
if(!this.defineEvent[event]) {
|
|
(this.defineEvent[event] = [cb]);
|
|
}
|
|
else {
|
|
this.defineEvent[event].push(cb);
|
|
}
|
|
}
|
|
// 派遣事件
|
|
dispatch(event, arg) {
|
|
if(this.defineEvent[event]) {{
|
|
for(let i=0, len = this.defineEvent[event].length; i<len; ++i) {
|
|
this.defineEvent[event][i] && this.defineEvent[event][i](arg);
|
|
}
|
|
}}
|
|
}
|
|
// on 监听
|
|
on(event, cb) {
|
|
return this.register(event, cb);
|
|
}
|
|
// off 方法
|
|
off(event, cb) {
|
|
if(this.defineEvent[event]) {
|
|
if(typeof(cb) == "undefined") {
|
|
delete this.defineEvent[event]; // 表示全部删除
|
|
} else {
|
|
// 遍历查找
|
|
for(let i=0, len=this.defineEvent[event].length; i<len; ++i) {
|
|
if(cb == this.defineEvent[event][i]) {
|
|
this.defineEvent[event][i] = null; // 标记为空 - 防止dispath 长度变化
|
|
// 延时删除对应事件
|
|
setTimeout(() => this.defineEvent[event].splice(i, 1), 0);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// once 方法,监听一次
|
|
once(event, cb) {
|
|
let onceCb = () => {
|
|
cb && cb();
|
|
this.off(event, onceCb);
|
|
}
|
|
this.register(event, onceCb);
|
|
}
|
|
}
|