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

gol*_*007 9 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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

Frame3.html

<!DOCTYPE html>
<html>

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

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

</html>
Run Code Online (Sandbox Code Playgroud)

Frame4.html

<!DOCTYPE html>
<html>

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

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

</html>
Run Code Online (Sandbox Code Playgroud)

topFrame.js

try {
  var tmpParent = parent;
  var topFrame = tmpParent.topFrame;
  while (topFrame === undefined) {
    tmpParent = tmpParent.parent;
    topFrame = tmpParent.topFrame;
  }
} catch (e) {
  alert(e);
}
Run Code Online (Sandbox Code Playgroud)

小智 1

好吧,我知道我在这里冒着风险试图猜测 IE 想要告诉你什么,但我认为使用这种类型的通信违背了 iframe 的意图。

如果您希望在子框架与 parnet 框架之间进行通信,我建议使用 postMessages 代替。我认为(我确实说过认为)您的脚本被 XSS - 跨站点脚本阻止。因此,如果您希望在父框架和子框架之间或以相反的方式传达一些信息,我建议您看看postMessges