0

我正在尝试关闭此页面并使用代码刷新父页面:

window.opener.windowClosing();
self.close();

我收到此错误:

未捕获的 DOMException:阻止具有源“aaa.bbb.com”的框架访问跨域框架。在 aaa.bbb.com/xxx

即使两个网址都在同一个域中,它也会发生。我尝试使用“document.domain”检查域,我得到以下域名:

aaa.bbb.com - bbb.com

aaa.bbb.com/xxx - aaa.bbb.com

在这种情况下,aaa.bbb.com/xxx 是一个回调 url,它是从第三方集成调用以提供授权代码。此回调 url 显示子域,但父页面未显示。

我认为从第三方网站调用的 url 可能是问题所在。但是后来我使用 window.open 打开了这个回调 url,并且在关闭它时得到了相同的 document.domain 值和相同的异常。

4

1 回答 1

0

您可以尝试在两个页面上显式设置 document.domain 以使它们匹配。

document.domain = 'aaa.bbb.com';

或者你可以使用 window.postMessage()

父文件:

window.addEventListener("message", receiveMessage, false);

function receiveMessage(event) {
  if (event.origin.indexOf('bbb.com') < 0 {
    return;
  } else if (event.data == 'closing'){
    windowClosing()
  }
}

子文档:

window.opener.postMessage('closing', '*');
self.close();

如果子窗口实际上是一个框架或 iframe,而不是一个单独的窗口,那么您将使用:

window.parent.postMessage('closing', '*');
self.close();

无论哪种情况,您都需要确保两个窗口/框架的协议 (http/https) 和端口也相同。

于 2019-04-10T21:46:38.457 回答