<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<input id="pub1" type="button" value="第一报社" /><input id="text1" type="text" value="" /><br />
<input id="pub2" type="button" value="第二报社" /><input id="text2" type="text" value="" /><br />
<input id="pub3" type="button" value="第三报社" /><input id="text3" type="text" value="" /><br />
<textarea id="sub1" rows="5" cols="30"></textarea>
<textarea id="sub2" rows="5" cols="30"></textarea>
</body>
<script>
var Publish = function(name) {
this.name = name;
this.subscribers = [];
}
Publish.prototype.deliver = function(news) {
var publish = this;
this.subscribers.forEach(function(fn) {
fn(news, publish);
});
return this;
}
Function.prototype.subscriber = function(publish) {
var sub = this;
var alreadyExists = publish.subscribers.some(function(item) {
return sub === item;
});
if(!alreadyExists) {
publish.subscribers.push(sub);
}
return this;
}
Function.prototype.unsubscriber = function(publish) {
var sub = this;
publish.subscribers = publish.subscribers.filter(function(item) {
return item !== sub;
});
return this;
}
window.onload = function() {
var pub1 = new Publish("第一报社");
var pub2 = new Publish("第二报社");
var pub3 = new Publish("第三报社");
var sub1 = function(news) {
Q("sub1").innerHTML = arguments[1].name + ":" + news;
}
var sub2 = function(news) {
Q("sub2").innerHTML = arguments[1].name + ":" + news;
}
sub1.subscriber(pub1).subscriber(pub2).subscriber(pub3);
sub2.subscriber(pub2).subscriber(pub3);
EventUtil = {
addHandler: function(element, type, handler) {
if(element.addEventListener) {
element.addEventListener(type, handler, false);
} else if(element.attachEvent) {
element.attachEvent("on" + type, handler);
}
},
removeHandler: function(element, type, handler) {
if(element.removeEventListener) {
element.removeEventListener(type, handler, false);
} else if(element.detachEvent) {
element.detachEvent("on" + type, handler);
}
}
}
function Q(ele) {
return document.getElementById(ele);
}
EventUtil.addHandler(Q("pub1"), "click", function() {
pub1.deliver(Q("text1").value);
});
EventUtil.addHandler(Q("pub2"), "click", function() {
pub2.deliver(Q("text2").value);
});
EventUtil.addHandler(Q("pub3"), "click", function() {
pub3.deliver(Q("text3").value);
});
sub1.unsubscriber(pub1);
sub2.subscriber(pub1)
}
</script>
</html>