事件触发经历三个阶段
捕获阶段->目标阶段->冒泡阶段
- 事件捕获:从外层一层一层往内部直至传递到目标元素;
- 事件冒泡:从目标元素开始一层层向外传递至根节点;
DOM事件流,是先调用捕获阶段的处理函数,其次调用目标阶段的处理函数,最后调用冒泡阶段的处理函数;
若使用 addEventListener 监听事件,默认是监听冒泡阶段的事件,但可以通过 useCapture 参数,来指定在什么阶段触发事件。设置useCapture为true则在捕获阶段触发,为false则在冒泡阶段触发。
而默认情况下,捕获阶段的事件处理函数,一定比冒泡阶段的事件处理函数先执行。
有些情况我们只需要触发子元素的事件处理函数即可,那么
如何阻止事件冒泡和事件捕获,即阻止事件传递?
利用event.stopPropagation();可以阻止事件向上(冒泡)或向下(捕获)传递。
但在IE8及以下用:window.event.cancelBubble=true阻止事件传递。
注意:e.preventDefault() 是阻止默认事件的发生,不会阻止事件传递。