javascript执行上下文在具有多个窗口的firefox扩展中是如何工作的?

javascript执行上下文在具有多个窗口的firefox扩展中是如何工作的?,javascript,html,firefox,firefox-addon,executioncontext,Javascript,Html,Firefox,Firefox Addon,Executioncontext,我正在写一个相当简单的firefox扩展。但这是我的第一个firefox扩展和第一个javascript程序,我已经习惯了C语言和汇编语言,其中没有隐藏任何东西,所以我很难理解会发生什么 我的问题是关于多个执行上下文,或者我的扩展使用window.open或window.openDialog创建的多个窗口中[部分]缺少执行上下文。但首先让我描述一下我的扩展正在做什么,以防这很重要 我的扩展本质上很简单,因为它不会以任何方式更改firefox浏览器窗口。它不会添加任何新的GUI元素,不会添加、删除

我正在写一个相当简单的firefox扩展。但这是我的第一个firefox扩展和第一个javascript程序,我已经习惯了C语言和汇编语言,其中没有隐藏任何东西,所以我很难理解会发生什么

我的问题是关于多个执行上下文,或者我的扩展使用window.open或window.openDialog创建的多个窗口中[部分]缺少执行上下文。但首先让我描述一下我的扩展正在做什么,以防这很重要

我的扩展本质上很简单,因为它不会以任何方式更改firefox浏览器窗口。它不会添加任何新的GUI元素,不会添加、删除或修改任何菜单项,也不会通过操作firefox浏览器中的任何小部件、控件或菜单来调用它

我的扩展名所做的是检测鼠标光标何时暂停,当鼠标停留在文本节点上时,我的扩展名调用window.open或window.openDialog,在鼠标光标暂停的术语上方显示一个小的、无边界的澄清窗口

澄清窗口看起来很像一个工具提示窗口,除了作为一个小型的firefox浏览器,它的内容是HTML[如果需要,可以使用javascript],因此它看起来比工具提示更好、更丰富。“澄清”窗口还包含几个按钮。一个按钮创建并显示一个更大的详细窗口,其中包含有关鼠标光标下术语的详细信息。另一个按钮创建并显示一个选项窗口,允许操作员控制我的扩展的各个方面的工作方式。这些窗口也是由我调用window.open或window.openDialog的扩展创建的,因此它们都是firefox浏览器窗口,可以显示HTML[如果需要,可以使用javascript]

我的扩展中的所有全局/共享变量都在一个结构中,该结构在作为我的扩展的javascript程序顶部定义和初始化

因此,一旦安装了我的扩展,当操作员打开firefox浏览器时,无论firefox浏览器加载什么HTML页面,我的扩展都会在浏览器中运行。当鼠标光标停留在文本节点上时,“我的扩展名”会在鼠标光标下找到术语单词、短语、首字母缩略词,创建一个描述该术语的HTML文件,然后调用window.open或window.openDialog创建“澄清”窗口,并以名义上的“澄清”.HTML显示该HTML文件

由于这个小小的、无边界的Clearify窗口也是firefox浏览器,即使没有任何UI元素,我的扩展也是Clearify窗口的一部分。因此,如果操作员将鼠标光标停留在澄清窗口中的某个术语上,同样的操作会再次发生。最初,我的扩展代码在第一个窗口上方显示了另一个Clearify窗口,这个过程是递归工作的。这很管用,有点可爱和优雅,但最终我觉得这种行为太过分了。因此,我更改了代码,以检查鼠标是否在澄清窗口中的某个术语上暂停,如果是,只需更新澄清窗口中的内容即可

我的问题适用于这两种操作方式中的任何一种,但这两种成功对我来说都意味着,在Clearify窗口中执行的扩展本质上独立于在原始firefox浏览器窗口中执行的扩展。。。主要是因为代码按预期工作,并且我在编写代码时假设这两个实例是独立的

好的,现在来看看让我需要了解多个javascript程序/扩展的执行上下文是如何关联的这一难题

当鼠标停留在术语上时,“我的扩展名”会在术语周围插入一些简单的标记,通过更改文本颜色来突出显示术语,这不会更改术语的大小,因此不会导致文本回流。如果操作员将鼠标光标移动到Clearify窗口中,执行上下文将切换到Clearify窗口中的扩展javascript,并且原始浏览器窗口中的扩展javascript不再接收mousemove、mouseover、,mouseout等,澄清窗口的执行上下文接收addEventHandler安装的所有事件

这似乎不会带来问题。但确实如此。我注意到的第一个案例如下。当操作员将鼠标光标移动到Clearify窗口的末尾,然后移动到Clearify窗口之外,执行javascript会收到一个mouseout事件。但是,如果鼠标光标位于桌面或某个完全无关的应用程序创建的窗口上,则。。。没有进一步的事情发生

发生这种情况时,Clearify窗口会在收到mouseout事件时自行销毁,以确保被放弃的Clearify窗口不会在原始firefox浏览器上搁浅

