mouseenter(进入)、mouseleave、mouseover(覆盖)和mouseout是常用来判断鼠标移出和移入的事件句柄,虽然功能上差不多,但是细节却有不同的地方。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>随风丶逆风</title>
<style>
div{
margin: 0 auto;
}
.parentBox{
height: 200px;
width: 300px;
background-color: #f00;
}
.childBox{
height: 200px;
width: 200px;
background-color: #00f;
}
</style>
</head>
<body>
<div class="parentBox">
<div class="childBox"></div>
</div>
</body>
<script>
window.onload=function(){
let parent = document.getElementsByClassName("parentBox")[0];
parent.addEventListener("mouseenter",()=>console.log("Mouse Enter"));
parent.addEventListener("mouseleave",()=>console.log("Mouse Leave"));
parent.addEventListener("mouseover",()=>console.log("Mouse Over"));
parent.addEventListener("mouseout",()=>console.log("Mouse Out"));
}
</script>
</html>
上面是页面代码,在浏览器中打开页面,显示为下图:
使用鼠标从左侧向右侧横向滑动,那么在控制台会输出下面的信息:
为了方便浏览,我将控制台的8个输出标记了序号,下面来说明一下(红色盒子为父盒子,蓝色盒子为子盒子):
①② 首先移入红色盒子范围内,触发了进入盒子的mouseover和mouseenter事件,且mouseover触发时间的优先于mouseenter;
③④ 然后当移入到蓝色盒子时,触发了离开红色盒子的mouseout事件,同时触发了蓝色盒子mouseover进入事件,说明mouseover不仅在父元素会触发,在子元素也会触发;
⑤⑥ 再然后又移入红色盒子时,触发了蓝色盒子的mouseout事件和红色盒子的mouseover事件,同理说明mouseout不仅在父元素会触发,在子元素也会触发;
⑦⑧ 最后移出红色盒子时,触发mouseout和mouseleave事件。
从上面的例子中可以得出下面几个结论:
1.mouseover与mouseout成对,mouseenter与mouseleave成对(连它们都成对了。。。默默画个圈)
2.mouseover触发优先级高于mouseenter,mouseout触发优先级高于mouseleave
3.在父元素上绑定mouseover和mouseout事件,子元素同样也会触发,即子元素mouseover和mouseout事件会冒泡至父元素;而父元素绑定mouseenter和mouseleave事件只对父元素有效,子元素不会触发,即mouseenter和mouseleave事件不会冒泡至父元素。
所以在实际应用时,推荐使用mouseenter和mouseleave事件句柄,避免因为考虑不佳而产生错误的效果。当然也可以使用标准stopPropagation() 方法,或者IE浏览器上使用cancelBubble=true的方式阻止冒泡,从而达到和mouseenter和mouseleave的相同效果。
部分内容参考https://www.cnblogs.com/xpl-blogs/p/6528012.html