访问父iframe时,为什么我在Microsoft Edge中获得“权限被拒绝”

时间:2015-12-03 13:31:28

标签: javascript iframe parent microsoft-edge

在重新加载另一个iframe后调用特定iframe的函数时遇到一些问题。它适用于所有主流浏览器,但在Microsoft Edge上表现得有些奇怪。您将需要以下星座来获取错误。所有文件都在同一服务器上的同一目录中。我没有设置任何内容安全策略。

如果您加载Frame1.html,一切都会好的,您将收到“警告”消息。

但是如果你单击frame4.html上的“Click me”a-tag,将重新加载frame2.html,你将得到“权限被拒绝”错误,因为父对象(var tmpParent = parent;)是无法访问。如果再次单击a-tag,它将无任何错误地工作。

我认为这是一个Edge bug,因为所有其他浏览器都可以处理它,它只会在第一次点击时出现。

如果您使用父母的顶级内容,也会发生错误。

topFrame.js的代码用于查找我网站的最顶层框架。 我不能简单地使用top,因为它应该可以嵌入我的网站。

有人有线索吗?

非常感谢!

Frame1.html

<!DOCTYPE html>
<html>

<head>
  <title>Frame 1</title>
  <script type="text/javascript">
    var topFrame = this;

    function myAlert() {
      alert('alert');
    }
  </script>
</head>

<body>
  <iframe id="overallContentWrapper" name="mainFrame" src="frame2.html" frameborder="0"></iframe>
</body>

</html>

Frame2.html

<!DOCTYPE html>
<html>

<head>
  <title>Frame 2</title>
  <script src="topFrame.js" type="text/javascript"></script>
  <script type="text/javascript">
    window.addEventListener("load", function load(event) {
      window.removeEventListener("load", load, false);

      try {
        topFrame.myAlert();
      } catch (e) {
        alert(e);
      }
    }, false);
  </script>
</head>

<body>
  <iframe name="subFrame" src="frame3.html" frameborder="0"></iframe>
</body>

</html>

Frame3.html

<!DOCTYPE html>
<html>

<head>
  <title>Frame 3</title>
</head>

<body>
  <iframe name="subsubFrame" src="frame4.html" frameborder="0"></iframe>
</body>

</html>

Frame4.html

<!DOCTYPE html>
<html>

<head>
  <title>Frame 4</title>
</head>

<body>
  <a href="frame2.html" target="mainFrame">Click me</a>
</body>

</html>

topFrame.js

try {
  var tmpParent = parent;
  var topFrame = tmpParent.topFrame;
  while (topFrame === undefined) {
    tmpParent = tmpParent.parent;
    topFrame = tmpParent.topFrame;
  }
} catch (e) {
  alert(e);
}

1 个答案:

答案 0 :(得分:0)

嗯,我知道我把我的脖子放在线上试图猜测IE试图告诉你什么,但我会认为使用这种类型的通信是违背iframes的目的。

如果您希望在子帧与parnet帧之间进行通信,我建议使用postMessages。我认为(我确实认为)你的脚本被XSS阻止 - 跨站点脚本。因此,如果您希望在父框架和子框架之间传递一些信息,或者反过来,我建议您查看postMessges