addEventListener()與handleEvent()

MDN: 點擊打開鏈接

方法聲明

void handleEvent(in Event event);

方法
handleEvent()

當EventListener 所註冊的事件發生的時候,該方法會被調用。

可以把任意對象註冊爲事件處理程序,只要它擁有 handleEvent 方法

void handleEvent(
  in Event event
);


  二.用handleEvent的優缺點

var obj = {
// ...
handleEvent: function() {
// ...
console.log('event fired');
}
}
document.body.addEventListener('click', obj, false);

1.this的指向


以 addEventListener('click', obj, false); 方式添加事件處理器後,事件處理函數 obj.handleEvent 中的this自然是指向obj的


以 addEventListener(strEventType, func, false/true); 方式添加事件處理器後,事件處理函數 func 中的this是指向事件處理器的宿主元素(說白了就是 ele.addEventListener 中的ele),例如:


var ele = document.getElementById('test');
function handler(e) {
    console.log(this === ele);  // true
}
ele.addEventListener('click', handler, false);

用 addEventListener('click', obj, false); 好處是可以直接使用obj對象的私有屬性,可以對比來看:


var obj = {
    // ...
    attr: 1,
    handleEvent: function() {
        // ...
        console.log(this.attr); // undefined,因爲事件觸發後,this是指向宿主元素body的,而body沒有attr屬性
    }
}
document.body.addEventListener('click', obj.handleEvent, false);


2.動態改變事件處理器


可以動態地改變事件處理器,例如: obj.handleEvent = obj.handler2; 或者 obj.handleEvent = fun; ,非常方便,不用先 remove再add

3.缺點

缺點不在兼容性上(DOM2級事件IE9+支持,換句話說,能用addEventListener的地方就能用obj.handleEvent),而是可讀性方面的。筆者自認爲看過不少關於JS的書籍,但一直沒有見過這種用法,所以,寫出來別人看不看得明白是個問題

原文鏈接:點擊打開鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章