如前所述,同源策略会阻止 Javascript 检测此类事件。但是有一个非常简单的解决方案可以让您检测到此类窗口的关闭。
这是JS代码:
var openDialog = function(uri, name, options, closeCallback) {
var win = window.open(uri, name, options);
var interval = window.setInterval(function() {
try {
if (win == null || win.closed) {
window.clearInterval(interval);
closeCallback(win);
}
}
catch (e) {
}
}, 1000);
return win;
};
它的作用:它使用提供的参数创建新窗口,然后以 1s 的间隔设置检查器功能。然后该函数检查窗口对象是否存在并将其关闭属性设置为 false。如果其中任何一个不正确,这意味着窗口(可能)已关闭,我们应该触发“closeCallback 函数”回调。
此功能应适用于所有现代浏览器。前段时间 Opera 在从其他域的窗口检查属性时导致错误 - 因此 try..catch 块。但是我现在已经对其进行了测试,它似乎工作得很好。
我们使用这种技术为那些不通过 SDK 支持的网站创建了“facebook 风格”的登录弹出窗口(ehem...Twitter...ehem)。这需要一些额外的工作——我们无法从 Twitter 本身获得任何消息,但 Oauth 将我们重定向回我们的域,然后我们能够将一些数据放入可从打开器访问的弹出窗口对象中。然后在关闭回调函数中,我们解析这些数据并呈现实际结果。
此方法的一个缺点是在窗口关闭后调用回调。好吧,这是我能够通过跨域策略实现的最佳效果。