我正在网站上实施外部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;
},
当我尝试使用轮询技术进行访问时,我在提示以下安全错误:
未捕获的SecurityError:被阻止与原籍“帧https://some_app_host_not_the_same_as_following.com从访问与原点”一个帧“ https://some_auth_host_which_works_with_facebook.com ”。协议,域和端口必须匹配。
我怎样才能做到这一点?
如果您可以控制弹出窗口的内容,请在此处处理窗口的卸载事件,并通过opener属性通知原始窗口,首先检查打开器是否已关闭。请注意,这在Opera中并不总是有效。
window.onunload = function() {
var win = window.opener;
if (win.closed) {
win.someFunctionToCallWhenPopUpCloses();
}
};
由于每当用户离开弹出窗口中的页面而不仅仅是在关闭窗口时,都会触发unload事件,因此您应该在someFunctionToCallWhenPopUpCloses中检查弹出窗口是否已真正关闭:
var popUp = window.open("popup.html", "thePopUp", "");
function someFunctionToCallWhenPopUpCloses() {
window.setTimeout(function() {
if (popUp.closed) {
alert("Pop-up definitely closed");
}
}, 1);
}
如果您无法控制弹出窗口的内容,或者您的目标浏览器之一不支持unload事件,则可以在主窗口中使用某种轮询解决方案。调整间隔以适合。
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);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句