如何使用javascript扩展代码检测firefox窗口中的鼠标进出

如何使用javascript扩展代码检测firefox窗口中的鼠标进出,javascript,windows,firefox-addon,mouseenter,mouseleave,Javascript,Windows,Firefox Addon,Mouseenter,Mouseleave,我正在创建firefox扩展,当鼠标指针从一个窗口移动到另一个窗口时,无法找到接收mouseenter和mouseleave事件的方法 首先,我将解释扩展正在做什么,以明确确切的情况,因为细节可能很重要。当用户想要在firefox浏览器中了解术语单词、短语、首字母缩略词时,他会将鼠标指针移动到该术语,并将鼠标指针停留在该术语上 javascript扩展代码调用window.open以显示一个小的、无边界的弹出窗口,该窗口看起来类似于术语上方的工具提示。此澄清窗口用一行文本解释和描述术语 如果用户

我正在创建firefox扩展,当鼠标指针从一个窗口移动到另一个窗口时,无法找到接收mouseenter和mouseleave事件的方法

首先,我将解释扩展正在做什么,以明确确切的情况,因为细节可能很重要。当用户想要在firefox浏览器中了解术语单词、短语、首字母缩略词时,他会将鼠标指针移动到该术语,并将鼠标指针停留在该术语上

javascript扩展代码调用window.open以显示一个小的、无边界的弹出窗口,该窗口看起来类似于术语上方的工具提示。此澄清窗口用一行文本解释和描述术语

如果用户希望在此澄清窗口中澄清一个术语,他只需将鼠标指针移动并暂停在该术语上。这将在第一个澄清窗口的正上方显示另一个澄清窗口,其中包含关于第二个术语的信息。显然,除了主firefox浏览器窗口外,扩展javascript代码还在Clearify窗口中运行

要使澄清窗口消失,用户只需将鼠标指针移到该窗口外

要使其正常工作,扩展javascript代码需要在鼠标指针退出一个窗口并进入另一个窗口时接收事件。这就是我一直无法使之正常工作的原因

扩展javascript代码调用以下两行之一:

1: window.addEventListener("mouseover", meanings.onmouseover, true);
1: window.addEventListener("mouseout", meanings.onmouseout, true);

2: window.document.documentElement.addEventListener("mouseenter", meanings.onmouseenter, false);
2: window.document.documentElement.addEventListener("mouseleave", meanings.onmouseleave, false);
当我启用第一对事件时,似乎生成了太多的事件,并且event.target、event.currentTarget、event.relatedTarget似乎都是文档中的各个元素节点,这没有帮助,因为我们只关心在窗口之间移动,而不关心页面中的元素之间移动

当我启用第二对行时,一般的行为似乎更好,因为窗口中的多余事件似乎不是仅在窗口的外部边界生成的,这是需要的。当鼠标光标进入或离开主浏览器窗口时,将调用相应的事件处理程序函数。此外,当鼠标指针进入任何弹出窗口时,将调用相应的事件处理程序函数。但是,当鼠标指针离开任何弹出澄清窗口时,无论鼠标指针移动到另一个澄清窗口还是主浏览器窗口,都不会调用任何事件处理程序

此外,event.relatedTarget属性始终为空-它不包含鼠标指针在mouseenter上移入的窗口或文档,也不包含鼠标指针在mouseleave上移出的窗口或文档

我不敢相信我在这方面花了多少时间,因为这在许多应用程序中都是一个常见的需求。尽管如此,我仍在挣扎,试图找到一种行之有效的方法


我怎样才能实现我所需要的?

[我的答案可能对你有帮助][1],如果我对你的理解正确。。。[1] :我认为当一个窗口被赋予键盘输入焦点时,或者当一个窗口被用户点击鼠标激活时,就会发生焦点和激活等事件。如果是这样的话,这对我的应用程序不起作用,因为鼠标只是在窗口之间移动并生成mousemove事件,但从来没有生成mousedown事件,而mousedown事件就是键盘聚焦或激活窗口的原因。还是我误解了焦点和激活是如何工作的?如果有,请告诉我!你知道,像focus或activate这样的活动,不需要鼠标下移就可以工作,这将是完美的!让我知道。如果我没有弄错的话,测试一下。我没有一个两年前我在一个附加组件上工作过的环境,无论如何,如果这对你不起作用,也许你可以尝试捕获鼠标移动事件并保存新打开的窗口X和Y位置,通过这样做,你可以知道鼠标在哪里,这是另一个链接是的,我做到了。事实上,我的扩展中几乎所有的事情都是mousemove事件的结果,因为每次mousemove我都会清除现有的超时计时器并启动一个新的超时计时器。因此,当鼠标暂停300ms时,将调用超时处理程序函数,代码将在鼠标指针暂停的术语上方创建一个澄清窗口。问题是,浏览器中的每个窗口,加上所有这些小窗口都运行我的扩展的一个单独实例,因此它们之间的协调并不容易。另外,鼠标可以移出我应用程序中的所有窗口…继续。。。在阅读了您提供的链接中的页面后,可能有一个解决方案需要调用window.openDialog,而不是像我现在这样调用window.open。关键的区别在于,window.openDialog允许我向新创建的窗口传递额外的参数,其中一个示例似乎暗示可以传递回调函数。我不明白的是。。。回调函数运行在什么上下文中?原始窗口中扩展的上下文,或扩展的上下文 Windows.openDialog创建的窗口中的sion?javascript很奇怪!!!