打开弹出窗口的位置更改时收到通知

时间:2014-12-06 01:14:25

标签: javascript html oauth popup window.location

我在网站上实施外部OAuth身份验证。 点击按钮,点击我的facebook auth页面打开弹出窗口。 现在我需要知道何时完成身份验证以读取OAuth令牌并关闭弹出窗口。

click: function () {
   var popup = window.open(url, title, '<options>');
   popup.onload = function () {
       //1. if url contains token - finish OAuth authentication
       //2. close popup

       //but 'onload' doesn't work for external domains
   }
   return false;
},

当我尝试使用轮询技术进行访问时,我发现了以下安全错误:

  

Uncaught SecurityError:阻止具有原点的帧   &#34; https://some_app_host_not_the_same_as_following.com&#34;从访问原始框架   &#34; https://some_auth_host_which_works_with_facebook.com&#34 ;.协议,域名,   和端口必须匹配。

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:2)

如果您可以控制弹出窗口的内容,请在那里处理窗口的卸载事件,并通过opener属性通知原始窗口,首先检查开启器是否已关闭。请注意,这不会一直在Opera中使用。

window.onunload = function() {
    var win = window.opener;
    if (win.closed) {
        win.someFunctionToCallWhenPopUpCloses();
    }
};

由于卸载事件将在用户导航离开弹出窗口中的页面而不是窗口关闭时触发,因此您应检查弹出窗口是否已在someFunctionToCallWhenPopUpCloses中实际关闭:

var popUp = window.open("popup.html", "thePopUp", "");
function someFunctionToCallWhenPopUpCloses() {
    window.setTimeout(function() {
        if (popUp.closed) {
            alert("Pop-up definitely closed");
        }
    }, 1);
}

如果您无法控制弹出窗口的内容,或者您​​的某个目标浏览器不支持卸载事件,那么您将在主要内容中简化为某种轮询解决方案窗口。调整间隔以适应。

var win = window.open("popup.html", "thePopUp", "");
var pollTimer = window.setInterval(function() {
    if (win.closed !== false) { // !== is required for compatibility with Opera
        window.clearInterval(pollTimer);
        someFunctionToCallWhenPopUpCloses();
    }
}, 200);