// 全局的event对象,提供on、off、emit方法
var event = (function () {
let eventObjs = {};
return {
// 注册事件,可以连续注册,也可以注册多个事件
on: function (type, handler) {
(eventObjs[type] || (eventObjs[type] = [])).push(handler)
},
/**
* 移除事件
* 如果没有参数,移除所有事件
* 如果只带有【事件名】参数,就移除这个事件名下的所有事件
* 如果带有两个参数,那么就是表示移除某一个事件的具体处理函数
*/
off: function (type, handler) {
if (arguments.length === 0) {
// 没有参数移除所有事件
eventObjs = {};
} else if (arguments.length === 1) {
// 只有事件类型,移除该事件所有的处理函数
eventObjs[type] = [];
} else if (arguments.length === 2) {
// 使用循环移除所有对应【type】的事件
let _events = eventObjs[type];
if (!_events) return;
for (let i = _events.length - 1; i >= 0; i--) {
if (_events[i] === handler) _events.splice(i, 1);
}
}
},
/**
* 发射事件,触发事件,包装【参数】传递给事件处理函数
* @param type
*/
emit: function (type) {
let _events = eventObjs[type];
if(!_events)return;
let args = Array.prototype.slice.call(arguments,1);
for(let i = 0;i<_events.length;i++){
// 如果绑定上下文就需要使用call或apply
_events[i].apply(null,args)
}
}
}
})()
事件模型发布订阅模式
最新推荐文章于 2024-04-22 10:37:38 发布