[TOC]
# 事件
## 事件監聽器執行順序
不能同時對事件目標、事件類型及執行階段都相同的對象注冊多個相同的事件監聽器。以第一次注冊的事件監聽器為主。
## 事件的傳播
### 捕獲階段
事件將會從 Window 對象開始向下遍歷 DOM 樹來傳播。如果注冊了事件監聽器,則會在捕獲階段執行相應的處理。
### 目標階段
被事件目標注冊的事件監聽器將會被執行。
### 事件冒泡階段
時間的傳播方式為事件目標開始向上遍歷 DOM 樹,直至 Window 對象結束。在該樹的節點中注冊的事件監聽器將會在這時被執行。
### 取消傳播
通過在事件監聽器內執行 `Event.stopPropagation()` 方法就能取消傳播。如果要中止其它的事件監聽器的執行,則需要使用在 DOM Level 3 中引入的 `stopImmediatePropagation()` 方法,會讓監聽器目標中設定的其他事件監聽器的執行也會被中止。
### 取消默認處理
通過 `Evenet.preventDefault()` 方法來取消瀏覽器中默認實現的處理操作
## 自定義事件
通過 `createEvent()` 方法來創建一個事件對象,并通過目標節點的 `dispatchEvent()` 方法來分發這一事件對象。這樣就可以對目標節點所指定的事件處理程序或事件監聽器進行調用。在 IE 中,我們需要以 `createEventObject()` 方法與 `fireEvent()` 方法來替代 `createEvent()` 方法與 `dispatchEvent()` 方法。
```javascript
var event = document.createEvent('Events');
event.initEvent('myEvent', true, true);
var target = document.getElementById('foo');
target.addEvenetListener('myEvent', function(){
alert('my event is fired');
}, false);
target.dispatchEvent(event);
```