遺漏的知識點:addEventListener的第二個參數不光能夠傳入一個函數,還能夠傳入一個實現了EventListener
接口的對象。javascript
listener
java當所監聽的事件類型觸發時,會接收到一個事件通知(實現了
Event
接口的對象)對象。listener
必須是一個實現了EventListener
接口的對象,或者是一個函數ide
摘自MDN函數
我一直都是在listener
中傳入一個函數,經過監聽事件發生來實現一些邏輯。然而看到文檔描述中先提到了「一個實現了EventListener接口的對象」經過進一步查看文檔瞭解到,這個對象指的就是一個含有handleEvent
方法的對象。ui
var obj = {
// ...
handleEvent: function(event) {
// ...
console.log('event', event)
}
}
document.body.addEventListener('click', obj, false)
複製代碼
當EventListener
所註冊的事件發生時,該方法就會被調用,同時會有一個event參數傳入到方法中。this
瞭解了概念以後就要看這個知識點能爲實際開發帶來什麼好處了spa
舉個🌰.net
var obj = {
a: 1,
handleEvent: function(event) {
alert(this.a)
}
}
document.body.addEventListener('click', obj, false) // 1
document.body.addEventListener('click', obj.handleEvent, false) // undefined
複製代碼
從例子中能夠看出,這種綁定obj
會影響this的指向。也就是說咱們能夠利用這種特色,在處理事件時使用obj
中的私有屬性或方法code
再舉個🌰對象
var obj = {
a: 1,
handleEvent: function(event) {
alert(this.a)
}
}
var anotherHandler = function(event) {
alert('hello world')
}
document.body.addEventListener('click', obj, false) // 1
setTimeout(function(){
obj.handleEvent = anotherHandler // hello world
},2000)
複製代碼
從這個例子中能夠看出,這種形式的事件綁定,很方便就能動態改變處理事件的邏輯。不須要先remove再add。
這種綁定方式的缺點不在於兼容性方面,應該是可讀性方面的缺陷。我在看別人的源碼時看到這個時很是疑惑(我的水平有限也佔必定的緣由),直到查閱了資料以後才知道有這樣的一種綁定事件的寫法。
因此,平常工做開發中要使用這樣的寫法時,最好肯定一下一塊兒開發的小夥伴是否是也清楚這種方式,避免協做時的衝突。
MDN EventTarget.addEventListener()
本篇原文出自 Roy's Blog