【问题标题】:window.opener is undefined when the url is opened in same window在同一窗口中打开 url 时,window.opener 未定义
【发布时间】:2016-06-04 06:15:28
【问题描述】:

在我们的 Angulajs 控制器中,我们试图在同一个窗口中打开一个外部 URL(这是在同一个浏览器中打开 URL 的要求,而不是创建一个弹出窗口),使用以下行:

window.open("www.youraddress.com","_self")

当我们尝试获取父窗口的实例(访问控制器方法)时,我们总是得到window.openerundefined。你能告诉我可能是什么原因吗?

如果我们使用window.location.href="www.youraddress.com",可以看到相同的行为

请让我知道我们在这里缺少什么?

【问题讨论】:

  • 我相信这是故意的。如果您在新选项卡或窗口中打开链接,您的window.opener 上只有一个值。
  • 如果窗口位于不同的域中,您将无法引用打开器。如果该窗口替换了同一个窗口,那么既然您刚刚销毁了该页面,那么有什么可参考的?它就像一块白板,你把它擦掉,然后用新的内容替换它。
  • @epascarello:但更重要的是:您已将白板取出并扔进垃圾箱,并在同一个地方用 白板替换它。 :-)

标签: javascript html angularjs javascript-objects


【解决方案1】:

如果您在同一个窗口中打开页面,旧的窗口对象将被销毁。 window.opener 不再有可以引用的对象。如果窗口仍然存在,您只能继续引用它。即使可以,您也会被拒绝访问其内容,因为您正在将外部 URL 加载到其中,因此同源策略开始发挥作用。即使没有 SOP,之前在那个窗口中的所有内容(包括它曾经拥有的 JavaScript 环境)也会被破坏。

您打算继续使用的任何代码或数据都需要在您尝试使用window.opener 的窗口中(或在另一个未被替换的相关窗口中)。

【讨论】:

  • 好的,这对我来说很有意义。但是,在这种情况下,我如何才能访问控制器方法?我什至准备使用window.location.href,但没有找到调用控制器方法的方法。
  • @SKJ:你不能,那个窗口里的东西都不存在了。您需要在您尝试使用window.opener 的窗口中放置您打算继续使用的任何内容。
猜你喜欢
  • 2011-08-19
  • 2021-05-11
  • 1970-01-01
  • 1970-01-01
  • 2022-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多