`
zqc_0101
  • 浏览: 227107 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

window.ShowModalDialog与window.open的区别

 
阅读更多

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

 

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

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. 首先定义一个数组,保存打开的子窗口的引用:

var childWindows = new Array();

 

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

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

 

3. 在退出登录时,遍历这个数组,然后将其中的子窗口关闭。下面这段代码应该加到退出登录时的处理函数中:

for(i=0; i<childWindows.length; i++)
{
    childWindows[i].close();
}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics