Skip to content

Commit eba234e

Browse files
观察者模式
1 parent 1aabbb0 commit eba234e

3 files changed

Lines changed: 185 additions & 414 deletions

File tree

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
观察者模式,封装发布订阅模式 - 全局对象方案
2+
<script type="text/javascript">
3+
var Event = (function(){
4+
var clientList = {},
5+
listen,
6+
trigger,
7+
remove;
8+
listen = function( key, fn ){
9+
if ( !clientList[ key ] ){
10+
clientList[ key ] = [];
11+
}
12+
clientList[ key ].push( fn );
13+
};
14+
trigger = function(){
15+
var key = Array.prototype.shift.call( arguments ),
16+
fns = clientList[ key ];
17+
if ( !fns || fns.length === 0 ){
18+
return false;
19+
}
20+
for( var i = 0, fn; fn = fns[ i++ ]; ){
21+
fn.apply( this, arguments );
22+
}
23+
};
24+
remove = function( key, fn ){
25+
var fns = clientList[ key ];
26+
if ( !fns ){
27+
return false;
28+
}
29+
if ( !fn ){
30+
fns && ( fns.length = 0 );
31+
}else{
32+
for ( var l = fns.length - 1; l >=0; l-- ){
33+
var _fn = fns[ l ];
34+
if ( _fn === fn ){
35+
fns.splice( l, 1 );
36+
}
37+
}
38+
}
39+
};
40+
return {
41+
listen: listen,
42+
trigger: trigger,
43+
remove: remove
44+
}
45+
})();
46+
47+
Event.listen( 'squareMeter88', function( price ){
48+
console.log( '1. 价格 = ' + price ); // 输出:'1. 价格=2000000'
49+
});
50+
Event.listen( 'squareMeter88', function( price ){
51+
console.log( '2. 价格 = ' + price ); // 输出:'2. 价格=2000000'
52+
});
53+
Event.listen( 'squareMeter110', function( price ){
54+
console.log( '价格 = ' + price );
55+
});
56+
57+
Event.trigger( 'squareMeter88', 2000000 ); // 售楼处发布消息
58+
59+
</script>
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
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

Comments
 (0)