【问题标题】:Javascript - accessing global vars from a child windowJavascript - 从子窗口访问全局变量
【发布时间】:2013-02-17 03:59:54
【问题描述】:

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

    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(可能还有更新的 Safari 中?),当它发出“未定义”警报时,它会失败。

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


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

【问题讨论】:

  • 你是在服务器上测试这个,还是使用file:// URLs?

标签: javascript


【解决方案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 问题。

【讨论】:

  • loganfsmyth 和 lmortenson
  • loganfsmyth 和@lmortenson,谢谢!是的,我正在做 file:// 我刚刚将它上传到我的服务器,它在那里工作正常。此外,在父窗口中,我仍然可以对子窗口执行功能。看起来双向的一切都会在那里正常工作。但是,这是一个本地应用程序 - 不涉及服务器。当 S.O. 时,将在 AM 中提供更长的答案。允许我回答我自己的问题。
【解决方案2】:

谢谢大家,

是的,我正在做 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 只是默默地在窗口之间传递变量失败,我认为它没有给你任何选择。哇,微软确实做了正确的事情!

感谢您的帮助。 戴夫

【讨论】:

    猜你喜欢
    • 2022-01-25
    • 2016-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-14
    • 2014-01-17
    • 2018-10-28
    • 1970-01-01
    相关资源
    最近更新 更多