如何检测鼠标何时离开窗口?

IT技术 javascript browser mouse
2021-02-02 16:45:01

我希望能够检测到鼠标何时离开窗口,以便在用户的鼠标在其他地方时停止触发事件。

关于如何做到这一点的任何想法?

6个回答

请记住,我的答案已经老化了很多。

在 html 页面上实现拖放行为时通常需要这种类型的行为。下面的解决方案在 IE 8.0.6、FireFox 3.6.6、Opera 10.53 和 Safari 4 上在 MS Windows XP 机器上进行了测试。
首先是 Peter-Paul Koch 的一个小函数;跨浏览器事件处理程序:

function addEvent(obj, evt, fn) {
    if (obj.addEventListener) {
        obj.addEventListener(evt, fn, false);
    }
    else if (obj.attachEvent) {
        obj.attachEvent("on" + evt, fn);
    }
}

然后使用此方法将事件处理程序附加到文档对象 mouseout 事件:

addEvent(document, "mouseout", function(e) {
    e = e ? e : window.event;
    var from = e.relatedTarget || e.toElement;
    if (!from || from.nodeName == "HTML") {
        // stop your drag event here
        // for now we can just use an alert
        alert("left window");
    }
});

最后,这是一个嵌入了用于调试的脚本的 html 页面:

<html>
<head>
<script type="text/javascript">
function addEvent(obj, evt, fn) {
    if (obj.addEventListener) {
        obj.addEventListener(evt, fn, false);
    }
    else if (obj.attachEvent) {
        obj.attachEvent("on" + evt, fn);
    }
}
addEvent(window,"load",function(e) {
    addEvent(document, "mouseout", function(e) {
        e = e ? e : window.event;
        var from = e.relatedTarget || e.toElement;
        if (!from || from.nodeName == "HTML") {
            // stop your drag event here
            // for now we can just use an alert
            alert("left window");
        }
    });
});
</script>
</head>
<body></body>
</html>
使用mouseleave而不是 mouseout 来防止触发文档中的元素。很好的解释,它适用于 IE5.5 ... developer.mozilla.org/en-US/docs/Web/API/Element/ ...
2021-03-13 16:45:01
如果其他 HTML 元素正在填充窗口,这将不起作用。
2021-03-16 16:45:01
此解决方案的问题在于,即使用户只是尝试使用滚动条,它也会向左窗口发出警报。在这里发布了这个问题的解决方案,但还有一个问题需要解决(见链接)。
2021-03-25 16:45:01
使用 window.event 解决了我获取此事件的问题。谢谢!
2021-03-30 16:45:01
当鼠标没有在 chrome 中按下时,它看起来不会触发。当鼠标在 chrome 中按下时它确实会触发。似乎是不一致的行为。
2021-04-01 16:45:01

如果您使用的是 jQuery,那么这段简短而甜蜜的代码如何呢?

$(document).mouseleave(function () {
    console.log('out');
});

只要鼠标不在您的页面中,就会触发此事件。只需更改功能即可执行任何您想要的操作。

你也可以使用:

$(document).mouseenter(function () {
    console.log('in');
});

当鼠标再次进入页面时触发。

来源:https : //stackoverflow.com/a/16029966/895724

这种技术在 Chrome 15 到 56(我当前的版本)中不稳定。但它在 Firefox 中非常有效。请参阅:stackoverflow.com/questions/7448468/...
2021-03-15 16:45:01
如果窗口在后台(浏览器未聚焦)并且鼠标进入窗口(Chrome 61/macOS10.11),它也会触发
2021-03-21 16:45:01
mouseleave 正在工作,但如果打开检查元素它也会触发,如何防止?主意?
2021-03-24 16:45:01
mouseleave 似乎比它应该的火得多。
2021-03-28 16:45:01
@Skeets(和未来的读者)此问题已于 2019 年 2 月 14 日标记为已修复
2021-03-31 16:45:01

这对我有用:

addEvent(document, 'mouseout', function(evt) {
  if (evt.toElement == null && evt.relatedTarget == null) {
    alert("left window");
  }
});
这是约书亚米尔斯回答中定义的函数
2021-03-13 16:45:01
谓词可以更简洁,如 if (!evt.toElement && !evt.relatedTarget)
2021-03-30 16:45:01
在 ie8 上,relatedTarget 未定义,在 ie9+ 和 firefox 上,toElement 未定义。因为它,正确的评估是: if ((evt.relatedTarget === null) || (evt.toElement === null)) {
2021-04-02 16:45:01

为了在不考虑滚动条和自动完成字段或检查的情况下检测 mouseleave :

document.addEventListener("mouseleave", function(event){

  if(event.clientY <= 0 || event.clientX <= 0 || (event.clientX >= window.innerWidth || event.clientY >= window.innerHeight))
  {

     console.log("I'm out");

  }
});

条件说明:

event.clientY <= 0  is when the mouse leave from the top
event.clientX <= 0  is when the mouse leave from the left
event.clientX >= window.innerWidth is when the mouse leave from the right
event.clientY >= window.innerHeight is when the mouse leave from the bottom

======================== 编辑 ========================== ======

document.addEventListener("mouseleave") 似乎不会在新的 Firefox 版本上触发,mouseleave 需要附加到像 body 这样的元素或子元素。

我建议改用

document.body.addEventListener("mouseleave")

或者

window.addEventListener("mouseout")
这适用于 2021 年 4 月的最新 Chrome 版本 89.0.4389.114
2021-03-31 16:45:01
@ user3479125,你能不能在我的代码片段上也试一试,看看当没有添加 if 语句时问题是否仍然存在?它考虑了滚动条,但我没有测试过自动完成或检查。stackoverflow.com/a/56678357/985399
2021-04-07 16:45:01
时不时开火。当光标移动目标边界和光标变为调整大小时触发的一点点流时,接缝失败。
2021-04-08 16:45:01

使用 onMouseLeave 事件可防止冒泡,并允许您轻松检测鼠标何时离开浏览器窗口。

<html onmouseleave="alert('You left!')"></html>

http://www.w3schools.com/jsref/event_onmouseleave.asp

这似乎是 Firefox 和 Chrome 的唯一可行解决方案。类似document.documentElement.addEventListener('mouseleave', function() { console.log('OUT'); })document.body.addEventListener('mouseleave', function() { console.log('OUT'); })不在 Chrome 90.0.4430.93 上运行的脚本
2021-04-04 16:45:01
极好的!支持 IE5.5+ ... 也可以document.onmouseleave = function() { alert('You left!') };使用不要使用 document.body 会触发收缩身体的滚动条!不需要防止元素着火的代码。很好的解释:developer.mozilla.org/en-US/docs/Web/API/Element/...
2021-04-10 16:45:01