在前端開發中,咱們常常須要對某些事件進行監聽。這樣只要在指定的元素上觸發了該事件,就會執行一個回調來進行相關的操做。javascript
而js中事件監聽方法總共有三種,分別以下所示:前端
demo:java
function cb() { console.log(1); } element.addEventListener('click', cb, false); element.attachEvent('onclick', cb); element.onclick = cb;
參數含義:瀏覽器
addEventListener 是W3C工做組在DOM Level 2開始引入的一個註冊事件監聽器的方法;而在此以前,傳統的事件監聽方法是經過 element[’on’ + type] 的方式來註冊的。函數
它們兩之間的主要區別是, element[’on’ + type] 的方式沒法使用事件捕獲,而且 element[’on’ + type] 不支持對同一個元素的同一個事件註冊多個事件監聽器。以下面的例子所示,元素被點擊後只會輸出1,而不會輸出0和1。spa
element.onclick = function(){ console.log(0); } element.onclick = function(){ console.log(1); }
然而 addEventListener 方法在IE6~8的瀏覽器中不被支持。那麼在低版本的IE中怎麼來爲同一個事件註冊多個事件監聽器呢?原來IE從IE5.0系列開始就引入了 attachEvent() 方法來支持這一特性。但遺憾的是該方法也不支持事件捕獲。而且從IE 11開始,這個方法已經被棄用。code
W3C規範中定義了3個事件階段,依次是捕獲階段、目標階段、冒泡階段。事件對象按照上圖的傳播路徑依次完成這些階段。若是某個階段不支持或事件對象的傳播被終止,那麼該階段就會被跳過。舉個例子,若是Event.bubbles
屬性被設置爲 false ,那麼冒泡階段就會被跳過。若是 Event.stopPropagation() 在事件派發前被調用,那麼全部的階段都會被跳過。對象
在一個事件完成了全部階段的傳播路徑後,它的 Event.currentTarget 會被設置爲 null 而且 Event.eventPhase 會被設爲0。 Event 的全部其餘屬性都不會改變(包括指向事件目標的 Event.target 屬性)。blog