我正在按照此问题How do I get around window.opener cross-domain security的已接受答案来解决我的问题。代码工作得很好,但在一个用例中失败,而不是弹出窗口url从一些其他域更改到您自己的域,它只是重定向到自己的域,就像有时候如果您尝试在Facebook上验证第三个paty应用程序或者其他一些社交网络,它只是自己重定向,就像你之前已经过身份验证一样。我们如何在以下代码中处理这种情况:
<!DOCTYPE html>
<head>
<title>main</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<script>
window.addEventListener("message", function(ev) {
if (ev.data.message === "deliverResult") {
alert("result: " + ev.data.result);
ev.source.close();
}
});
function Go() {
var child = window.open("child.html", "_blank", "height=200,width=200");
var leftDomain = false;
var interval = setInterval(function() {
try {
if (child.document.domain === document.domain)
{
if (leftDomain && child.document.readyState === "complete")
{
// we're here when the child window returned to our domain
clearInterval(interval);
alert("returned: " + child.document.URL);
child.postMessage({ message: "requestResult" }, "*");
}
}
else {
// this code should never be reached,
// as the x-site security check throws
// but just in case
leftDomain = true;
}
}
catch(e) {
// we're here when the child window has been navigated away or closed
if (child.closed) {
clearInterval(interval);
alert("closed");
return;
}
// navigated to another domain
leftDomain = true;
}
}, 500);
}
</script>
</head>
<body>
<button onclick="Go()">Go</button>
</body>
&#13;
答案 0 :(得分:1)
考虑到您的意见,我认为这不是一个很好的通用解决方案,与您链接的答案不同。
尝试解决此问题的愚蠢尝试可能是使用计时器并轮询值{{1}},用于子窗口及其所有子帧。
如果整个结构已经稳定了相当长的时间间隔(即,没有HTML的变化而没有抛出异常),则可能表明所有内部导航或XHR调用已经完成,并且可以关上窗户。