-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathaaObserver.js
More file actions
89 lines (80 loc) · 2.2 KB
/
aaObserver.js
File metadata and controls
89 lines (80 loc) · 2.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
/****************************************************************
* 简单的自定义事件,观察者模式
* @by Aaron
* github:https://github.com/JsAaron/aaObserver
* blog:http://www.cnblogs.com/aaronjs/
*****************************************************************/
;(function(O) {
if (typeof module === "object" && typeof require === "function") {
module.exports.aaObserver = O;
} else {
this.aaObserver = O;
}
})(function() {
var slice = Array.prototype.slice,
nativeForEach = Array.prototype.forEach;
function each(obj, callback, context) {
if (obj == null) return;
//如果支持本地forEach方法,并且是函数
if (nativeForEach && obj.forEach === nativeForEach) {
obj.forEach(callback, context);
} else if (obj.length === +obj.length) {
//for循环迭代
for (var i = 0, l = obj.length; i < l; i++) {
callback.call(context, obj[i], i, obj);
}
}
};
function bind(event, fn) {
var events = this.events = this.events || {},
parts = event.split(/\s+/),
i = 0,
num = parts.length,
part;
if (events[event] && events[event].length) return this;
each(parts, function(part, index) {
events[part] = events[part] || [];
events[part].push(fn);
})
return this;
}
function one(event, fn) {
this.bind(event, function fnc() {
fn.apply(this, slice.call(arguments));
this.unbind(event, fnc);
});
return this;
}
function unbind(event, fn) {
var events = this.events,
eventName, i, parts, num;
if (!events) return;
parts = event.split(/\s+/);
each(parts, function(eventName, index) {
if (eventName in events !== false) {
events[eventName].splice(events[eventName].indexOf(fn), 1);
if (!events[eventName].length) { //修正没有事件直接删除空数组
delete events[eventName];
}
}
})
return this;
}
function trigger(event) {
var events = this.events,
i, args, falg;
if (!events || event in events === false) return;
args = slice.call(arguments, 1);
for (i = events[event].length - 1; i >= 0; i--) {
falg = events[event][i].apply(this, args);
}
return falg; //修正带返回
}
return function() {
this.subscribe = bind;
this.remove = unbind;
this.publish = trigger;
this.one = one;
return this;
};
}());