当打开的弹出窗口的位置发生变化时收到通知

问题描述:

我在我的网站上实施了外部OAuth身份验证。 按钮点击我打开弹出与我们的Facebook的授权页面。 现在我需要知道何时完成认证以读取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; 
}, 

当我尝试使用轮询技术,我hetting以下安全错误访问:

Uncaught SecurityError: Blocked a frame with origin " https://some_app_host_not_the_same_as_following.com " from accessing a frame with origin " https://some_auth_host_which_works_with_facebook.com ". Protocols, domains, and ports must match.

我怎样才能做到这一点?

+0

可能重复(http://*.com/questions/3291712/is-it-possible-to- open-a-popup-javascript-and-then-detect-when-the-user-clo) – rfornal 2014-12-06 02:33:44

如果您可以控制弹出窗口的内容,请处理窗口的卸载事件,并通过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); 
的[是否有可能打开一个弹出用JavaScript,然后当用户关闭它检测?]
+0

我已经实现了轮询解决方案,不幸的是无法读取打开的弹出窗口的位置属性。访问被拒绝错误:/ – 2014-12-06 03:23:15