【问题标题】:Javascript window.opener in iframeiframe 中的 Javascript window.opener
【发布时间】:2015-10-07 20:37:04
【问题描述】:

我正在尝试使用弹出窗口脚本文件中的 window.opener 引用来访问弹出窗口的开启程序。

考虑 popup.html 中包含的以下脚本:

http://localhost/test/popup.html

<script>
    alert(window.opener.test_dom);
</script>

这在不涉及 iframe 时有效,我们将看到来自 popup.html 的警报消息:

http://localhost/test/base.html

 <html>
  ...
  <script> 
      var test_dom = 'test_dom';
      var popup = window.open("http://localhost/test/popup.html",...
  </script>
 </html>

当有 3 个文件时存在问题.. 一个包含 iframe 的容器页面,该页面从该 iframe 中启动弹出窗口。当弹出窗口出现时,这不会显示警报消息:

C:\TestContainer\container.html

 <html>
  ...
  <iframe src="http://localhost/test/base.html">
      <script> 
          var test_dom = 'test_dom';
          var popup = window.open("http://localhost/test/popup.html",...
      </script>

  <iframe>
 </html>

也许这是一个安全限制? AFAIK base.html 和 popup.html 在同一个域中,所以我认为没有理由这样做。是否有其他方法可以通过 popup.html 脚本中的其他 DOM 属性访问开启器?我已经坚持了一天了。

除了对 opener 的引用之外,其他一切似乎在所有脚本中都按预期工作。

使用 IE 11。

感谢任何帮助!

【问题讨论】:

    标签: javascript dom iframe popup


    【解决方案1】:

    iframe 没有window.opener。它有一个window.parent(嵌入 iframe 的窗口)。如果父窗口确实是顶级窗口,那么如果它是实际的弹出窗口,那么该窗口可能有一个window.opener

    您还没有展示您具体的 HTML 情况,但也许您希望 iframe 中的内容是这样的:

    window.parent.opener
    

    【讨论】:

    • 我修改了这个问题,以澄清访问父级到 iframe 不是问题,而是访问打开器的弹出窗口。在一种情况下它有效,另一种情况下它不起作用(在 iframe 中)。
    • @Lammy - 使用 URLS 访问本地文件系统时存在帧内安全限制。这些限制取决于浏览器,但如果它们是文件系统中的 URL,您通常无法访问您认为应该能够访问的内容。所以,这也可能是你问题的一部分。而且,当一帧是 http://locahost 而另一帧是 C:\TestContainer\container.html 时,您肯定无法跨越帧边界,因为从浏览器的角度来看,它们显然是不同的来源。
    • 但是,访问权限不在C:\TestContainer\container.htmlhttp ://localhost之间,而是在http ://localhost/test/popup.htmlhttp ://localhost/test/base.html之间。它也没有限制弹出窗口的发生,它只是限制了开启者是谁,我觉得这很奇怪。
    • @Lammy - 我明白你在说什么,但我猜如果你不使用 C:\TestContainer\container.html 来源,问题就会消失。
    • 我怀疑 IE 11 安全性中存在某种错误导致此问题(在设置开启器时使用父域,而不是真正的开启器)。我同意,我怀疑如果我的容器文件也在同一个域中,它会消失。我希望我知道一个解决方法..
    【解决方案2】:

    我想出了一个解决这个问题的方法。在我的情况下,弹出窗口非常简单,所以我所做的是将其 html 嵌入到基本页面的隐藏 div 中。然后,当需要弹出窗口时,我只是让窗口显示隐藏的 html 的内容。

    不幸的是,在弹出窗口中找到的按钮的事件处理在完成后不会自动设置,因此我必须在显示窗口后使用 addEventListener 手动设置它们(即,将“onclick”事件放入 html标签将不起作用)。

       var popup = window.open("", "_blank", "..", false);
       var popup_html = window.document.getElementById('hidden_popup_contents').innerHTML;
       popup.document.writeln(popup_html);
       popup.document.getElementById('popup_button').addEventListener('click', SomeFunction);
    

    【讨论】:

      猜你喜欢
      • 2013-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多