2

当一个窗口打开一个子窗口时

    var someVar = "someValue";
    newWin = window.open("somepage.html","","");

子窗口可以访问父窗口的全局变量

    var x = window.opener.someVar;
    alert(x);

这在 Firefox 18、IE6、IE7、Opera 11.52、Safari 5.1.1 中工作正常(子警报“someValue”)但在 Chrome 24.0(也许更新的 Safaris 也是如此?)中失败,当它发出“未定义”警报时。

哎呀!还有人经历过这个吗?任何解决方法?


过去,我可以在任一方向访问全局变量,也可以在另一个窗口中执行函数。我不想看到这个功能消失。戴夫

4

2 回答 2

2

它似乎仍然对我有用。在此站点上,在 Chrome 控制台的此页面上亲自尝试:

 this.test = "hello"
 window.open(window.location.href) //opens the same page

(您必须确保允许弹出窗口,因此您可能需要执行两次)。然后,在弹出窗口的控制台中:

 console.log(window.opener.test)

你会看到“你好”。

也就是说,我注意到 Chrome 在跨域访问方面是最严格的,尤其是在本地开发站点时(例如,如果您只是通过文件系统直接使用 file:// 访问 html 文件)。我喜欢在 Chrome 中开发,如果我在本地开发,我需要运行某种 Web 服务器来提供页面,而 Firefox 会很乐意让我直接通过文件系统访问它们并且不会抱怨 XSS 问题。

于 2013-02-17T04:11:39.147 回答
0

多谢你们,

是的,我正在做 file:// 我刚刚将它上传到我的服务器,它在那里工作正常。此外,在父窗口中,我仍然可以对子窗口执行功能。看起来双向的一切都可以在服务器上正常工作。

这是我的场景。我正在为 Windows 程序 BeerSmith2(Beer Homebrewing 程序)开发一个附加组件。此 Windows 应用程序使用小型“强制”浏览器(您计算机上的 IE)来显示来自 Windows 应用程序的“报告”。我的插件需要将应用程序的小型俘虏浏览器拆分为全屏浏览器(相同的 IE),并将大量变量从俘虏传递到全屏。

所以不涉及服务器,我真的只需要支持 IE,但我试图让它跨浏览器,以便我的插件将来也可以与 Mac 版本的 BeerSmith2 一起使用。我在 Firefox 中开发,然后让它在 IE6 上运行(如果它在 IE6 上运行,它可以在任何东西上运行),然后在 IE-later/Opera/Safari/Chrome 中进行最后的调整,这通常只有很小的困难。

想象一下当整个程序(几千行 JS 代码)在最新的 Chrome 上完全失败时我的恐惧。由于没有服务器,我不能做Ajax,我想不出任何其他方法来做这件事。所以我想我被困住了。我希望萨法菲不要效仿。

IE 有一个关于在 file://'s 中运行 JS 的令人讨厌的弹出警告,但您可以将其关闭。Chrome 只是默默地在窗口之间传递变量失败,我认为它没有给你任何选择。哇,微软确实做了正确的事情!

谢谢你的帮助。戴夫

于 2013-02-17T14:11:06.067 回答