window.ShowModalDialog与window.open的区别

火狐浏览器不支持showModalDialog(),但可以使用window.open()方法,属性中加上modal=yes,就可以实现和IE中showModalDialog()差不多的效果。

showModalDialog()可与父窗口相互传递数据,它与window.open的最大区别就在于由ShowModalDialog()打开子窗口后,父窗口将不能操作,例如:
Js代码 
returnValue = window.showModalDialog(sURL [, vArguments] [, sFeatures])... 

window.open()方法在IE7和IE8上不能直接弹出一个子窗口,而是打开一个新的标签页。

showModalDialog() 弹出一个对话框,对话框是依附于打开它的那个窗口的;window.open() 是开一个新窗口,和打开它的那个窗口是独立的。

showModalDialog() 必须关闭才能操作打开它的那个窗口;而 window.open() 打开的窗口不必关闭也可以操作打开它的那个窗口。

这两者控制打开它的窗口方法也不一样:一个使用 dialogArguments,一个使用 opener。

-----------------------------------------------------------------------------------------------------------
问题:
把弹出子窗口的方法改成"window.showModalDialog",发现改完之后,子窗口里的任何功能都不能用了,后台程序突然取不到当前用户的ID,所以点击查询之类的功能的时候,要么报空指针异常,要么就弹出登录界面,要求重新登陆系统。。。

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

模式对话框不建议使用,除非在必要的情况下。

--------------------------------------------------------------------------------------------------------------------------------

问题:
如何保证用户在退出系统时,所有的子窗口都关闭。

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

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

详细说明一下:
1. 首先定义一个数组,保存打开的子窗口的引用:
Js代码 
var childWindows = new Array(); 

2. 当打开一个新的子窗口时,将这个子窗口的引用添加到数组中。下面这句代码写到打开子窗口的函数中:
Js代码 
childWindows[childWindows.length] = window.open(......); 

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

    childWindows[i].close(); 

你可能感兴趣的:(showModalDialog)