Rob*_*Rob 3 javascript internet-explorer
对于我的Web应用程序,我需要在父窗口关闭时关闭子窗口."关闭"是指浏览器窗口实际上已关闭,而不仅仅是导航到新页面.
我已经看到" 如果父窗口关闭,我如何关闭子窗口? "问题已经存在,但是我的问题是一个扩展.该问题的答案解决了在父级的任何卸载事件上关闭子窗口的问题.然而卸载!=关闭(IMO); 只需单击链接即可触发卸载事件.
由于JS中没有"onclose"事件,我认为最好的方法是在子节点上父节点的卸载事件setTimeout上查看它的父节点是否仍然存在,如果不存在则关闭:
var w = window.open("", "Logger", "height=480,width=640,resizeable,scrollbars=yes");
if (w) {
JSEvents.on(window,'unload',function(){
if (w && !w.closed) {
w.setTimeout(function(){
//IE this==w.opener
if (!w.opener || w.opener.closed) {
w.close();
}
},500);
}
});
}
Run Code Online (Sandbox Code Playgroud)
但是,我相信我已经非常确切地证明,在IE(7)中,您无法在父窗口或子窗口上的卸载事件期间使用setTimeout.在上面的例子this == w.opener里面有setTimeout匿名函数.此测试从不产生警报:
JSEvents.on(window, 'unload', function(){
window.setTimeout(function(){alert('HERE');},500);
});
Run Code Online (Sandbox Code Playgroud)
alert没有的直线setTimeout会产生警报.
是否有一个技巧可以从我可以使用的父项中为子项设置setTimeout?
是否有另一种方法可以检测父母何时关闭我可以使用?
在FF中这样做要容易得多,所以我专注于让它在IE下工作.
是否有一个技巧可以从我可以使用的父项中为子项设置setTimeout?
您无法使用IE中父级的代码执行此操作.当IE关闭一个窗口时,你从其中的代码定义的成员就会消失,对这些成员的引用(例如指向你的函数的子超时)将被悬空.根据您所拥有的IE版本,可能什么都不会发生,或者您可能会收到"无法从释放的脚本中执行代码"错误.
你可以在孩子里面做.父可以在子onunload上设置一个标志(例如,w.parentUnloaded = true),该子标志上的setInterval轮询器可以检查并关闭它自己 -
if (window.parentUnloaded && (!window.opener || window.opener.closed))
Run Code Online (Sandbox Code Playgroud)
这是IE漏洞吗?那么......当然,其他浏览器对卸载脚本的反应不同.但没有标准说明应该在这里发生什么.即使在同一浏览器系列中,行为也会随着浏览器的更新而改变,以避免跨上下文脚本问题.
对于这样的事情和事件计时问题(*),跨窗口脚本比看起来要难得多.通常最好避免; 如果您可以将"弹出窗口"放在主页面的div中,通常最好这样做.
(*:有些情况(**)可以在一个窗口中触发事件并执行,而另一个窗口中的JavaScript仍处于运行过程中.因此窗口'a'可以调用窗口'b'上的方法并且具有执行时,窗口'b'中的其他代码仍在进行中.如果它们是在正常的JavaScript假设下写入的,那么这可能会极大地混淆窗口'b'中的脚本,即只有一个执行线程同时处于活动状态.这是为什么我建议在子节点中使用轮询器而不是让父节点明确地调用子节点.将来我们将使用HTML5的postMessage方法来避免这些问题.)
(**:你很可能会认为这绝不会发生,而且它确实很奇怪,但它确实发生在许多浏览器中,特别是涉及模态对话或正在使用某些版本的IE Sun Java插件时.)
应用程序关闭后,您不能只留下弹出窗口; 这只是不礼貌.
有人会说,不礼貌是首先打开弹出窗口.;-)
在我看来,当父母离开时关闭任何子窗口是有意义的,无论用户是关闭窗口,还是只是导航回他的主页,书签,或键入地址,或者一些东西.就个人而言,如果我试图将应用程序"重置"为开始状态,我可能也想要在刷新时丢失子窗口.
如果你有多个文件,父母将在同一个应用程序的所有部分之间导航,不应该关闭孩子,你自己的事情真的很难!:-)但是你可以调整上面的"子窗口,如果'的方法试图嗅探opener.location并查看是否在你的应用程序中决定是否关闭.诀窍是如果开启者被导航到另一个域,访问会抛出一个安全异常,所以你必须在try ... catch块中包含位置访问,如果开启者位置也关闭了窗口太难以理解了.
bucabay写道(和安东尼类似):
刷新或关闭窗口后,浏览器会认为窗口已关闭.因此,就孩子而言,一旦刷新父母,它的开启者就会消失.
这是非常明智和合乎逻辑的.浏览器可能每个文档都应该有一个"窗口".但试试吧 - 他们没有.子弹出窗口保留对其开启者的访问权限(并且,只要该开启者是同一安全上下文中的文档,开启者的内容),通过刷新开启者,在IE/FF/Op/Saf /中人权委员会.
| 归档时间: |
|
| 查看次数: |
6787 次 |
| 最近记录: |