捕获与冒泡

作者 糖一瓶 日期 2018-01-12
捕获与冒泡

一、事件流

人们为了描述一个事件的传播,人为的规定一个事件的传播的方向,称为事件流。
有两个阶段: 事件的冒泡和捕获阶段。
事件是先捕获的,再冒泡。
捕获是从上到下执行的【从最外层向最内层传播】。
冒泡是从下向上传播的【从最内层向最外层传播】。1

二、事件监听

1. 0级事件监听

on***的语法添加的监听,称为DOM0级事件。
Onclick、 onmouseover 、 onmouseenter 、onmouseout 、onmouseleave 等等

DOM0级事件监听只能监听冒泡阶段。
事件的触发一个会按事件流的顺序执行。
DOM0级事件处理函数中,this指向的是触发事件的那个DOM元素。
DOM0级事件中,若给同一个DOM对象,绑定多个事件 ,后写的会覆盖先写的。
DOM0级事件监听,IE6、7、8中。事件只能冒泡到document阶段,没有window阶段。

2. DOM2级事件监听

DOM2级事件监听 用 addEventListener()函数
DOM元素.addEventListener(“事件名【没有on】”,”事件处理函数”,”是否监听捕获阶段”)

box.addEventListener("click",function(){
alert("我是DOM2级事件监听的,我是box")
},true);

> 要记住:true表示监听捕获阶段,false能监听冒泡阶段。
> DOM2级事件监听,若给同一个元素绑定一个事件名同一个阶段添加多个监听的时候。彼此不会覆盖,先写的执行。
> `对于最内层盒子是先写先执行。 最内层盒子不区分冒泡盒捕获。`
> DOM2级事件处理函数中,this指向的是事件触发的那个DOM元素。
> DOM2级事件不会覆盖DOM0级事件,先写先执行。

3. 低版本IE的监听事件

低版本IE6、7、8中只支持DOM0级事件。DOM2级有自己的方法: attachEvent

attachEvent只接收两个参数第一个参数是事件名有on,第二个参数是事件处理函数。
没有第三个参数【不能监听阶段】。在IE6、7、8中只有冒泡阶段,永远监听不到捕获阶段的。
对同一个DOM元素绑定多个事件的时候,会按书写顺序的倒序执行。
在事件处理函数中this指向的是window对象,并不是事件对象。
事件是传播不到Window对象的,所以是绑定不了。

4. 事件监听的移除

DOM0级事件的移除简单,直接把onclick属性值设置为null。

box.onclick = null;

DOM2级事件移除必须指名道姓。也就是说,每一个移除的函数需要起名。

box.addEventListener("click",fun1,false);
function fun1(){
alert("我是DOM2级事件绑定的方法")
}
box.removeEventListener("click",fun1,false);

在低版本的IE中用 detachEvent方法,事件移除必须指名道姓。

box.attachEvent("onclick", fun2);
function fun2(){
alert("低版本的IE中绑定的事件")
}
box.detachEvent("onclick", fun2);

总结

  1. 冒泡和捕获的监听

    0级事件监听只能监听冒泡阶段。this指向的是触发事件的那个DOM元素。
    2级监听事件当第三参数为true时监听捕获事件,为false时监听冒泡。this指向的是触发事件的那个DOM元素。

  2. 执行顺序

    事件的执行是先冒泡再捕获,最里层的盒子不区分捕获和冒泡,先写先执行。
    0级事件监听给同一个DOM绑定多个事件,后写的会覆盖先写的。
    2级事件监听不会覆盖先写的先执行后写的后执行。

  3. 游览器版本

    高版本的浏览器会冒泡得到window阶段,低版本的浏览器会冒泡得到document阶段。

  4. 关于IE678

    IE6、7、8中是有自己的方法 attachEvent(),只能监听冒泡阶段。
    事件名有on,this是window对象。可以设置同名的函数,但是会反复执行【事件栈】。
    This是window对象,不是触发元素。事件只能冒泡到document阶段。