1

我想将一个函数绑定到beforeunloadJavascript 中的子窗口事件。我有以下代码:

newWind = window.open(settings.url, "Dialog", "width=" + settings.width + ",height=" + settings.height + ",resizable=" + settings.resizable + ",scrollbars=" + true);

newWind.onunload = function() { alert('test'); }

在 Firefox 中运行良好,但在 IE7 中失败。谁能看到我做错了什么?

4

2 回答 2

4
newWind.onunload = function() { alert('test'); }

出于某种原因,IE 不允许您将一个窗口上下文中的函数分配给另一个窗口的 on[before]unload。您可以将外部函数分配给其他事件处理程序,包括newWind.document.body.onunload,但这不是一个好主意。

首先,因为 IE 的垃圾收集是基于窗口的,所以如果您关闭或导航打开器窗口,弹出窗口将尝试执行一个死函数,或在作用域内包含死变量的函数,从而导致奇怪的 JavaScript 错误。

其次,因为您不知道打开器何时加载了弹出文档以能够设置处理程序。在open调用之后,弹出式文档可能根本没有开始加载,在这种情况下,您不能安全地在其上设置任何事件处理程序。因此,在设置 onunload 处理程序之前您需要一个短暂的延迟,并且用户可能会在这段时间内关闭窗口。而开场的人也不知道耽误了多久;取而代之的是,子对话框必须回叫父对话框以告知它已准备好。最好让子弹出窗口负责接收自己的事件并调用开启者让它知道它们。

跨窗口脚本有无穷无尽的陷阱。尽量避免它。因为对话框总是使用页内元素,这比弹出窗口更可靠且更不烦人。

于 2009-11-13T12:14:17.363 回答
1

我正在使用以下技巧来找出子窗口何时关闭:

function checkChildWindow(win, onclose) {
    var w = win;
    var cb = onclose;
    var t = setTimeout(function() { checkChildWindow(w, cb); }, 500);
    var closing = false;
    try {
        if (win.closed || win.top == null) //happens when window is closed in FF/Chrome/Safari
        closing = true;        
    } catch (e) { //happens when window is closed in IE        
        closing = true;
    }
    if (closing) {
        clearTimeout(t);
        onclose();
    }
}

function openWindow(url) {  
    ...
    var wnd = window.open(url, "window_name", "[...flags...]");
    checkChildWindow(wnd, function() { alert('child was closed!'); } );
    ...
}
于 2011-01-10T14:43:02.327 回答