为什么我的firefox扩展javascript无法访问opener窗口而不能看到window.name

时间:2013-12-09 18:43:14

标签: javascript debugging firefox firefox-addon

我正在编写一个javascript扩展程序并遇到一些我无法弄清楚的问题。

我的扩展非常简单,它不会向firefox浏览器添加任何GUI元素。它在Firefox浏览器中加载任何文档时看到鼠标移动的方式,当鼠标在文本节点中的“术语”(单词,短语,首字母缩略词)上暂停时,它会创建并显示一个小的无边框弹出窗口通过调用:

看起来类似于术语上方的工具提示
var cw = window.open("chrome://meanings/content/clarify.html", "clarify", attr);

当我阅读文档时,cw.name应该“澄清”(来自第二个参数)。当我用以下内容读回名称时,它确实包含字符串“clarify”:

var cwname = cw.name;  // variable cwname does contain "clarify"

但是,运行测试表明当扩展实例中的代码为:

var myname0 = window.name;
var myname1 = window.top.name;
var myname2 = window.document.defaultView.name;
var myname3 = window.document.defaultView.top.name;

......这些变量都不包含窗口名称 - 或任何其他字符串值。

我不明白。我还尝试在window.open()执行后添加以下行:

cw.name = "clarify";
cw.content.name = "clarify";

这不会改变任何事情。可以使用如下代码读取这些属性,并报告刚刚设置的值(对于刚设置它们的扩展代码):

var test_cwname0 = cw.name;
var test_cwname1 = cw.content.name;

代码将这些变量打印到错误和浏览器控制台,这就是我所知道的。


另一个类似且可能相关的问题。 window.opener属性也不起作用 - 该变量始终为null,这显然是错误的,因为这些窗口是由window.open()创建的。

BTW,调用函数来移动由window.open()创建的窗口,cw.moveTo()正常工作,因此两个窗口之间存在一定程度的连接。

有些奇怪的事情正在发生,我不明白。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

不幸的是,window.open方法将其第二个参数分配给新窗口的属性 - 根据mdn documentation for .open(),第二个参数仅用作名称您可以在锚点target属性中使用它们,以便在新窗口中打开它们的链接。该方法返回的引用是您可以在js中使用的新窗口的唯一“链接”。

window.opener属性应该仍然有效,无论如何。你必须要小心,不过有关同域安全限制和诸如此类的东西(在规格页面中描述)。因此(从您的原始脚本)cw.opener应返回当前窗口对象。从新窗口中的脚本window.opener.cw将引用它自己的窗口对象。

要控制窗口何时关闭,完全有可能让开启窗口控制所有这一切 - 它毕竟具有对任何子窗口的引用,并且可以用cw.close()等关闭它们。