```
## IE事件模型
`IE8`及之前的版本是不支持捕获事件的,`IE`事件模型共有两个过程:
**事件处理阶段**`target phase`,事件到达目标元素, 触发目标元素的监听事件。
**事件冒泡阶段**`bubbling phase`事件从目标元素冒泡到`document`,依次执行经过的节点绑定的事件。
## DOM2级模型
`DOM2`事件模型是`W3C`制定的标准模型,支持捕获型事件和冒泡型事件,调用事件的处理阶段依次为捕获、目标、冒泡。
### 实例
当点击`id`为`i3`的`
`时,浏览器会依次弹出`0 1 3 2`,`addEventListener`方法的第三个参数为声明绑定的事件为捕获型还是冒泡型,默认为`false`,也就是冒泡型。
```html
JS事件流模型
```
`document`对象与`i1`节点绑定的是捕获型的监听事件,`i2`与`i3`节点绑定的是冒泡型的事件,事件传递的顺序为:
```
window --- document --- html --- body --- i1 --- i2 --- i3 --- i2 --- i1 --- body --- html --- document --- window
```
从`window`到`i3`的过程为**捕获阶段**,依次执行了过程中绑定的事件,本例中执行了`alert(0)`与`alert(1)`,然后到达**目标阶段**的`i3`,执行`i3`绑定的事件`alert(3)`,然后从`i3`到`window`的阶段为**冒泡阶段**,执行了绑定的`alert(2)`,执行顺序即为`0 1 3 2`。
## 注意
### 绑定监听事件使用的区别
在`DOM0`中直接绑定函数执行时,后定义的函数会覆盖前边绑定的函数,下面这个例子只执行`alert(1)`而不执行`alert(0)`。`click()`是一个对象事件,点击即触发`onclick()`绑定的方法,`onclick()`是对象的属性,将其绑定函数后即为`click()`事件触发后执行的方法。
```html
JS事件流模型
```
`addEventListener`可以为事件绑定多个函数,并且绑定时不需要加`on`,其还可以接收第三个参数`useCapture`来决定事件时绑定的捕获阶段还是冒泡阶段执行。
```javascript
document.getElementById("i1").addEventListener('click',(e) => {
alert(0);
}) // 执行
document.getElementById("i1").addEventListener('click',(e) => {
alert(1);
}) // 执行
```
`attachEvent`可以为事件绑定多个函数,绑定时需要加`on`,其只支持冒泡阶段执行,所以不存在第三个参数。
```javascript
document.getElementById("i1").attachEvent('onclick',function(e){
alert(0);
}) // 执行
document.getElementById("i1").attachEvent('onclick',function(e){
alert(1);
}) // 执行
```
## 每日一题
```
https://github.com/WindrunnerMax/EveryDay
```