JS实现观察者模式

感谢自学IT网的燕十八老师

<!DOCTYPE HTML>
<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>观察者模式</title>
    <style type="text/css" media="all">
        #sec{
            margin:20px;
        }
        #cont,#ad,#study{
            width:400px;
            height:200px;
            margin:10px;
            border:1px solid #ccc;
        }
    </style>
    
</head>
<body>
    <div class='container'>
        <select name="" id="sec">
            <option value='male'>男性</option>
            <option value='famale'>女性</option>
        </select>
        &nbsp;
        <input type='button' value='观察尾部' onclick='t1()' />
        <input type='button' value='不观察尾部' onclick='t2()' />
        <div id='cont'>这里是内容</div>
        <div id='ad'>这里是广告</div>
        <div id='study'>这里是学习</div>
    </div>
</body>
    <script type="text/javascript" charset="utf-8">
        var sec = document.getElementById('sec');
        var ad = document.getElementById('ad');
        var cont = document.getElementById('cont');
        var study = document.getElementById('study');

        sec.observers = {};
        sec.attach = function(key,obj){
            this.observers[key] = obj;
        }

        sec.detach = function(key){
            delete sec.observers[key];
        }

        sec.onchange = sec.notify = function(){
            for(var key in this.observers){
                this.observers[key].update(this);
            }
        }

        cont.update = function(observer){
            if (observer.value=='male') 
            {
                this.style.backgroundColor = 'gray';
            }else if (observer.value=='famale'){
                this.style.backgroundColor = 'pink';
            }
        }

        ad.update = function(observer){
            if (observer.value=='male') 
            {
                this.innerHTML = '汽车';
            }else if (observer.value=='famale'){
                this.innerHTML = '减肥';
            }
        }

        study.update = function(observer){
            if (observer.value=='male') 
            {
                this.innerHTML = '电脑';
            }else if (observer.value=='famale'){
                this.innerHTML = '化妆';
            }
        }

        // 监听
        sec.attach('cont',cont);
        sec.attach('ad',ad);
        sec.attach('study',study);

        function t1(){
            // 观察尾部
            sec.attach('study',study);
        }

        function t2(){
            // 不观察尾部
            sec.detach('study');
        }
    </script>
</html>



转载于:https://my.oschina.net/u/946060/blog/315252

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值