mouseenter、mouseleave、mouseover和mouseout的区别

    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

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值