【问题标题】:Can the parent window be notified when a child window closes? (on a diff domain)子窗口关闭时可以通知父窗口吗? (在差异域上)
【发布时间】:2009-04-23 13:41:44
【问题描述】:

子窗口关闭时能否通知父窗口? (在不同的域上?)

试图绕过 window.opener 在不同域上无法正常工作。

至少可以在子窗口关闭时以某种方式通知我吗?

【问题讨论】:

    标签: javascript events browser


    【解决方案1】:

    您无法直接收到关闭窗口的通知,但您可以通过检查window.open() 返回的窗口对象引用上的closed 属性来确定子窗口何时关闭。

    这是一个示例,它将在通过轮询closed 属性关闭子窗口后的 5 秒内显示警报:

    var win = open('http://www.google.com');
    var intervalId = setInterval(function() {
            if (win.closed) {
                clearInterval(intervalId);
                alert('Window closed! Hoorah!');
            }
        }, 5000);
    

    【讨论】:

    • 不能直接通知你,因为子窗口在一个单独的域中,对吧?
    • 这是因为没有合适的浏览器事件可以用来解决窗口关闭时的问题。
    • 一个建议:如果让我们说您创建一个带有您控制的页面(相同域)的弹出窗口,并从弹出窗口触发重定向到外部域,closed 属性将不可用了。您可能需要检查弹出窗口的parent 属性
    • @dickwan:不,closed 仍然可用,因为该窗口属性允许跨域访问。见developer.mozilla.org/en-US/docs/Web/Security/…
    【解决方案2】:

    两段代码的更好解决方案 1/ 在弹出窗口中:

    $(window).bind('unload',
      function(){
        window.opener.PopupUnload(window)
      })
    

    2/ 在父级(主窗口)中:

    function PopupUnload(wnd){
     setTimeout(function(){ // setTimeout is for IE
       if(wnd.closed)
         alert('You just killed me...')
      },10)
    }
    

    使用此代码,不会永远调用任何函数(使用 setInterval()),并且您可以区分关闭和刷新弹出窗口(发布/获取)

    (在 IE8 和 FF3 中测试)

    【讨论】:

    • 如果由于跨站点脚本限制从不同域加载父窗口和弹出窗口,您的window.opener.PopupUnload 调用将失败。
    猜你喜欢
    • 1970-01-01
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    相关资源
    最近更新 更多