【问题标题】:Cross-domain window.close event from parent window来自父窗口的跨域 window.close 事件
【发布时间】:2021-03-31 15:14:38
【问题描述】:

例如我在 domain1:

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

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

【问题讨论】:

标签: javascript dom-events cross-domain


【解决方案1】:

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

【讨论】:

  • window.open 返回的 DOM 对象为空。我希望有那个封闭的财产。还有其他解决方案吗?
  • 猜猜我得再听听这个故事了。 :)
  • @Beck:那是因为它不起作用或者你不能依赖 html5 ?
  • 我不能,我也在为IE7开发。
  • 这是一颗宝石!在 Chrome 31 上完美运行。是的,@Somebody,如果你 console.log() 关闭后从 window.open() 返回的窗口,你会得到一个空的窗口实例。不过试试console.log(window.win.closed)。它为我返回了false。我很想看看它还能在哪里工作(尤其是 IE)。
【解决方案2】:

您可以通过对 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
    ...
}

【讨论】:

    【解决方案3】:

    我正在解决从 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-05
      • 1970-01-01
      • 2013-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多