事件流模型

事件机制包括三个阶段:

1、捕获

2、目标触发

3、冒泡

DOM结构是树形结构,当页面中的某个元素触发了某个事件,事件会从最顶层的window对象开始,向下传播到目标元素,即‘捕获阶段’,然后目标元素触发相应的事件,即‘目标触发’,再向上传播到window,途径的祖先元素都会触发相应的事件,即‘冒泡’。

有如下文档:

显示结果如图:

一、此时添加如下代码:

点击蓝色d3区域则:

依次弹出d3,d2,d1。

根据事件机制,点击d3后,首先从window开始向下传播到目标元素d3,触发d3的click事件,弹出'd1',然后向上传播,沿途经过祖先元素d2,d2也绑定了点击事件,因此触发其点击事件,弹出'd2',继续向上传播,到d3,d3同样绑定了点击事件,触发而弹出'd3'。继续向上传播到window对象,不再有click事件。

若要阻止事件冒泡,可以使用e.stopPropagation()

e.stopPropagation()可阻止事件冒泡。此时点击d3则只会触发目标元素的事件,不会冒泡,即只弹出‘d3’。

二、若用addEventListener为元素添加事件:

addEventListener(event,fn,useCapture)

其中第3个参数useCapture是一个Boolean值,可以用来设置事件是在捕获阶段执行,还是冒泡阶段执行。默认值为false,即冒泡阶段执行。

添加如下代码:

则会依次弹出‘d3’,‘d2’,‘d1’。

此时若修改d1的useCapture为true,则d1绑定的click在事件捕获阶段就会执行,即依次弹出‘d1’,‘d3’,‘d2’。

补充:

IE不支持addEventListener,而是用attachEvent(event,fn)方法,由于IE的事件模型默认是在冒泡阶段执行,所以此方法没有第三个参数来设置事件的执行时机。IE用event.cancelBubble=true来阻止冒泡。

猜你喜欢

转载自www.cnblogs.com/szzlily/p/9467960.html
今日推荐