【发布时间】:2021-03-31 15:14:38
【问题描述】:
例如我在 domain1:
a.click(function(){
window.win=window.open(domain2,'name');
});
现在我在 domain2 上,我正在关闭它。 window.win 如何知道用户关闭了该窗口?是否有任何事件或属性需要通过间隔检查?
【问题讨论】:
标签: javascript dom-events cross-domain
例如我在 domain1:
a.click(function(){
window.win=window.open(domain2,'name');
});
现在我在 domain2 上,我正在关闭它。 window.win 如何知道用户关闭了该窗口?是否有任何事件或属性需要通过间隔检查?
【问题讨论】:
标签: javascript dom-events cross-domain
有一个属性不属于任何 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 的浏览器兼容。还有其他(偷偷摸摸的)方法可以在老式浏览器上进行跨域通信,但我想那是另一回事了。
【讨论】:
console.log() 关闭后从 window.open() 返回的窗口,你会得到一个空的窗口实例。不过试试console.log(window.win.closed)。它为我返回了false。我很想看看它还能在哪里工作(尤其是 IE)。
您可以通过对 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事件,因为Same Origin Policy没有工作,并显示以下错误
错误:尝试在已清除的范围内运行 compile-and-go 脚本 源文件:chrome://firebug/content/net/httpLib.js
错误:尝试在已清除的范围内运行 compile-and-go 脚本 源文件:chrome://firebug/content/firefox/tabWatcher.js
但我维护了一个 Window 对象数组并应用了 "Window.closed" 属性,它甚至可以在跨域中使用。 :)
你也可以试试postMessage API或CORS
【讨论】: