js中时间执行的整个过程称之为事件流,分为三个阶段:事件捕获阶段,事件目标处理函数、事件冒泡。
当某歌元素触发某个事件(如:click),顶级对象document发出一个事件流,顺着dom的树节点向触发它的目标节点流去,直到达到目标元素,这个层层递进,向下找目标的过程为事件的捕获阶段,此过程与事件相应的函数是不会触发的。
到达目标函数,便会执行绑定在此元素上的,与事件相应的函数,即事件目标处理函数阶段。
最后,从目标元素起,再依次往顶层元素对象传递,途中如果有节点绑定了同名事件,这些事件所对应的函数,在此过程中便称之为事件冒泡。
通常情况下,事件相应的函数四在冒泡阶段执行的。addEventListener的第三个参数默认为false,表示冒泡阶段执行(为true的时候,表示捕获阶段执行)。
使用e.stopPropgation()或e.cancelBubble = true(IE)可以阻断事件向当前元素的父元素冒泡。
以上是在冒泡阶段触发事件,但是由于最内层的元素阻止了默认事件,所以导致冒泡事件无法产生。
前三个结果是事件捕获阶段执行函数输出的没在捕获阶段,是从最高节点开始,但凡绑定了clik事件,便会执行;之后进入冒泡阶段,由于div[1]身阻止了事件冒泡,因此它的父级div[0]的click事件是不会触发的,事件到div[1]便结束了。
如果把阻止冒泡的行为添加在捕获阶段,如捕获阶段的div[1]身上,则只会依次输出捕获过程中触发click事件时div[0]、div[1]的函数执行结果,之后的捕获行为和冒泡行为将全部被阻断。