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