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的書籍,但一直沒有見過這種用法,所以,寫出來別人看不看得明白是個問題