為什么用 addEventListener
- 可以對(duì)同一物件的同一事件綁定多個(gè)事件處理程序。
- 可以通過事件流三個(gè)階段更好地控制何時(shí)觸發(fā)事件處理程序。
- 工作于 DOM 元素,而不僅是 HTML 元素。
事件分發(fā)時(shí)添加 eventListener
不會(huì)立即觸發(fā) eventListener,可能會(huì)在下一個(gè)事件流(比如冒泡階段)中觸發(fā)。
多個(gè)相同的 eventListener
如下,三個(gè)參數(shù)完全相同,并且第二個(gè)參數(shù)不是匿名函數(shù)。
document.getElementById("myBox").addEventListener("click", Go, false);
document.getElementById("myBox").addEventListener("click", Go, false);
document.getElementById("myBox").addEventListener("click", Go, false);
會(huì)拋棄多余的,只保留一個(gè),對(duì)應(yīng)的 removeEventListener 也只用一次就可以了(removeEventListener 用法和 addEventListener 完全相同)。
但如果是第二個(gè)參數(shù)是匿名函數(shù),比如:
document.getElementById("outDiv").addEventListener("click", function () { document.getElementById("info").innerHTML += "1";}, false);
document.getElementById("outDiv").addEventListener("click", function () { document.getElementById("info").innerHTML += "1";}, false);
document.getElementById("outDiv").addEventListener("click", function () { document.getElementById("info").innerHTML += "1";}, false);
則三個(gè)均有效,并且無法用 removeEventListener 除去。
this
事件處理程序中,this 變成了觸發(fā)事件的控件,但我們?nèi)酝扑]用 event.target 或 event.currentTarget。
早期的事件監(jiān)聽
在 DOM0 中,我們用 obj.onclick = FuncName,由于兼容性好,應(yīng)用非常廣泛,只是功能不如 addEventListener 強(qiáng)大。
內(nèi)存問題
前面提到了許多使用域名函數(shù)的地方,有時(shí)這是沒辦法的,請(qǐng)參見在各瀏覽器中動(dòng)態(tài)添加事件-參數(shù)篇,但這會(huì)導(dǎo)致內(nèi)存問題。
一旦事件綁定之后,該綁定代碼作用域的變量就都保留下來,不會(huì)被 JavaScript 引擎回收,這可能會(huì)引起占用大量?jī)?nèi)存的問題,由于 removeEventListener 無法刪除匿名函數(shù)的事件處理程序,只有在物件(比如按鈕)去除之后,該內(nèi)存才可能得到回收。