《JavaScript设计模式》笔记 之 外观模式

外观模式:为一组复杂子系统接口提供一个更高级的同一接口,通过这个接口使得对子系统接口的访问更容易。

添加一个点击事件

为页面文案document对象绑定了一个click文件事件来实现隐藏提示框的交互功能

document.onclick = function(e){
    e.preventDefault();
    if(e.target !== document.getElementById('xxx')){
        hidePageAlert()
    }
}

function hidePageAlert(){
    
}

DOM0就是直接通过 onclick写在html里面的事件
DOM2是通过addEventListener绑定的事件, 还有IE下的DOM2事件通过attachEvent绑定;

不足:如果说有别的程序员写了类似的方法,可能会覆盖,导致不起作用,加上可能浏览器兼容性问题。

兼容方式

定义一个统一接口方法,简化我们对复杂的底层接口不统一的使用需求。

封装方法和使用

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <button id="mybtn">
        测试
    </button>
    <script>
        function addEvent(dom, type, fn) {
            if (dom.addEventListener) {
                dom.addEventListener(type, fn, false);//false- false- 默认。事件句柄在冒泡阶段执行
            } else if (dom.addEvent) {
                dom.attachEvent('on' + type, fn) //ie
            } else {
                dom['on' + type] = fn;
            }
        }

        var myDom = document.getElementById('mybtn')
        addEvent(myDom, 'click', function () {
            alert(1)
        })
    </script>
</body>

</html>

同样的e.preventDefault和e.target的问题

// 获取事件对象
var getEvent= function(event){
    return event || window.event  //ie返回window.event
}

//获取元素
var getTarget = function(event){
    var event = getEvent(event);
    return event.target || event.srcElement;
}

//阻止默认行为

var preventDefault = function(event){
    var event = getEvent(event);
    if(event.preventDefault){
        event.preventDefault()
    }else{
        event.returnValue = false
    }
}

document.onclick = function(e){
    preventDefault(e);
    if(getTarget(e) !== document.getElementById("xx")){
        //...
    }
}
小型代码库
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        .box{
            border: 1px solid black;
        }
    </style>
</head>

<body>
    <p id="p">sssss</p>
    <script>
        var A = {
            g: function (id) {
                return document.getElementById(id)
            },
            css: function (id, key, value) {
                this.g(id).style[key] = value;
            },
            attr: function (id, key, value) {
                this.g(id)[key] = value;
            },
            html: function (id, html) {
                this.g(id).innerHTML = html
            },
            on: function (id, type, fn) {
                this.g(id)['on' + type] = fn
            }
        }
        A.css("p","color",'red');
        A.attr("p","className",'box');
        A.on('p','click',function(){
            A.css('p','width','200px')
        })

    </script>
</body>

</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值