下面我们看一段代码:
<script>
window.addEventListener('click',function(){
alert("window click!");
})
document.addEventListener('click',function(){
alert("document click!");
})
</script>
输出的结果是顺序是:document click!、window click!;为什么是这样呢?
首先说一下dom的事件机制,dom事件有一下三种情况:
1.捕获阶段:从外向里依次查找元素。(“注意:查找”)
2.目标阶段:从事件源本身操作。
3.冒泡阶段:这个很形象,就是从内到外(下往上)依次触发相关的行为。(“注意:触发”)
原因:首先body被html包裹,而html被document包裹,而document被window包裹,总结上面的顺序,为:body=》html=》document=》window。所以当鼠标点击下去的时候,首先点击的是window,然后到document知道点击的页面元素,然后当传到元素的时候,这个事件就像,到了水底后,然后又把水泡冒出来显示给用户。。直到window显示结束。所以顺序是document click!=》window click!。
1、ev.stopPropagation()作用:
<body>
<button id="btn">ev.stopPropagation 测试</button>
</body>
<script>
document.getElementById("btn").addEventListener('click',function(ev){
alert("点击了button");
})
function bodyClickFun(){
alert("点击了document");
}
document.addEventListener('click',function(){
bodyClickFun();
})
</script>
当点击<button>后,依次alert:点击了button、点击了document。
当我们为button事件加上:ev.stopPropagation();后,如下:
<body>
<button id="btn">ev.stopPropagation 测试</button>
</body>
<script>
document.getElementById("btn").addEventListener('click',function(ev){
//阻值冒泡事件
ev.stopPropagation();
alert("点击了button");
})
function bodyClickFun(){
alert("点击了document");
}
document.addEventListener('click',function(){
bodyClickFun();
})
</script>
当点击<button>后,只alert:点击了button。不会再传递到document事件
参考:https://blog.csdn.net/MLGB__NIU/article/details/79107984、
https://www.cnblogs.com/sqh17/archive/2018/02/07/8427283.html