当前位置: 首页 > 面试题库 >

鼠标离开浏览器窗口时的Javascript事件[重复]

仉高昂
2023-03-14
问题内容

我希望当鼠标离开浏览器窗口时运行一些Javascript代码。我只需要支持Safari(WebKit)。

我尝试将mouseout处理程序放在窗口上。当鼠标离开浏览器窗口时,将可靠地调用该处理程序。但是由于冒泡,当鼠标在文档中的元素之间移动时也会被调用。我不知道如何确定鼠标何时真正离开窗口以及何时仅在元素之间移动。

当鼠标离开窗口时,将恰好生成一个事件,并且目标元素似乎是鼠标实际上位于其上方的元素。因此,检查目标元素是窗口还是文档是行不通的。并且将整个页面包装在不可见的div中也不起作用:如果div不可见,则鼠标将永远不会在其上方,因此不会发生任何变化。

(如果我将处理程序放在document或document.body上,也会发生同样的事情,除了令人惊讶的是,当鼠标进入或离开窗口的空白部分(例如创建的空白垂直空间)时,document.body不会获得mouseover
/ mouseout事件通过将元素的绝对位置设置为bottom:0。对于该空间,文档和窗口将获得mouseover /
mouseout事件,目标为,而document.body则不会。)

我有一些想法:

  • 在每个mouseout事件上,获取鼠标的实际位置,然后查看它是否确实在窗口上方。但是我不知道这是否真的可能,而且消除所有比赛条件似乎很棘手。
  • 还注册一个鼠标悬停处理程序,并检测没有鼠标悬停进行鼠标悬停的情况。但这需要一个计时器。

我们使用prototype.js,所以理想情况下,我想用原型的Event.observe来表达解决方案,但是我可以弄清楚这一点。

感谢您的任何建议!


问题答案:

简介:
可以通过在mouseout事件期间检查relatedTarget属性来干净地完成此操作。如果relatedTarget不是文档的子级,则鼠标刚离开窗口。自己做起来很容易,但是如果您不想这样做,则某些库(Mootools,将来的Prototype..)具有内置功能,而另一些(当前Prototype)具有扩展可用。在IE上,您可以改用mouseleave,这是mouseout的非冒泡版本。

细节:

IE具有名为mouseenter和mouseleave的事件,它们是mouseover和mouseout的非冒泡版本。其他浏览器则不会,但是如果这样做,则在窗口或文档上设置mouseleave侦听器可以解决问题。

一位名叫肯·斯奈德(K​​en Snyder)的绅士前来救援:

鼠标悬停时,relatedTarget属性引用指针所来自的节点。在mouseout上,relatedTarget属性引用指针所指向的节点。在任何事件上,作用域是事件附加到的节点。当relatedTarget不是currentTarget的子代时,mouseover事件等效于mouseenter事件和mouseout事件等效于mouseleave事件。

- http://kendsnyder.com/archives/6-MouseEnter-and-
MouseLeave.html

这使得在其他浏览器中实现mouseenter和mouseleave成为可能。实际上,Ken为此提供了相同的Prototype代码:http
:
//kendsnyder.com/sandbox/enterleave/MouseEnterLeave.js

Duroth在评论中指出MooTools已经包含类似的东西。(感谢Duroth。)听起来好像即将发布的Prototype版本(1.6.2)可能包含此功能,但我找不到任何确定的东西。



 类似资料:
  • 问题内容: 使用Firefox,WebKit和Internet Explorer的窗口调整大小事件的正确(现代)方法是什么? 并且可以打开/关闭两个滚动条吗? 问题答案: jQuery 为此具有内置方法: 对于用户界面的响应起见,你可以考虑使用的setTimeout只有经过数毫秒打电话给你的代码,如下面的例子,启发这样:

  • 问题内容: 我想捕获浏览器窗口/选项卡关闭事件。我已经尝试使用jQuery以下内容: 但这也适用于表单提交,这不是我想要的。我想要一个仅在用户关闭窗口时才触发的事件。 问题答案: 每当用户出于任何原因离开您的页面时,都会触发该事件。 例如,如果用户提交表单,单击链接,关闭窗口(或选项卡)或使用地址栏,搜索框或书签进入新页面,则将触发该事件。 您可以使用以下代码排除表单提交和超链接(其他框架除外):

  • 问题内容: 在同一浏览器的选项卡/窗口之间进行JavaScript通信的最可靠方法是什么?例如,当选项卡2开始播放音频时,选项卡1以某种方式知道这一点并可以暂停其播放器。 我正在建立一个带有音乐播放器的网站…因此,如果您现在打开该网站的两个标签,则可以同时在两者上播放音乐。这显然是不好的,所以我正在尝试寻找解决方案。 有任何想法吗?谢谢 问题答案: 这是一个旧的答案,我建议使用此处描述的现代版本:

  • 问题内容: 有谁知道我可以使用JavaScript检查浏览器窗口何时关闭并弹出确认对话框询问用户是否确认退出浏览器还是改变主意的任何方式? 问题答案: window.onbeforeunload = function (e) { var e = e || window.event;

  • 我有一个下载操作在我的javascript代码与提供商。 这将触发我的浏览器弹出窗口。我不想这样。 但是我想直接下载。不要显示弹出窗口。

  • 我有以下代码来显示(自定义by-mvn repo) 问题是, > 我希望在鼠标输入时显示弹出窗口-工作正常。 我希望在用户从标签退出鼠标时隐藏弹出窗口,但在弹出窗口中输入鼠标时不隐藏弹出窗口。 我已经在标签上添加了鼠标插入和鼠标退出操作,但如何处理另一种情况,即如果用户输入鼠标进入弹出窗口,我不想隐藏弹出窗口。