例如,我在domain1:上
a.click(function(){
window.win=window.open(domain2,'name');
});
现在我在domain2上,正在关闭它。window.win
如何知道用户关闭了那个窗口?是否有任何事件或属性需要通过间隔进行检查?
有一个属性不属于任何W3C规范。它被称为closed
,可以像一样访问
if( window.win.closed ) {
// window was closed
}
我不确定该属性的跨浏览器兼容性。我也不确定这在跨原点域上是如何表现的。但如果你尝试一下,请让我和这个社区的其他人知道。
另一种选择是您自己处理通知。也就是说,您正在收听弹出窗口中的onbeforeunload
。当事件触发时,可以使用HTML5的postMessage
方法在跨域窗口之间进行通信。例如:
主窗口:
window.addEventListener('message', function(e) {
if( e.origin === 'http://www.popupdomain.com' ) {
if( e.data === 'closed' ) {
alert('popup window was closed');
}
}
}, false);
域2:
window.onbeforeunload = function() {
window.opener.postMessage('closed', 'http://www.popupdomain.com');
};
这个解决方案唯一需要注意的是,它只与支持基本HTML5的浏览器兼容。还有其他(偷偷摸摸的)方法可以在旧的浏览器上进行跨域通信,但我想那是另一回事了。
您可以通过对windows closed属性使用间隔检查来检查跨域是否已关闭。
var url = "http://stackoverflow.com";
var width = 500;
var height = 500;
var closeCheckInterval = 500; //Check every 500 ms.
var popup = window.open(url, "_new", 'width=' + width + ', height=' + height);
popup.focus();
var closeCheck = setInterval(function () {
try {
(popup == null || popup.closed) && (clearInterval(closeCheck), onWindowClosed());
} catch (ex) { }
}, closeCheckInterval);
var onWindowClosed = function () {
...
// Stuff to do after window has closed
...
}
我正在处理类似的问题,即从domain2打开domain1的窗口。当窗户关上的时候,我需要检查一下。我尝试了以下内容:-
-
我使用了window.onunload事件,由于同源策略,它不起作用,并显示了以下错误
错误:试图在已清除的作用域上运行编译并执行脚本源文件:chrome://firebug/content/net/httpLib.js
错误:试图在已清除的作用域上运行编译并执行脚本源文件:chrome://firebug/content/firefox/tabWatcher.js
-
但我维护了一个Window对象数组,并应用了"Window.closed"属性,即使在跨域中也能工作:)
-
您也可以尝试postMessage API或CORS