Javascript:来自父窗口的跨域window.close事件

时间:2012-03-16 11:39:49

标签: javascript javascript-events cross-domain

例如我在domain1上:

a.click(function(){
  window.win=window.open(domain2,'name');
});

现在我在domain2上,我正在关闭它。 window.win如何知道用户关闭了该窗口?是否有通过间隔检查的事件或财产?

3 个答案:

答案 0 :(得分:6)

有一项属性不属于任何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的浏览器兼容。还有其他(偷偷摸摸的)方法可以在旧的浏览器上进行跨域通信,但我想这是另一个故事。

答案 1 :(得分:2)

您可以使用窗口关闭属性上的间隔检查来检查跨域是否已关闭。

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
    ...
}

答案 2 :(得分:0)

我正在处理从domain2打开domain1窗口的类似问题。我需要检查窗口何时关闭。我试过以下: -

  1. 我使用了window.onunload事件,由于Same Origin Policy而无效,并显示以下错误

    错误:尝试在已清除的作用域上运行compile-and-go脚本 源文件:chrome://firebug/content/net/httpLib.js

    错误:尝试在已清除的作用域上运行compile-and-go脚本 源文件:chrome://firebug/content/firefox/tabWatcher.js

  2. 但我维护了一系列Window对象并应用了“Window.closed”属性,即使在跨域中也能正常工作。:)

  3. 您也可以尝试postMessage APICORS