< p> 然而,这个术语在最初的firefox浏览器Woops中仍然突出显示。大问题

这就是执行上下文的性质和关系变得至关重要的地方

这里有两种可能的解决方案,我想,但我不知道这两种方案是否可行,更不用说实际可行了,以及随着新浏览器版本的发布,可能存在哪些可靠性问题

这两种解决方案都调用window.openDialog而不是window.open来打开澄清窗口。关键区别在于,window.openDialog允许传递额外的任意参数,然后在创建的窗口中运行的扩展可以访问这些参数。我可以想象两种解决方案:

1:将术语\u highlight\u remove函数的[地址]传递到window.openDialog中。这个函数,实际上我扩展中的所有函数都只是全局/共享结构的成员,但我认为这一点都不重要,尽管我当然不知道,因为javascript对我来说是一个完全奇怪的谜,因为我的思维方式是低级的、面向C的

2:将整个全局/共享结构的[地址]传递到window.openDialog中。然后,Clearify窗口上下文中的扩展javascript可能可以访问该结构中的所有变量,并且可以执行其自己的term_highlight_remove函数,但可以在原始浏览器中修改属于扩展javascript的变量

我有一种感觉,2不起作用,但1可能起作用。我对2的工作持怀疑态度的原因如下。术语_highlight_remove函数所做的一件事是从原始浏览器中的术语周围移除类似style=color:ffffff60的属性。我怀疑在澄清窗口的上下文中执行术语“突出显示”和“删除”不可能修改原始浏览器窗口中的HTML

剩下的是方法1。下面是我如何想象这是如何工作的

当在window.openDialog的一个额外参数中传递术语\u highlight\u remove函数的[address]时,我希望它不仅在原始浏览器的执行上下文中传递术语\u highlight\u remove函数的地址,而且在某种程度上javascript跟踪该函数的执行上下文[地址]

如果是这样,那么当Clearify窗口中的扩展javascript调用传入的term_highlight_remove函数时,调用该函数的行为以某种方式神奇地从Clearify窗口的执行上下文切换到原始浏览器窗口的执行上下文

如果确实发生这种情况,那么它调用的术语\u highlight\u remove函数应该希望从属于原始浏览器窗口的全局/共享结构中访问变量,并且应该希望从该结构中访问和修改HTML元素以修改原始浏览器中的HTML

所以问题是……在上述情况下,这些执行上下文是如何工作的


上面的1或2行吗?如果两者都不行,如何达到我要求的结果?

你能把你的代码上传到github吗,这会更容易理解。还有为什么要使用window,为什么不使用panel?你可以在panel里面放一个iframe?无论如何,你不会在window下面收到指针事件,因为它被覆盖了。试试putting在窗口中css pointer events:none;在澄清窗口上。但是,由于您正在使用window.open,它可能无法工作,您需要做的是使用Services.ww,例如:

var{utils,Cu}=组件; 特写:进口'resource://gre/modules/Services.jsm'; var win=Services.ww.openWindownull,您的\u clearify.HTML\u URL\u在这里,\u blank,chrome,null

打开此窗口时,将其样式设置为指针事件:无

现在,要使其在calrifyWindow中不起作用,只需在代码顶部添加以下内容:

if (document.location.indexOf('clarify.html') > -1) {
    return;
}

你能在这个主题中分享一下如何突出文档中的单词吗,这家伙问了这个问题,我的部分回答是:我是firefox扩展新手和javascript新手。但是你帖子的内容让我相信你对我的问题的印象与我实际遇到的问题不同。我需要更进一步它覆盖了我所有的窗口,因为我希望我的扩展提供的服务在所有这些窗口中都能工作。问题是当鼠标光标存在于桌面区域的“澄清”窗口中时…此时我的扩展没有更多的事件,因此无法在浏览器窗口中删除突出显示。我不知道w什么是面板,但我猜面板不能正好出现在鼠标光标停留的术语上方,可能它不包含HTML或执行我的扩展,而我的扩展需要它包含HTML并需要它执行我的扩展,因此我的扩展服务在所有windows my extension cr中提供吃澄清窗口,精致窗口和选项窗口。或者我不是你
理解你的信息,这并不奇怪,因为我确实是firefox扩展和javascript的一个通知。另外。。。虽然我很感激你的评论。。。我真的很好奇在我描述的那种情况下执行上下文是如何工作的。@honestann编译你的插件并将其发布到github或dropbox或其他地方。一个面板就是用来显示你鼠标所在的位置,并且有更好的控制,它甚至还带有一个箭头。安装这个你会在url栏中看到新图标,点击它你会看到漂亮的面板。你的问题非常长,要简洁,人们会帮你解决的。否则像这样的主题将无法回答。好的,我看到面板可以显示HTML。但是,我的扩展是否在面板和firefox主浏览器窗口中运行?如果不行,这个小组就不适合我了。至于发布我的代码,我正处于与它纠缠的中间,所以它现在不起作用。但过几天,也许我会这么做,再次吸引你的注意力。