美文网首页F2e踩坑之路
记录 - 兼容相关(主要IE)

记录 - 兼容相关(主要IE)

作者: 谷维陌 | 来源:发表于2018-04-23 20:44 被阅读1次

    事件兼容

    var EventUtil = {
        addHandler: function(element, type, handler) {  // 绑定事件
            if (element.addEventListener) {
                element.addEventListener(type, handler, false);
            } else if (element.attachEvent) {
                element.attachEvent('on' + type, handler);
            } else {
                element['on' + type] = handler;
            }
        },
        
        getEvent: function(event) {     // 获取event元素
            return event ? event : window.event;
        },
        
        getTarget: function(event) {    // 获取事件的目标
            return event.targer || event.srcElement;
        },
        
        preventDefault: function(event) {   // 阻止默认事件
            if (event.preventDefault) {
                event.preventDefault();
            } else {
                event.returnValue = false;  // 兼容ie
            }
        },
        
        stopPropagation: function(event) {  // 阻止冒泡
            if (event.stopPropagation) {
                event.stopPropagation();
            } else {
                event.cancelBubble = false;
            }
        },
        
        removeHandler: function(element, type, handler) {   // 移除事件
            if (element.removeEventListener) {
                element.removeEventListener(type, handler);
            } else if (element.detachEvent) {
                element.detachEvent('on' + type, handler);
            } else {
                element['on' + type] = null;
            }
        },
        
        getRelatedTarget: function(event) { 
            // DOM 通过 event 对象的 relatedTarget 属性提供了相关元素的信息。
            // mouseover 和 mouseout 事件才包含值;
            if (event.relatedTarget) {
                return event.relatedTarget;
            } else if (event.toElement) {
                return event.toElement;
            } else if (event.fromElement) {
                return event.fromElement;
            } else {
                return null;
            }
        },
        
        getButton: function(event) {
        // 就可以确定 event 对象中存在的 button 属性中是否包含正确的值。 如果测试失败, 说明是 IE, 就必须对相应的值进行规范化。
            if (document.implementation.hasFeature('MouseEvents', '2.0')) {
                return event.button;
            } else {
                switch(event.button) {
                    case 0:
                    case 1:
                    case 3:
                    case 5:
                    case 7:
                        return 0;
                    case 2:
                    case 6:
                        return 2;
                    case 4:
                        return 4;
                }
            }
        },
        
        getCharCode: function(event) {
        // IE9、 Firefox、 Chrome 和 Safari 的 event 对象都支持一个 charCode 属性,这个属性 只有在发生 keypress 事件时才包含值,而且这个值是按下的那个键所代表字符的 ASCII 编码。 DOM3不支持charCode,改为key(或keyIdentifier)和char;(不推荐)
    
            if (typeof event.charCode == 'number') {
                return event.charCode;
            }else {
                return event.keyCode;
            }
        }
    }
    

    页面坐标兼容

    // 例子,调用事件兼容对象实现
    var div = document.getElementById('myDiv');
    EventUtil.addHandler(div, 'click', function(event) {
       event = EventUtil.getEvent(event);
       var pageX = event.pageX,
           pageY = event.pageY;
        
        if (pageX === undefined) {
            pageX = event.clickX + (document.body.scrollLeft || document.documentElement.scrollLeft);
        }
        
        if (pageY === undefined) {
            pageY = event.clickY + (document.body.scrollTop || document.documentElement.scrollTop);
        }
        
    });
    

    过滤输入兼容

    EventUtil.addHandler(textbox, 'keypress', function(event) {
        event = EventUtil.getEvent(event);
        var target = EventUtil.getTarget(event);
        var charCode = EventUtil.getCharCode(event);
        // charCode 去除上下方向键等。event.ctrlKey确保用户没按ctrl键
        if (!/\d/.test(String.fromCharCode(charCode)) && charCode > 9 && !event.ctrlKey) {
            EventUtil.preventDefault(event);
        }
    });
    

    相关文章

      网友评论

        本文标题:记录 - 兼容相关(主要IE)

        本文链接:https://www.haomeiwen.com/subject/sccrlftx.html