[记录]mouseover/mouseenter 以及 mouseout/mouseleave 的区别

mouseovermouseenter 事件都是在鼠标移入元素时触发。
mouseoutmouseleave 事件,都是鼠标移出元素时触发。

不同点在于:mouseovermouseout 事件会冒泡,而 mouseentermouseleave 事件不会冒泡。

下面是一个例子:
1.HTML

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        div{
            padding:20px;
            background: red;
        }
        #inner{
            background: orange;
        }
    </style>
</head>
<body>
    <div id="outer">
        Outer
        <div id="inner">Inner</div>
    </div>
</body>
</html>

2.处理 mouseovermouseout 事件:

<script>
    const outerEle = document.querySelector("#outer")
    const innerEle = document.querySelector("#inner")
    outerEle.addEventListener("mouseover",() => {
        console.log("Mouseover:outerEle")
    })
    innerEle.addEventListener("mouseover",() => {
        console.log("Mouseover:innerEle")
    })
</script>

将鼠标移入到 #inner 元素,查看运行结果:

// 移入到 #outer 元素
Mouseover:outerEle
// 移入到 #inner 元素
Mouseover:innerEle
// 移入到 #inner 元素上时,冒泡到 #outer 元素
Mouseover:outerEle

3.处理 mouseentermouseleave 事件
将代码修改下,处理 mouseentermouseleave 事件:

<script>
    const outerEle = document.querySelector("#outer")
    const innerEle = document.querySelector("#inner")
    outerEle.addEventListener("mouseenter",() => {
        console.log("Mouseenter:outerEle")
    })
    innerEle.addEventListener("mouseenter",() => {
        console.log("Mouseenter:innerEle")
    })
</script>

运行结果:

// 移入到 #outer
Mouseenter:outerEle
// 移入到 #inner,事件并未冒泡到 #outer
Mouseenter:innerEle

可见 mouseentermouseleave 是为了方便在鼠标移入/移出元素时的冒泡处理,如果在 mouseovermouseout 中阻止冒泡,就能达到和 mouseentermouseleave 一样的效果:

<script>
    const outerEle = document.querySelector("#outer")
    const innerEle = document.querySelector("#inner")
    outerEle.addEventListener("mouseover",() => {
        console.log("Mouseover:outerEle")
    })
    innerEle.addEventListener("mouseover",(e) => {
        e.stopPropagation()
        console.log("Mouseover:innerEle")
    })
</script>

执行结果略。

注:在 DOM 事件中,关于表单元素获取/丢失焦点,有四个相关的事件:

  • focus
  • blur
  • focusin
  • focusout

当表单元素获取焦点后,会触发 focusfocusin 事件,当表单元素失去焦点后,会触发 blurfocusout 事件,其中 focusinfocusout 事件跟 focusblur 事件的区别是:focusinfocusout 事件会冒泡(即表单元素的父节点可以绑定这两个事件,在获取/失去焦点后,会触发父节点上的相关事件处理函数),而 focusblur 事件不会冒泡,将这两个事件绑定到父节点时不会有任何效果。

完。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  •   JavaScript 与 HTML 之间的交互是通过事件实现的。   事件,就是文档或浏览器窗口中发生的一些特...
    霜天晓阅读 8,873评论 1 11
  • (续jQuery基础(1)) 第5章 DOM节点的复制与替换 (1)DOM拷贝clone() 克隆节点是DOM的常...
    凛0_0阅读 5,212评论 0 8
  • 总结: 鼠标事件 1.click与dbclick事件$ele.click()$ele.click(handler(...
    阿r阿r阅读 5,535评论 2 10
  • 第1章 鼠标事件 1-1 jQuery鼠标事件之click与dbclick事件 用交互操作中,最简单直接的操作就是...
    mo默22阅读 5,057评论 0 6
  • 前言 原文地址 项目地址 不知道大家在面试或者工作过程中有没有被mouseover和mouseenter(对应的是...
    谦龙阅读 4,021评论 0 3