[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);
```