記錄 - 兼容相關(guān)(主要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) {    // 獲取事件的目標(biāo)
        return event.targer || event.srcElement;
    },
    
    preventDefault: function(event) {   // 阻止默認(rèn)事件
        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 通過(guò) event 對(duì)象的 relatedTarget 屬性提供了相關(guān)元素的信息。
        // 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 對(duì)象中存在的 button 屬性中是否包含正確的值。 如果測(cè)試失敗, 說(shuō)明是 IE, 就必須對(duì)相應(yīng)的值進(jìn)行規(guī)范化。
        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 對(duì)象都支持一個(gè) charCode 屬性,這個(gè)屬性 只有在發(fā)生 keypress 事件時(shí)才包含值,而且這個(gè)值是按下的那個(gè)鍵所代表字符的 ASCII 編碼。 DOM3不支持charCode,改為key(或keyIdentifier)和char;(不推薦)

        if (typeof event.charCode == 'number') {
            return event.charCode;
        }else {
            return event.keyCode;
        }
    }
}

頁(yè)面坐標(biāo)兼容

// 例子,調(diào)用事件兼容對(duì)象實(shí)現(xiàn)
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);
    }
    
});

過(guò)濾輸入兼容

EventUtil.addHandler(textbox, 'keypress', function(event) {
    event = EventUtil.getEvent(event);
    var target = EventUtil.getTarget(event);
    var charCode = EventUtil.getCharCode(event);
    // charCode 去除上下方向鍵等。event.ctrlKey確保用戶沒(méi)按ctrl鍵
    if (!/\d/.test(String.fromCharCode(charCode)) && charCode > 9 && !event.ctrlKey) {
        EventUtil.preventDefault(event);
    }
});
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • ??JavaScript 與 HTML 之間的交互是通過(guò)事件實(shí)現(xiàn)的。 ??事件,就是文檔或?yàn)g覽器窗口中發(fā)生的一些特...
    霜天曉閱讀 3,701評(píng)論 1 11
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,628評(píng)論 19 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,155評(píng)論 25 708
  • 看了遇見(jiàn)王瀝川,隨著劇情的發(fā)展,落淚了很多次,為了小秋的執(zhí)著,也為了瀝川的一往情深……有人說(shuō)男主那么高富帥愛(ài)上鳳凰...
    五日雨青山閱讀 459評(píng)論 0 0
  • 又到一年高考時(shí),微博、微信、新聞全被高考刷屏。令我印象深刻的是,在高考后的兩三年內(nèi),每一次聽(tīng)聞高考在即,我依然亢奮...
    Tangtang文英閱讀 395評(píng)論 0 0

友情鏈接更多精彩內(nèi)容