2

我正在尝试这样做:

$(function() {
    var parent = window.opener;

    $(window).bind('unload', function() {
        parent.setTimeout(function() {
            parent.console.log('Fired!');
        }, 200);
    }
});

上面的示例在 FF、Chrome 等中运行良好,但不适用于 IE8。在后者中, setTimeout() 中指定的回调似乎永远不会被触发。

基本原理是,当弹出窗口关闭时,我想在父窗口(window.opener)中执行一些代码。我希望弹出窗口对此负责,而不是相反。

只是为了表明这个概念有效:

$(function() {
    var parent = window.opener;

    $(window).bind('unload', function() {
        parent.console.log('Fired!');
    }
});

在绑定到卸载的回调中立即调用 console.log(如上例所示)似乎在所有浏览器中都有效(此处不针对 IE6),但是一旦我将 setTimeout() 添加到混合中,它就会中断。

可能吗?是范围问题吗?

4

1 回答 1

1

在 IE 中,函数绑定到它们的所有者窗口。它们可以从另一个窗口调用,但是当一个窗口被卸载时,它的所有函数都会死掉。如果您尝试在 onunload 之后显式调用一个,您将收到“调用的对象已与其客户端断开连接”错误。

所以在孩子 onunload 你应该立即给父母打电话。如果父母需要延迟,它必须自己提供。

(您可能还应该检查父窗口 is not null,has not been closed,并将访问尝试包装在 atry中,这样如果父窗口已关闭或导航,您就不会收到错误消息。)

于 2010-08-10T09:59:15.367 回答