Skip to content

Commit 36a3701

Browse files
committed
refactor: remove hilo2d dependencies
1 parent 87c9d2d commit 36a3701

File tree

3 files changed

+773
-141
lines changed

3 files changed

+773
-141
lines changed

package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,6 @@
7373
"amc": "^1.0.6",
7474
"gl-matrix": "^2.4.0",
7575
"glsl-transpose": "^1.0.0",
76-
"hilojs": "^2.0.0",
7776
"object-assign": "^4.1.1",
7877
"object-values": "^2.0.0",
7978
"object.keys": "^0.1.0",

src/core/EventMixin.js

Lines changed: 127 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,138 @@
1-
import EventMixin from 'hilojs/event/EventMixin';
1+
import Class from './Class';
22

33
/**
4-
* EventMixin是一个包含事件相关功能的mixin。可以通过 Object.assign(target, EventMixin) 来为target增加事件功能。
5-
* @class EventMixin
6-
* @see {@link https://hiloteam.github.io/Hilo/docs/api-zh/symbols/EventMixin.html}
4+
* 事件对象
5+
* @interface EventObject
6+
* @property {String} type 事件类型
7+
* @property {any} [detail=null] 事件数据
78
*/
8-
export default EventMixin;
9+
const EventObject = Class.create({
10+
constructor(type, target, detail) {
11+
this.type = type;
12+
this.target = target;
13+
this.detail = detail;
14+
this.timeStamp = +new Date();
15+
},
16+
17+
type: null,
18+
target: null,
19+
detail: null,
20+
timeStamp: 0,
21+
22+
stopImmediatePropagation() {
23+
this._stopped = true;
24+
}
25+
});
926

1027
/**
11-
* 增加一个事件监听。
12-
* @name EventMixin#on
13-
* @function
14-
* @param {String} type 要监听的事件类型。
15-
* @param {EventMixinCallback} listener 事件监听回调函数。
16-
* @param {Boolean} [once] 是否是一次性监听,即回调函数响应一次后即删除,不再响应。
17-
* @returns {any} 对象本身。链式调用支持。
28+
* EventMixin是一个包含事件相关功能的mixin。可以通过 Object.assign(target, EventMixin) 来为target增加事件功能。
29+
* @class EventMixin
1830
*/
31+
const EventMixin = /** @lends EventMixin# */ {
32+
_listeners: null,
1933

34+
/**
35+
* 增加一个事件监听。
36+
* @name EventMixin#on
37+
* @function
38+
* @param {String} type 要监听的事件类型。
39+
* @param {EventMixinCallback} listener 事件监听回调函数。
40+
* @param {Boolean} [once] 是否是一次性监听,即回调函数响应一次后即删除,不再响应。
41+
* @return {any} 对象本身。链式调用支持。
42+
*/
43+
on(type, listener, once) {
44+
let listeners = (this._listeners = this._listeners || {});
45+
let eventListeners = (listeners[type] = listeners[type] || []);
46+
for (let i = 0, len = eventListeners.length; i < len; i++) {
47+
let el = eventListeners[i];
48+
if (el.listener === listener) {
49+
return this;
50+
}
51+
}
52+
eventListeners.push({
53+
listener,
54+
once
55+
});
56+
return this;
57+
},
2058

21-
/**
22-
* 删除一个事件监听。如果不传入任何参数,则删除所有的事件监听;如果不传入第二个参数,则删除指定类型的所有事件监听。
23-
* @name EventMixin#off
24-
* @function
25-
* @param {String} [type] 要删除监听的事件类型。
26-
* @param {EventMixinCallback} [listener] 要删除监听的回调函数。
27-
* @returns {any} 对象本身。链式调用支持。
28-
*/
59+
/**
60+
* 删除一个事件监听。如果不传入任何参数,则删除所有的事件监听;如果不传入第二个参数,则删除指定类型的所有事件监听。
61+
* @name EventMixin#off
62+
* @function
63+
* @param {String} [type] 要删除监听的事件类型。
64+
* @param {EventMixinCallback} [listener] 要删除监听的回调函数。
65+
* @returns {any} 对象本身。链式调用支持。
66+
*/
67+
off(type, listener) {
68+
// remove all event listeners
69+
if (arguments.length === 0) {
70+
this._listeners = null;
71+
return this;
72+
}
2973

30-
/**
31-
* 发送事件。当第一个参数类型为Object时,则把它作为一个整体事件对象。
32-
* @name EventMixin#fire
33-
* @function
34-
* @param {String|EventObject} [type] 要发送的事件类型或者一个事件对象。
35-
* @param {Object} [detail] 要发送的事件的具体信息,即事件随带参数。
36-
* @returns {Boolean} 是否成功调度事件。
37-
*/
74+
let eventListeners = this._listeners && this._listeners[type];
75+
if (eventListeners && eventListeners.length > 0) {
76+
// remove event listeners by specified type
77+
if (arguments.length === 1) {
78+
delete this._listeners[type];
79+
return this;
80+
}
3881

39-
/**
40-
* 事件对象
41-
* @interface EventObject
42-
* @property {String} type 事件类型
43-
* @property {any} [detail=null] 事件数据
44-
*/
82+
for (let i = 0, len = eventListeners.length; i < len; i++) {
83+
let el = eventListeners[i];
84+
if (el.listener === listener) {
85+
eventListeners.splice(i, 1);
86+
break;
87+
}
88+
}
89+
}
90+
return this;
91+
},
92+
93+
/**
94+
* 发送事件。当第一个参数类型为Object时,则把它作为一个整体事件对象。
95+
* @name EventMixin#fire
96+
* @function
97+
* @param {String|EventObject} [type] 要发送的事件类型或者一个事件对象。
98+
* @param {Object} [detail] 要发送的事件的具体信息,即事件随带参数。
99+
* @returns {Boolean} 是否成功调度事件。
100+
*/
101+
fire(type, detail) {
102+
let event; let
103+
eventType;
104+
if (typeof type === 'string') {
105+
eventType = type;
106+
} else {
107+
event = type;
108+
eventType = type.type;
109+
}
110+
111+
let listeners = this._listeners;
112+
if (!listeners) return false;
113+
114+
let eventListeners = listeners[eventType];
115+
if (eventListeners && eventListeners.length > 0) {
116+
let eventListenersCopy = eventListeners.slice(0);
117+
event = event || new EventObject(eventType, this, detail);
118+
if (event._stopped) return false;
119+
120+
for (let i = 0; i < eventListenersCopy.length; i++) {
121+
let el = eventListenersCopy[i];
122+
el.listener.call(this, event);
123+
if (el.once) {
124+
let index = eventListeners.indexOf(el);
125+
if (index > -1) {
126+
eventListeners.splice(index, 1);
127+
}
128+
}
129+
}
130+
131+
return true;
132+
}
133+
return false;
134+
}
135+
};
45136

46137
/**
47138
* @callback EventMixinCallback
@@ -51,3 +142,5 @@ export default EventMixin;
51142
* @param {Object} e.target 事件触发对象
52143
* @param {Date} e.timeStamp 时间戳
53144
*/
145+
146+
export default EventMixin;

0 commit comments

Comments
 (0)