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