在卸载回调中从窗口中将setTimeout()连接到window.opener

时间:2010-08-10 08:11:54

标签: javascript jquery settimeout onunload

我正在尝试这样做:

$(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()添加到混合中它就会中断。

有可能吗?这是范围问题吗?

1 个答案:

答案 0 :(得分:1)

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

所以在孩子onunload中你应该立即回叫父母。如果父母需要延迟,则必须自己提供。

(您可能还应该检查父项不是null,还没有closed,并将访问尝试包装在try中,这样您就不会父窗口已关闭或导航时出错。)