效果图:
代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style>
*{ padding:0; margin:0}
</style>
</head>
<body>
<input type="text" id="txtId" ><br/>
原始数字:<div id="d1"></div><br/>
平方:<div id="d2"></div><br/>
立方:<div id="d3"></div><br/>
三个数之和:<div id="d4"></div><br/>
</body>
</html>
<script type="text/javascript" src="js/observer.js"></script>
<script type="text/javascript">
function $(id) {
return document.getElementById(id);
}
function $create(tagName) {
return document.createElement(tagName);
}
//创建一个发布订阅功能的对象
var txtObj={
}
observer.make(txtObj);
//第一个订阅对象d1
var d1 = {
show:function(num){
$("d1").innerHTML = num;
}
}
var d2 = {
show:function(num){
$("d2").innerHTML = num*num;
}
}
var d3 = {
show:function(num){
$("d3").innerHTML = num*num*num;
}
}
var d4 = {
show:function(num){
$("d4").innerHTML = num+num*num+num*num*num;
}
}
txtObj.addSubscriber(d1.show);
txtObj.addSubscriber(d2.show);
txtObj.addSubscriber(d3.show);
txtObj.addSubscriber(d4.show);
window.onload = function () {
$("txtId").οnkeyup=function () {
txtObj.publish(Number($("txtId").value));
};
}
</script>
observer.js文件的内容
//1、定义观察者模式的对象(模板)
var observer = {
//订阅
addSubscriber:function(callback){
this.subscribers.push(callback);
},
//退订
removeSubscriber:function(callback){
let index = this.subscribers.indexOf(callback);
this.subscribers.splice(index,1);
},
//发布
publish:function(what){
for(let i in this.subscribers){
if(typeof this.subscribers[i]==="function"){
this.subscribers[i](what);
}
}
},
//让指定对象具备观察者的所有功能
make:function(obj){
for(let key in this){
obj[key] = this[key];
}
obj.subscribers = [];
}
}