关于事件触发的奇怪问题

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        #pannel {
            background-color: red;
            width: 200px;
            display: flex;
        }
        #left, #right {
            flex: 1;
            height: 100px;
        }
        #left {
            background-color: blue;
        }
        #right {
            background-color: green;
        }
    </style>
    <script>
        window.onload = function() {
            const pannelEl = document.querySelector('#pannel')
            pannelEl.onmouseover = function() {
                console.log('mouse over')
            }
            pannelEl.onmouseout = function() {
                console.log('mouse out')
            }
        }
    </script>
</head>
<body>
    <p>在left和right之间来回切换,会反复触发父容器的onmouseover和onmouseout事件</p>
    <div id="pannel">
        <div id="left">left</div>
        <div id="right">right</div>
    </div>
</body>
</html>
阅读 1.8k
2 个回答

因为 mouseovermouseout 是会冒泡的,如果你想要更符合直觉的移入移出反馈,应该使用不会冒泡的 mouseentermouseleave 事件。

如果稍稍改一下代码,可以看到事件是发生在哪个元素上的

pannelEl.onmouseover = function (e) {
    console.log("mouse over", e.target.id);
};
pannelEl.onmouseout = function (e) {
    console.log("mouse out", e.target.id);
};

只需要根据 target 来区分就好。在容器上添加事件处理函数,用来自处理子元素的事件,称为事件代理或事件委托。jQuery 提供了比较简单的方法来实现事件代理

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题