子元素的 JavaScript 鼠标悬停/鼠标退出问题

JavaScript mouseover/mouseout issue with child element

本文关键字:鼠标 退出 出问题 悬停 JavaScript 元素      更新时间:2023-09-26

我有这个小问题,我请求你的帮助。我有一个 div 元素,里面我有一个 img 元素,像这样

<div id="parent" onmouseover="MyFuncHover()" onmouseout="MyFuncOut()">
    <img id="child" src="button.png" style="visibility: hidden" />
</div>
<script type="text/javascript">
    function MyFuncHover() {
        // Here I have some code that makes the "child" visible
    }
    function MyFuncOut() {
        // Here I have some code that makes the "child" invisible again
    }
</script>

如您所见,该图像是 div 的子级。我希望只有当我离开div时,孩子才会消失。然而,当我将鼠标移到图像上时,似乎调用了 MyFuncOut(( 函数(因为我想,我通过将鼠标悬停在图像上来离开div(。我不希望这种情况发生。我希望MyFuncOut((函数仅在我离开div区域时才被调用。

我不知道当您将鼠标移到子控件上时,它是父项调用 mouseout 事件(即使我在子控件上,我仍然在父控件上(。我被困在这种境地上,我需要你的一些好建议。谢谢!

变化

好的,当我"鼠标退出"孩子时,事件冒泡不会将"mouseout"事件发送给父级。当我"鼠标悬停"孩子时,它也不会将"鼠标悬停"事件发送给父级。那不是我需要的。我需要在"鼠标悬停"子级时不发送父级的"mouseout"事件。明白了吗?例如,当我不希望将子项上的单击事件传播到父级时,事件冒泡很有用,但这不是我的情况。奇怪的是,我在同一个父级中还有其他元素,当我"鼠标悬停"它们时,它们不会触发父级的"mouseout"事件。

你可以

使用 jquery 中可用的 "mouseenter" 和 "mouseleave" 事件,下面是下面的代码,

$(document).ready(function () {
        $("#parent").mouseenter(function () {
            $("#child").show();
        });
        $("#parent").mouseleave(function () {
            $("#child").hide();
        });
    });

以上是附加一个事件,

<div id="parent">
    <img id="child" src="button.png" style="display:none;" />
</div>

您可以使用下面的解决方案,它是纯JavaScript,我成功地使用了它。

var container = document.getElementById("container");
var mouse = {x: 0, y: 0};
function mouseTracking(e) {
    mouse.x = e.clientX || e.pageX;
    mouse.y = e.clientY || e.pageY;
    var containerRectangle = container.getBoundingClientRect();
    if (mouse.x > containerRectangle.left && mouse.x < containerRectangle.right &&
            mouse.y > containerRectangle.top && mouse.y < containerRectangle.bottom) {
        // Mouse is inside container.
    } else {
        // Mouse is outside container.
    }
}
document.onmousemove = function () {
    if (document.addEventListener) {
        document.addEventListener('mousemove', function (e) {
            mouseTracking(e);
        }, false);
    } else if (document.attachEvent) {
        // For IE8 and earlier versions.
        mouseTracking(window.event);
    }
}

我希望它有所帮助。

只需在 MyFuncOut 函数中添加一个 if 语句,该语句检查目标不是图像

if (event.target !== imageNode) {
     imageNode.style.display = 'none'
}

我也遇到了这个问题,无法让它工作。这就是我所做的。它要容易得多,而且不是JavaScript,所以它更快,不能关闭。

div.container {
    opacity:0.0;
    filter:alpha(opacity="00");
}
div.container:hover {
    opacity:1.0;
    filter:alpha(opacity="100");
}

您甚至可以添加 CSS3 过渡以实现不透明度,使其感觉更流畅。

只需设置 css 的子元素 pointer-event:none;请参阅示例:

#parent {
  width: 500px;
  height: 500px;
  border: 1px solid black;
}
#child {
  width: 200px;
  pointer-events: none; # this does the trick
}
<div id="parent" onmouseover="MyFuncHover()" onmouseout="MyFuncOut()">
    <img id="child" src="https://i2.wp.com/beebom.com/wp-content/uploads/2016/01/Reverse-Image-Search-Engines-Apps-And-Its-Uses-2016.jpg?w=640&ssl=1" />
</div>
<script type="text/javascript">
    function MyFuncHover() {
      console.log("mouse over")
    }
    function MyFuncOut() {
      console.log("mouse out")
    }
</script>