Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/405.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript window.onbeforeunload未在子窗口中激发_Javascript_Internet Explorer 7_Dom Events_Onbeforeunload - Fatal编程技术网

Javascript window.onbeforeunload未在子窗口中激发

Javascript window.onbeforeunload未在子窗口中激发,javascript,internet-explorer-7,dom-events,onbeforeunload,Javascript,Internet Explorer 7,Dom Events,Onbeforeunload,我想将一个函数绑定到Javascript中子窗口的beforeunload事件。 我有以下代码: newWind = window.open(settings.url, "Dialog", "width=" + settings.width + ",height=" + settings.height + ",resizable=" + settings.resizable + ",scrollbars=" + true); newWind.onunload = function() { al

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

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

newWind.onunload = function() { alert('test'); }
在Firefox中工作正常,但在IE7中失败。有人能看出我做错了什么吗

newWind.onunload = function() { alert('test'); }
由于某种原因,IE不允许您在[卸载之前]将函数从一个窗口上下文分配到另一个窗口的。您可以将外部函数分配给其他事件处理程序,包括newWind.document.body.onunload,但这不是一个好主意

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

第二个原因是,您无法从开场白中知道弹出文档何时加载到足以设置处理程序的程度。在open调用之后,弹出文档可能根本没有开始加载,在这种情况下,您无法安全地在其上设置任何事件处理程序。因此,在设置onunload处理程序之前需要一个短暂的延迟,用户可能会在这段时间内关闭窗口。开场白不知道要推迟多久;相反,子对话框必须回叫父对话框,告诉它准备好了。最好让子弹出窗口负责接收自己的事件,并给开场白打电话让其知道这些事件

跨窗口脚本有无数的陷阱。尽量避免。因为对话框总是在页面元素中使用,这比窗口弹出窗口更可靠,也不那么烦人

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

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

第二个原因是,您无法从开场白中知道弹出文档何时加载到足以设置处理程序的程度。在open调用之后,弹出文档可能根本没有开始加载,在这种情况下,您无法安全地在其上设置任何事件处理程序。因此,在设置onunload处理程序之前需要一个短暂的延迟,用户可能会在这段时间内关闭窗口。开场白不知道要推迟多久;相反,子对话框必须回叫父对话框,告诉它准备好了。最好让子弹出窗口负责接收自己的事件,并给开场白打电话让其知道这些事件


跨窗口脚本有无数的陷阱。尽量避免。For对话框总是在页面元素中使用,这比窗口弹出窗口可靠得多,也不那么烦人。

我使用以下方法来找出子窗口何时关闭:

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!'); } );
    ...
}

我正在使用以下黑客程序查找子窗口何时关闭:

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!'); } );
    ...
}

根据您的标题,您是否打算在卸载之前设置newWind.on?我还认为在settings.url页面中定义onbeforeunload不是一个选项?根据您的标题,您的意思是设置newWind.onbeforeunload吗?我还认为在settings.url页面中定义onbeforeunload不是一个选项?