Javascript showModalDialog与open的困惑

来源:百度知道 编辑:UC知道 时间:2024/09/21 08:11:34
目前公司里有个J2EE的项目,采用的是Spring架构。
在主页面上,原来是用"window.open"的方法打开一个子窗口,功能一切正常,但是不能保证用户在退出系统时,所有的子窗口都关闭。
现在我把弹出子窗口的方法改成"window.showModalDialog",发现改完之后,子窗口里的任何功能都不能用了,后台程序突然取不到当前用户的ID,所以点击查询之类的功能的时候,要么报空指针异常,要么就弹出登录界面,要求重新登陆系统。。。
这是为什么呢?是这两个方法的问题吗?
您说的两种方法,具体应该怎么实现呢?
请指教!
关键现在父窗口还在,并没有关闭,只是在父窗口点击“退出系统”,父窗口返回到登录界面而已
这个时候,上一次的登录用户打开的子窗口还在

这个是常见的错误地使用模式对话框的例子

你的showModalDialog执行时,主窗口的所有代码都将停止运行,这时候如果试图对当前页面执行操作或想在后台自动刷新(以维持session不过期)都将失败。

模式对话框不建议使用,除非在必要的情况下。
即使不使用模式对话框,也可以将所有open的窗口都关闭

一种方法是每打开一个子窗口,都将该子窗口的引用赋给一个数组项,在主页面关闭时,遍历这个数组,将其中的所有子窗口都关闭。

第二种方法是让子窗口每隔一定时间(如1秒)利用其opener属性检查一次它的父窗口是否还在,如果父窗口关闭了,则子窗口调用window.close()方法将自身也关闭。

补充:好吧,详细给你说一下:

1. 首先定义一个数组,保存打开的子窗口的引用:
var childWindows = new Array();

2. 当打开一个新的子窗口时,将这个子窗口的引用添加到数组中。下面这句代码写到打开子窗口的函数中:

childWindows[childWindows.length] = window.open(......);

3. 在退出登录时,遍历这个数组,然后将其中的子窗口关闭。下面这段代码应该加到退出登录时的处理函数中:
for(i=0; i<childWindows.length; i++)
{
childWindows[i].close();
}