1

我想unload在父窗口打开的子窗口上执行 javascript。我尝试了下面的代码,它没有调用该函数。

 childWindow = window.open(url, 'MyWindow', GetWindowOptions(1020, 600), true);
 childWindow.onunload = function () { test(); };

我写的测试函数是:

function test() {
alert(1);
}

我正在使用 IE8 浏览器。

4

2 回答 2

7

替换attachEvent而不是onunload设置器以添加事件。我已经在 IE6 - 8 中对其进行了测试,它运行良好。确保您还addEventListener用于 IE9+ 和其他浏览器:

var unloadFunc = function () { test(); };
if (childWindow) { // null if a pop-up blocker does not create the window
    if (childWindow.addEventListener) {
        childWindow.addEventListener('unload', unloadFunc, false);
    } else {
        childWindow.attachEvent('onunload', unloadFunc);
    }
}

显然,如果 URL 来自不同的域,这将不起作用。
如果要在关闭来自不同来源的窗口时执行函数,请使用setIntervalsetTimeout轮询布尔属性的值childWindow.closed。当窗户关闭时,这是真的。

例如:

if (childWindow) { // null if a pop-up blocker does not create the window
    setTimeout(function checkState() {
        if (childWindow.closed) {
            // onunload Logic here.
        } else {
            setTimeout(checkState, 250);
        }
    }, 250);
}

注意:其他答案建议使用该beforeunload事件。请记住,规范允许实现在此事件期间忽略confirmalert和调用。promptshowModalDialog

于 2012-08-03T12:21:59.410 回答
0

您可以尝试使用onbeforeunload. 我在 Intranet 应用程序的打印报告上使用了类似的东西,该应用程序执行 AJAX 调用以标记它已打印:

if (window.onbeforeunload) {
    window.onbeforeunload = function() { didPrint(someData); };
} else {
    window.onunload = function() { didPrint(someData); };
}
于 2012-08-03T12:15:49.653 回答