结论
element.addEventListener(event, function[, useCapture])
event:事件名称,如clickfunction:指定要事件触发时执行的函数,可以传入事件参数useCapture:可选。布尔值,指定事件是否在捕获或冒泡阶段执行。
默认false:在冒泡阶段执行指定事件
true:在捕获阶段执行事件
event.stopPropagation():阻止事件传播,用于function(event){}中
图解捕获与冒泡
实例:aa里面有个bb,bb里面有个cc,当点击cc时会发生什么?
实例代码 <div id="aa"> aa <div id="bb"> bb <div id="cc">cc</div> </div> </div> function print(e){ console.log(this.id); } aa.addEventListener('click',print);//第三个参数默认为false bb.addEventListener('click',print); cc.addEventListener('click',print); div{ display: flex; align-items: center; justify-content: center; } #aa{ margin:100px 0 0 400px; background-color: #f0ad4e; height:300px; width:300px; } #bb{ background-color: #4078c0; height:200px; width:200px; } #cc{ background-color: #42b983; height:100px; width:100px; } 讲解 当点击cc时,按cc>bb>aa依次捕获,再按aa>bb>cc依次冒泡;因为第三个参数(useCapture)默认为false,所以在冒泡阶段执行各自click函数,结果如下:
cc
bb
aa当js修改为 function print(e){ console.log(this.id); } aa.addEventListener('click',print,true);//第三个参数默认为false bb.addEventListener('click',print,true); cc.addEventListener('click',print,true);
再点击cc时,按cc>bb>aa依次捕获,再按aa>bb>cc依次冒泡;因为第三个参数(useCapture)为true,所以在捕获阶段执行各自click函数,结果如下:
aa
bb
cc
3. 当js修改为
function print(e){ e.stopPropagation();//执行完此函数后,该事件不再继续传播 console.log(this.id); } aa.addEventListener('click',print,true);//第三个参数默认为false bb.addEventListener('click',print,true); cc.addEventListener('click',print,true);
再点击cc时,捕获cc,执行cc的click函数, 因为print函数中有e.stopPropagation(),所以执行完该函数后,click事件不再传播.结果如下:
aa