2013-02-17 40 views
1

访问全局变量当一个窗口将打开使用Javascript - 从一个子窗口

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

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

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

这工作得很好(孩子警报“ someValue“)在Firefox 18,IE6,IE7,Opera 11.52,Safari 5.1.1但是它在Chrome 24.0(也许更新的Safaris呢?)中失败了,当它警告”未定义“时。

哎呀!任何人都会遇到这种情况任何解决方法?


在过去,我已经能够访问全局变量或者在其他窗口中执行函数。我讨厌看到这个功能消失。 戴夫

+0

您是在服务器上还是在'file:// URL中测试这个? – loganfsmyth 2013-02-17 04:11:47

回答

1

它仍然似乎为我工作。在这个网站上,在Chrome试试这个自己这个页面上的控制台:

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

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

console.log(window.opener.test) 

您会看到“hello”。

这就是说,我已经注意到,Chrome是最严格的,当涉及到跨域访问特别本地开发站点时(如果你只是直接通过与文件的文件系统访问HTML文件://,例如)。我喜欢在Chrome中开发,如果我在本地开发,则需要运行某种Web服务器来为页面提供服务,而Firefox则乐于让我直接通过文件系统访问它们,而不会抱怨XSS问题。

+0

loganfsmyth和lmortenson – 2013-02-17 04:35:21

+0

loganfsmyth和@lmortenson, 谢谢!是的,我正在做的文件:/ /我只是上传到我的服务器,它在那里工作正常。另外,在父窗口中,我仍然可以在子项上执行一个函数。看起来像双向一切都会在那里很好地工作。 但是,这是一个本地应用程序 - 不涉及服务器。 S.O.会在上午提供更长的答案。允许我回答我自己的问题。 – 2013-02-17 05:26:25

0

谢谢你们,

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

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

所以没有涉及服务器,我真的只需要支持IE浏览器,但我试图保持它跨浏览器,以便我的插件将在未来的Mac版本的BeerSmith2中使用。我在Firefox中开发,然后在IE6中工作(如果它在IE6上工作,它可以在任何情况下工作),然后在IE-later/Opera/Safari/Chrome中进行最后的调整,这通常只会有小的困难。

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

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

感谢您的帮助。 Dave