UNPKG

3.67 kBJavaScriptView Raw
1// PubSub 订阅发布
2var PubSub = function () {
3 var _listen;
4 var _trigger;
5 var _remove;
6 var _default = 'default';
7 var namespaceCache = {};
8 var _create;
9 var each = function each(arr, fn) {
10 var ret;
11 for (var i = 0; i < arr.length; i++) {
12 var n = arr[i];
13 ret = fn.call(n, i, n);
14 }
15 return ret;
16 };
17
18 _listen = function _listen(key, fn, cache) {
19 if (!cache[key]) {
20 cache[key] = [];
21 }
22 cache[key].push(fn);
23 };
24 _remove = function _remove(key, cache, fn) {
25 if (!cache[key]) {
26 return;
27 }
28 if (fn) {
29 for (var i = cache[key].length; i >= 0; i--) {
30 if (cache[key] === fn) {
31 cache[key].splice(i, 1);
32 } else {
33 cache[key] = [];
34 }
35 }
36 } else {
37 cache[key] = [];
38 }
39 };
40 _trigger = function _trigger() {
41 var cache = [].shift.call(arguments);
42 var key = [].shift.call(arguments);
43 var args = arguments;
44 var stack = cache[key];
45 if (!stack || !stack.length) {
46 return;
47 }
48 return each(stack, function () {
49 return this.apply(this, args);
50 });
51 };
52 _create = function _create(ns) {
53 var namespace = ns || _default;
54 var cache = {};
55 var offlineStack = []; // 离线事件
56 var ret = {
57 listen: function listen(key, fn, last) {
58 _listen(key, fn, cache);
59 if (offlineStack === null) {
60 return;
61 }
62 if (last === 'last') {
63 offlineStack.length && offlineStack.pop()();
64 } else {
65 each(offlineStack, function () {
66 this();
67 });
68 }
69 offlineStack = null;
70 },
71 one: function one(key, fn, last) {
72 _remove(key, cache);
73 this.listen(key, fn, last);
74 },
75 remove: function remove(key, fn) {
76 _remove(key, cache, fn);
77 },
78 trigger: function trigger() {
79 var _self = this;
80 [].unshift.call(arguments, cache);
81 var args = arguments;
82 var fn = function fn() {
83 return _trigger.apply(_self, args);
84 };
85 if (offlineStack) {
86 return offlineStack.push(fn);
87 }
88 return fn();
89 }
90 };
91 if (Object.prototype.toString.call(namespace).indexOf('object HTML') === 1 && namespace.getAttribute('id')) {
92 namespace = namespace.getAttribute('id');
93 }
94 var result = namespace ? namespaceCache[namespace] ? namespaceCache[namespace] : namespaceCache[namespace] = ret : ret;
95 return result;
96 };
97 return {
98 create: _create,
99 one: function one(key, fn, last) {
100 var event = this.create();
101 event.one(key, fn, last);
102 },
103 remove: function remove(key, fn) {
104 var event = this.create();
105 event.remove(key, fn);
106 },
107 listen: function listen(key, fn, last) {
108 var event = this.create();
109 event.listen(key, fn, last);
110 },
111 trigger: function trigger() {
112 var event = this.create();
113 event.trigger.apply(this, arguments);
114 }
115 };
116}();
117
118export default PubSub;
119/* *******************订阅发布******************* */
120/*
121<a class="button lg" id="ID-BtnLogin">登录</a>
122// 按钮
123var btnLogin=document.getElementById('ID-BtnLogin');
124// 订阅
125PubSub.create('nsLogin').listen('login',userHandler);
126PubSub.create('nsLogin').listen('login',shopHandler);
127PubSub.create('nsLogin').listen('login',orderHandler);
128// 句柄
129function userHandler(e){
130 console.log('初始化用户信息')
131}
132function shopHandler(e){
133 console.log('初始化购物车')
134}
135function orderHandler(e){
136 console.log('初始化单据')
137}
138// 发布
139btnLogin.addEventListener('click',function(e){
140 PubSub.create('nsLogin').trigger('login',e);
141},false);
142*/
\No newline at end of file