dom 的事件模式就是观察者模式
/*
* 观察者模式又叫发布者-订阅者模式
* 我发布一则消息,消息就在那里;你若订阅,我便发送。
*/
/*
* js和dom之间的实现就是一种观察者模式;
* 所有的dom元素都发布了事件,然后观察谁订阅了这个事件;
* 例:div订阅了click事件
*/
document.getElementById("banner").onclick = function () {
alert("div is clicked!");
};
原生实现
/*
* js 观察者模式 又称 订阅/发布模式
* 通过创建“可观察”对象,当发生一个感兴趣的事件时可将该事件通告给
* 所有观察者,从而形成松耦合
*/
var pubsub = (function () {
var q = {},
topics = {},
subUid = -1;
// 发布方法
q.publish = function (topic, args) {
if (!topics[topic]) {
return false;
}
var subscribers = topics[topic],
len = subscribers ? subscribers.length : 0;
while (len--) {
subscribers[len].func(topic, args);
}
return true;
};
// 订阅方法
q.subscribe = function (topic, func) {
if (!topics[topic]) {
topics[topic] = [];
}
var token = (++subUid).toString();
topics[topic].push({
token: token,
func: func
});
return token;
};
//退订方法
q.unsubscribe = function (token) {
for (var m in topics) {
if (topics[m]) {
for (var i = 0, j = topics[m].length; i < j; i++) {
if (topics[m][i].token === token) {
topics[m].splice(i, 1);
return token;
}
}
}
}
return false;
};
return q;
})();
pubsub.subscribe("broadcast", function (topic, data) {
console.log(topic + " : " + data); // broadcast : hello world
});
pubsub.publish("broadcast", "hello world");
jQuery版本
// jquery 版本
(function ($) {
var o = $({});
// 订阅既是事件绑定(观察者)
$.subscribe = function () {
o.on.apply(o, arguments); // on
};
$.unsubscribe = function () {
o.off.apply(o, arguments);
};
// 发布既是事件触发
$.publish = function () {
o.trigger.apply(o, arguments); // trigger
};
} (jQuery));
$.subscribe("j-bro", function (e, data) {
console.log(data); // jquery broadcast
});
$.publish("j-bro", "jquery broadcast");
$.publish("j-bro", "jquery broadcast again");