-
Notifications
You must be signed in to change notification settings - Fork 1
/
Emiter.js
108 lines (106 loc) · 3.22 KB
/
Emiter.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
define(function() {
var eventHandlerStorage = {};
var idIndex = 0;
var EMPTY = function() {};
/**
* 事件派发器
* @private
* @constructs Emiter
* @alias BMapCom.Emiter
*/
var Emiter = function() {
this._eid = 'eid' + (++idIndex);
eventHandlerStorage[this._eid] = {};
};
Emiter.prototype = {
/** @lends Emiter.prototype */
/**
* 获取该类型下的所有事件句柄
* @param {String} evt 事件类型
* @return {Object} 事件句柄key->value
*/
getEvents: function(evt) {
if (!this.hasOwnProperty('_eid')) {
this._eid = 'eid' + (++idIndex);
eventHandlerStorage[this._eid] = {};
}
if (evt && !eventHandlerStorage[this._eid][evt]) {
return null;
}
return evt ? eventHandlerStorage[this._eid][evt] : eventHandlerStorage[this._eid];
},
/**
* 监听事件
* @param {String} evt 事件类型
* @param {Function} handler 事件句柄
* @return {Function} 事件句柄
*/
on: function(evt, handler) {
if (!this.hasOwnProperty('_eid')) {
this._eid = 'eid' + (++idIndex);
eventHandlerStorage[this._eid] = {};
}
var handlers = eventHandlerStorage[this._eid];
if (!handlers[evt]) {
handlers[evt] = [];
}
handlers[evt].push(handler);
return handler;
},
once:function(evt, handler) {
var self = this;
var onceHandler = function() {
handler.apply(this, arguments);
return true;
};
return this.on(evt, onceHandler);
},
/**
* 移除监听事件
* @param {String} evt 事件类型
* @param {Function} handler 事件句柄
*/
off: function(evt, handler) {
var es = this.getEvents();
if (!es || !es[evt]) {
return;
}
es = es[evt];
for (var i = 0, n = es.length; i < n; i++) {
if (es[i] === handler) {
es.splice(i, 1);
break;
}
}
},
/**
* 移除监听事件
* @param {String} evt 事件类型
* @param {Function} handler 事件句柄
*/
emit: function(evt, args, context) {
if (this['on_' + evt]) {
this['on_' + evt].apply(this, args);
}
var es = this.getEvents();
if (!es || !es[evt]) {
return;
}
es = es[evt];
for (var i = 0, n = es.length; i < n; i++) {
if (es[i].apply(context || this, args) === true) {
this.off(evt, es[i]);
i--;
n--;
}
}
},
/**
* 销毁事件对象,取消所有事件
*/
destory: function() {
eventHandlerStorage[this._eid] = {};
}
};
return Emiter;
});