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

事件兼容

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);
    }
});
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  •   JavaScript 与 HTML 之间的交互是通过事件实现的。   事件,就是文档或浏览器窗口中发生的一些特...
    霜天晓阅读 8,862评论 1 11
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,328评论 19 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,180评论 25 709
  • 看了遇见王沥川,随着剧情的发展,落泪了很多次,为了小秋的执着,也为了沥川的一往情深……有人说男主那么高富帅爱上凤凰...
    五日雨青山阅读 3,038评论 0 0
  • 又到一年高考时,微博、微信、新闻全被高考刷屏。令我印象深刻的是,在高考后的两三年内,每一次听闻高考在即,我依然亢奋...
    Tangtang文英阅读 2,701评论 0 0