跨瀏覽器的事件處理程序

事件處理程序有DOM0級事件處理程序、DOM2級事件處理程序,IE事件處理程序,DOM0級事件處理程序具有簡單,跨瀏覽器的優(yōu)勢。DOM2級事件定義了兩個方法:addEventListener()和removeEventListener()這兩個方法用于指定和刪除事件處理程序,IE也有兩個方法:attachEvent()和detachEvent(),由于IE8和更早的版本只支持事件冒泡,所以通過這兩個方法只能添加到冒泡階段,為了使事件處理程序可以在大多數(shù)瀏覽器正常的運(yùn)行,只要關(guān)注冒泡階段即可。所以我們要寫一個方法,讓它根據(jù)情況使用DOM0級方法,DOM2級方法或者IE方法添加事件:

function addEvent(e,type,handler){
        if(e.addEventListener){
            e.addEventListener(type,handler,false);
        }else if(e.attachEvent){
            e.attachEvent("on"+type,handler);
        }else{
            e["on"+type]=handler;
        }
    }

可以這樣使用:
addEvent(btn,'’click',handler);

與addEvent()對應(yīng)的移除事件的方法是removeEvent(),無論該事件用什么方法添加到元素中,如果其他方法無效,就采用DOM0級的方法移除。

function removeEvent(e,type,handler){
           if(e.removeEventListener){
               e.removeEventListener(type,handler,false);
           }else if(e.detachEvent){
               e.detachEvent("on"+type,handler);
           }else {
               e["on"+type]=null;
           }
    }

這兩個方法首先都判斷是否存在DOM2級的方法,如果存在就使用該方法傳入事件類型,事件處理程序,和第三個參數(shù)false(因?yàn)殛P(guān)注冒泡階段),如果存在IE方法就用第二種,以此類推,但是以上兩種方法沒有考慮到IE瀏覽器作用域的問題,其實(shí)這個我也不是很理解,參考老師的課件,添加的時候:

function addEvent(node, type, handler) {
    if (!node) return false;
    if (node.addEventListener) {
        node.addEventListener(type, handler, false);
        return true;
    }
    else if (node.attachEvent) {
        node['e' + type + handler] = handler;
        node[type + handler] = function() {
            node['e' + type + handler](window.event);
        };
        node.attachEvent('on' + type, node[type + handler]);
        return true;
    }
    return false;
}

移除事件時:

function removeEvent(node, type, handler) {
    if (!node) return false;
    if (node.removeEventListener) {
        node.removeEventListener(type, handler, false);
        return true;
    }
    else if (node.detachEvent) {
        node.detachEvent('on' + type, node[type + handler]);
        node[type + handler] = null;
    }
    return false;
}

不是很明白window.event。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • 摘自 js權(quán)威指南第三版 第一個要創(chuàng)建的方法是addHandler(),它的職責(zé)是視情況分別使用DOM0 級方法、...
    一沭丶閱讀 300評論 0 0
  • 一、問答 1. dom對象的innerText和innerHTML有什么區(qū)別? innerHTML: 也就是從對象...
    饑人谷_羅偉恩閱讀 699評論 0 2
  • JavaScript 程序采用了異步事件驅(qū)動編程模型。在這種程序設(shè)計(jì)風(fēng)格下,當(dāng)文檔、瀏覽器、元素或與之相關(guān)的對象發(fā)...
    劼哥stone閱讀 1,333評論 3 11
  • 本章內(nèi)容 理解事件流 使用事件處理程序 不同的事件類型 JavaScript 與 HTML 之間的交互是通過事件實(shí)...
    悶油瓶小張閱讀 333評論 0 0
  • 歡迎來到不可能的世界! 本期編輯:葉子露Lucya 1.編者的話 感謝大家關(guān)注奇思妙想!奇思的編輯們?nèi)匀辉诰ぞI(yè)業(yè)...
    葉子露Lucya閱讀 257評論 16 8

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