跨浏览器事件

上次面试被问到关于与事件委托的问题,当时没打出来,晚上有空整理了一下,做一个总结。

事件,在标准DOM和IE间标准不同,所以一般要跨浏览器就要手写跨浏览器事件。

DOM 0 级 指的就是 btn.click(function(){}) 这种的

DOM 2 级 指的就是 btn.addEventListener(event,f,true/false); 注意一点就是最后一个参数 trur指的是捕获,false在冒泡是发生

DOM 1级 我也不知道这是什么鬼


奇葩的IE 首先IE只支持捕获,不支持冒泡,哦 btw 事件的三个阶段分别是 捕获--》触发--》冒泡

由于IE只支持冒泡,所以通用是写通用事件时,DOM的第三个参数要设为false才会统一;

还有值得一提的是,这下彻底理解 evt=event||window.event; 所代表的含义了,就是兼容事件

比如点击时就会触发事件,这是浏览器就会产生一个事件对象,这个事件对象中有一些属性和方法,比较重要的有以下这几个

DOM中 target:表示目标锚点,这个很精确 preventDefault() 这个就是阻止默认事件发生 stopPropagation() 阻止冒泡

IE中 srcElement就是DOM中的target returnValue设置为false就可以取消默认事件 cancelBubble 设置为true就是stopPropagation

然后事件委托就变得很简单,比如一列li 标签,逐个绑定太麻烦,消耗性能,就可以考虑事件委托,让事件绑定在父元素上,用target.id来分流

事件通用代码如下

可以处理事件绑定,注意最后的 event=getEvent(event) 木有加var 说明他是全局的

var commonEvent = {

    addEvent: function (element, event, f) {
        if (element.addEventListener) {
            element.addEventListener(event, f, false)
        }
        if (element.attachEvent) {
            element.attachEvent("on" + event, f)
        }
        else {
            event["on" + event] = f;
        }
    },

    removeEvent: function (element, event, f) {
        if (element.removeEventListener) {
            element.removeEventListener(event, f, false)
        }
        if (element.removeEvent) {
            element.detachEvent("on" + event, f)
        }

        else {
            event["on" + event] = null;
        }
    },

    getEvent: function (event) {
        return event = event ? event : window.event;
    },

    getTarget: function (event) {
        return  target = event.target || event.srcElewment;
    },

    stopPropagation: function (event) {
        if (event.stopPropagation) {
            event.stopPropagation();
        }
        else {
            event.cancelBubble = true;
        }
    },
    preventDefault: function (event) {
        if (event.preventDefault) {
            event.preventDefault();
        }
        else {
            eventReturnValue = false;
        }
    }
};

bt.onclick = function (event) {
    event = commonEvent.getEvent(event);
    var target = commonEvent.getTarget(event);
};

posted on 2016-03-03 23:02  liuestc  阅读(146)  评论(0编辑  收藏  举报