Javascript - 从子窗口访问全局变量

时间:2013-02-17 03:59:54

标签: javascript

当窗口打开带

的子窗口时
    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?)中失败了。

糟糕!还有其他人经历过吗?任何解决方法?


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

2 个答案:

答案 0 :(得分:1)

它似乎仍然适合我。在此网站上,请在Chrome控制台中的此页面上自行尝试:

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

(你必须确保允许弹出窗口,所以你可能需要做两次)。然后,在弹出窗口的控制台中:

 console.log(window.opener.test)

你会看到“你好”。

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

答案 1 :(得分:0)

谢谢你们,

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

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

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

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

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

感谢您的帮助。 戴夫