跨瀏覽器的事件代理

咱們知道,在主流的瀏覽器裏面綁定事件處理程序和解綁分別是:node

綁定:addEventListener(eventType, handler, useCapture);
解綁:removeEventListener(eventType, handler, useCapture);

eventType: 事件的名字,string類型,例如‘click’
handler: 事件處理程序,function類型
useCapture: 
    若是爲true, handler在事件捕獲階段執行
    若是爲false, handler在事件冒泡階段執行

然而IE9以前,IE的事件處理程序是不同,首先看看它的兩個方法:瀏覽器

綁定:attachEvent(eventNameWithOn, handler)
解綁:detachEvent(eventNameWithOn, handler) 

eventNameWithOn: 事件的名字,而且前面有‘on’
handler: 事件處理程序

IE的事件處理程序除了從方法名字的不一樣,還有其餘的一些不一樣,來作一個總結:this

1: 參數不一樣
  IE版本沒有useCapture這個參數,由於IE只支持冒泡,因此也不必給出這個參數了。也能夠理解爲在attachEvent()和detachEvent()內useCapture爲false.
2: this不一樣
  在非IE的其餘瀏覽器中,咱們傳遞給事件處理程序(handler)的this是事件目標元素(也就是咱們的target);可是,IE的this倒是Window
3: Event對象不一樣
  在非IE的其餘瀏覽器中,咱們會把Event對象傳給咱們的事件處理程序(handler),可是IE卻沒有,而是做爲一個屬性綁定在了Window上
4: 在非IE的其餘瀏覽器中和IE的Event實例中的內容是不同的
    1: 事件源: target -> srcElement(IE)
    2: 阻止瀏覽器默認行爲:preventDefault -> returnValue = false(IE)
    3: 阻止事件冒泡: stopPropagation -> cancelBubble = true
    其實還有不少的不一樣,以上三點算是比較重要又廣泛的

因此若是咱們要實現一個跨瀏覽器的事件代理,就要處理IE的那些不一樣。假設咱們有這樣的一段HTML:代理

<ul class='bookList'>
    <li class='bookItem'>book 1</li>
    <li class='bookItem'>book 2</li>
    <li class='bookItem'>book 3</li>
    <li class='bookItem'>book 4</li>
</ul>

咱們想要實現一個效果,點擊'<li>'的時候,彈出此'<li>'內的文字。咱們採用代理的方式,利用時間的冒泡把事件綁定到‘<ul>’上,而不是每個‘<li>’上面:code

var bookList = document.getElementsByClassName('bookList')[0];

if(document.addEventListener){
    bookList.addEventListener('click', function(event){
        var target = getTarget(event);
        if(target.nodeName === 'LI'){
            alert(target.innerHTML);
        }
    })
}
if(document.attachEvent){
    bookList.attachEvent('click', function(event){
        var target = getTarget(event);
        if(target.nodeName === 'LI'){
            alert(target.innerHTML);
        }
    })

}

function getTarget(event){
    var event = event || window.event;
    var target = event.target || event.srcElement;
    return target;
}
相關文章
相關標籤/搜索