<button onclick="clickhander()">按钮</button>
btnDom.onclick = function clickHandler() { console.log('click'); }
btnDom.addEventListener('click', e => { console.log('click'); })
DOM结构是一个树形结构,当一个DOM元素产生一个事件,该事件会在当前节点与根节点之间的路径传播,路经的全部节点都会接收到该事件,这就是DOM事件流css
DOM事件流的三个阶段html
关于这三个阶段的流程,文档上有个图片,描述的十分详细dom
对于target来讲,事件执行,一直会在目标阶段。但对于整个事件流上的别的元素来讲,执行顺序还会受到另一个因素的影响。spa
咱们来看一个例子,首先dom结构以下code
<div id="fa"> <div id="ch"></div> </div>
为其绑定事件htm
fa.addEventListener('click', e => { console.log('click fa') }) ch.addEventListener('click', e => { console.log('click ch') })
此时点击ch,打印出的结果是事件
"click ch" "click fa"
先执行了ch的事件,后执行了fa的事件,所以咱们能够得知,fa的事件,是在冒泡阶段被执行的。图片
addEventListener方法,能够传入第三个参数,useCapture,boolean,来决定这个执行阶段。默认为false,也就是在冒泡阶段,若是设置为true,则会在捕获阶段rem
fa.addEventListener('click', e => { console.log('click fa') }, true) ch.addEventListener('click', e => { console.log('click ch') }, true)
执行结果为文档
"click fa" "click ch"
在事件流的任何一个事件,均可以调用event的stopPropagation方法,来中止事件流。以上面的场景为例,在捕获阶段执行fa的事件,若是执行stopPropagation,则事件流终止,不会到达目标阶段,ch的世界则不会被执行
fa.addEventListener('click', e => { console.log('click fa') e.stopPropagation(); }, true) ch.addEventListener('click', e => { console.log('click ch') }, true)
执行结果为
"click fa"