在没有jQuery的情况下悬停父绝对div的子元素时防止onmouseout

IT技术 javascript css dom-events onmouseout
2021-01-14 13:12:07

onmouseout在绝对定位的 div中遇到了该函数的问题当鼠标击中 div 中的子元素时,mouseout 事件会触发,但我不希望它在鼠标离开父级绝对 div 之前触发。

mouseout当它击中没有 jquery 的子元素时,如何防止事件触发。

我知道这与事件冒泡有关,但我没有找到如何解决这个问题的运气。

我在这里找到了一个类似的帖子:如何禁用由子元素触发的鼠标退出事件?

但是,该解决方案使用 jQuery。

6个回答

使用onmouseleave.

或者,在 jQuery 中,使用 mouseleave()

这正是您正在寻找的东西。例子:

<div class="outer" onmouseleave="yourFunction()">
    <div class="inner">
    </div>
</div>

或者,在 jQuery 中:

$(".outer").mouseleave(function(){
    //your code here
});

一个例子是here

@grecdev,多说!
2021-03-17 13:12:07
onMouseLeave 这也是我最终使用的,因为它不会冒泡。
2021-03-20 13:12:07
为我节省了很多时间。谢谢
2021-04-07 13:12:07
mouseleave 不能取消。
2021-04-10 13:12:07

对于在大多数情况下有效的更简单的纯 CSS 解决方案,可以pointer-events通过将其设置为none

.parent * {
     pointer-events: none;
}

浏览器支持:IE11+

杰出的!完全解决了我的问题!
2021-03-13 13:12:07
这应该是第一个或至少第二个答案,我已经准备好处理事件侦听器的麻烦,这也完全解决了我的问题。很简单 !
2021-03-16 13:12:07
@hellofunk 这就是您将点击事件应用于父级的原因。所需的确切代码因实现而异,此答案仅建议使用该pointer-events属性
2021-03-17 13:12:07
这可以防止 mouseout 被触发,但对我来说,它也可以防止实际的孩子被点击作为菜单中的选择,这是菜单的重点。
2021-03-18 13:12:07
它仅在区域内没有其他控制器元素(编辑、删除)时才有效,因为该解决方案也会阻止它们。
2021-03-25 13:12:07
function onMouseOut(event) {
        //this is the original element the event handler was assigned to
        var e = event.toElement || event.relatedTarget;
        if (e.parentNode == this || e == this) {
           return;
        }
    alert('MouseOut');
    // handle mouse event here!
}



document.getElementById('parent').addEventListener('mouseout',onMouseOut,true);

我做了一个快速的 JsFiddle 演示,包含所有需要的 CSS 和 HTML,检查出来......

编辑跨浏览器支持的固定链接http://jsfiddle.net/RH3tA/9/

请注意,这仅检查直接父级,如果父级 div 具有嵌套的子级,那么您必须以某种方式遍历父级元素以查找“原始元素”

嵌套子项的编辑示例

编辑修复了希望跨浏览器

function makeMouseOutFn(elem){
    var list = traverseChildren(elem);
    return function onMouseOut(event) {
        var e = event.toElement || event.relatedTarget;
        if (!!~list.indexOf(e)) {
            return;
        }
        alert('MouseOut');
        // handle mouse event here!
    };
}

//using closure to cache all child elements
var parent = document.getElementById("parent");
parent.addEventListener('mouseout',makeMouseOutFn(parent),true);

//quick and dirty DFS children traversal, 
function traverseChildren(elem){
    var children = [];
    var q = [];
    q.push(elem);
    while (q.length > 0) {
      var elem = q.pop();
      children.push(elem);
      pushAll(elem.children);
    }
    function pushAll(elemArray){
      for(var i=0; i < elemArray.length; i++) {
        q.push(elemArray[i]);
      }
    }
    return children;
}

和一个新的JSFiddle编辑更新的链接

抱歉,您似乎有 alert('MouseOut') ,但它对我不起作用?我点击了没有 JS 库选项的运行
2021-03-19 13:12:07
这是一个相当古老的答案 - 现在你可以使用contains它使它成为一个更优雅的解决方案:function makeMouseOutFn(event) { e = event.toElement || event.relatedTarget; if (this.contains(e)) return; //handle mouse event here }
2021-03-20 13:12:07
这不起作用。mouseleave是正确答案
2021-03-23 13:12:07
如果你有孙子怎么办?还是曾孙?即你能有一个递归的解决方案,而不仅仅是 immidiate 孩子吗?
2021-03-29 13:12:07
您应该向小提琴添加一个 mouseout 事件,以便对其进行测试。警报或什么应该做。
2021-04-04 13:12:07

这是基于以下内容的更优雅的解决方案。它解释了从不止一个级别的孩子冒出来的事件。它还解释了跨浏览器的问题。

function onMouseOut(this, event) {
//this is the original element the event handler was assigned to
   var e = event.toElement || event.relatedTarget;

//check for all children levels (checking from bottom up)
while(e && e.parentNode && e.parentNode != window) {
    if (e.parentNode == this||  e == this) {
        if(e.preventDefault) e.preventDefault();
        return false;
    }
    e = e.parentNode;
}

//Do something u need here
}

document.getElementById('parent').addEventListener('mouseout',onMouseOut,true);
我也在 Chrome 中的同一行上弹出了相同的问题,不包括this@GregoryLewis 提到的函数定义行修复了该问题。同样为了更多的跨浏览器支持,试试这个: if (window.addEventListener){ document.getElementById('parent').addEventListener('mouseout',onMouseOut,true); } else if (window.attachEvent){ document.getElementById('parent').attachEvent("onmouseout",onMouseOut); }
2021-03-23 13:12:07
很英俊!如果需要对旧浏览器的支持,最佳答案。
2021-03-30 13:12:07
当我将上述函数粘贴到我的脚本中时,Dreamweaver 和 FF 在第一行抛出一个错误,“function onMouseOut(this, event) {”。看起来您不允许将“this”作为参数。我想当我从输入参数中省略“this”时它会起作用,但我不确定,因为“我不知道我不知道什么”。
2021-04-03 13:12:07
Sam Elie,这似乎不适用于 IE、Safari 或 Opera。你有这个脚本的跨浏览器版本吗?它在 Firefox 和 Chrome 中就像一个魅力。谢谢。
2021-04-04 13:12:07

而不是 onmouseout 使用 onmouseleave。

您尚未向我们展示您的具体代码,因此我无法在您的具体示例中向您展示如何操作。

但它非常简单:只需将 onmouseout 替换为 onmouseleave。

这就是全部:) 所以,很简单:)

如果不确定如何操作,请参阅以下说明:

https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_onmousemove_leave_out

蛋糕的和平:) 享受它:)

这是一个伟大的呼喊,如果你有类似的情况,非常值得一试
2021-03-28 13:12:07