如何关闭具有跨域url的身份验证弹出窗口?

时间:2015-10-09 13:00:19

标签: javascript popup cross-domain

我正在按照此问题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;
&#13;
&#13;

1 个答案:

答案 0 :(得分:1)

考虑到您的意见,我认为这不是一个很好的通用解决方案,与您链接的答案不同。

尝试解决此问题的愚蠢尝试可能是使用计时器并轮询值{{1}},用于子窗口及其所有子帧。

如果整个结构已经稳定了相当长的时间间隔(即,没有HTML的变化而没有抛出异常),则可能表明所有内部导航或XHR调用已经完成,并且可以关上窗户。