1+ 全局的发布—订阅对象里只有一个 clinetList 来存放消息名和回调函数
2+ 难免会出现事件名冲突的情况,所以还可以给 Event 对象提供创建命名空间的功能
3+ < script >
4+ var Event = ( function ( ) {
5+ var global = this ,
6+ Event ,
7+ _default = 'default' ;
8+ Event = function ( ) {
9+ var _listen ,
10+ _trigger ,
11+ _remove ,
12+ _slice = Array . prototype . slice ,
13+ _shift = Array . prototype . shift ,
14+ _unshift = Array . prototype . unshift ,
15+ namespaceCache = { } ,
16+ _create ,
17+ find ,
18+ each = function ( ary , fn ) {
19+ var ret ;
20+ for ( var i = 0 , l = ary . length ; i < l ; i ++ ) {
21+ var n = ary [ i ] ;
22+ ret = fn . call ( n , i , n ) ;
23+ }
24+ return ret ;
25+ } ;
26+ _listen = function ( key , fn , cache ) {
27+ if ( ! cache [ key ] ) {
28+ cache [ key ] = [ ] ;
29+ }
30+ cache [ key ] . push ( fn ) ;
31+ } ;
32+ _remove = function ( key , cache , fn ) {
33+ if ( cache [ key ] ) {
34+ if ( fn ) {
35+ for ( var i = cache [ key ] . length ; i >= 0 ; i -- ) {
36+ if ( cache [ key ] === fn ) {
37+ cache [ key ] . splice ( i , 1 ) ;
38+ }
39+ }
40+ } else {
41+ cache [ key ] = [ ] ;
42+ }
43+ }
44+ } ;
45+ _trigger = function ( ) {
46+ var cache = _shift . call ( arguments ) ,
47+ key = _shift . call ( arguments ) ,
48+ args = arguments ,
49+ _self = this ,
50+ ret ,
51+ stack = cache [ key ] ;
52+ if ( ! stack || ! stack . length ) {
53+ return ;
54+ }
55+ return each ( stack , function ( ) {
56+ return this . apply ( _self , args ) ;
57+ } ) ;
58+ } ;
59+ _create = function ( namespace ) {
60+ var namespace = namespace || _default ;
61+ var cache = { } ,
62+ offlineStack = [ ] , // 离线事件
63+ ret = {
64+ listen : function ( key , fn , last ) {
65+ _listen ( key , fn , cache ) ;
66+ if ( offlineStack === null ) {
67+ return ;
68+ }
69+ if ( last === 'last' ) {
70+ } else {
71+ each ( offlineStack , function ( ) {
72+ this ( ) ;
73+ } ) ;
74+ }
75+ offlineStack = null ;
76+ } ,
77+ one : function ( key , fn , last ) {
78+ _remove ( key , cache ) ;
79+ this . listen ( key , fn , last ) ;
80+ } ,
81+ remove : function ( key , fn ) {
82+ _remove ( key , cache , fn ) ;
83+ } ,
84+ trigger : function ( ) {
85+ var fn ,
86+ args ,
87+ _self = this ;
88+ _unshift . call ( arguments , cache ) ;
89+ args = arguments ;
90+ fn = function ( ) {
91+ return _trigger . apply ( _self , args ) ;
92+ } ;
93+ if ( offlineStack ) {
94+ return offlineStack . push ( fn ) ;
95+ }
96+ return fn ( ) ;
97+ }
98+ } ;
99+ return namespace ?
100+ ( namespaceCache [ namespace ] ? namespaceCache [ namespace ] :
101+ namespaceCache [ namespace ] = ret )
102+ : ret ;
103+ } ;
104+ return {
105+ create : _create ,
106+ one : function ( key , fn , last ) {
107+ var event = this . create ( ) ;
108+ event . one ( key , fn , last ) ;
109+ } ,
110+ remove : function ( key , fn ) {
111+ var event = this . create ( ) ;
112+ event . remove ( key , fn ) ;
113+ } ,
114+ listen : function ( key , fn , last ) {
115+ var event = this . create ( ) ;
116+ event . listen ( key , fn , last ) ;
117+ } ,
118+ trigger : function ( ) {
119+ var event = this . create ( ) ;
120+ event . trigger . apply ( this , arguments ) ;
121+ }
122+ } ;
123+ } ( ) ;
124+ return Event ;
125+ } ) ( ) ;
126+ </ script >
0 commit comments