showModalDialog模态对话框的使用详解以及浏览器兼容

showModalDialog是jswindow对象的一个方法,和window.open一样都是打开一个新的页面。区别是:showModalDialog打开子窗口后,父窗口就不能获取焦点了(也就是无法操作了)

1.ModalDialog是什么?

showModalDialog是jswindow对象的一个方法,和window.open一样都是打开一个新的页面。

区别是:showModalDialog打开子窗口后,父窗口就不能获取焦点了(也就是无法操作了)。

可以在子窗口中通过设置window.returnValue的值,让父窗口可以获取这个returnvalue.

 

2.一个例子

1)主窗口main.html,

2)在主窗口中通过showModalDialog的方式打开子窗口sub.html

3)在子窗口中设置returnValue返回给主窗口使用

 

main.html

代码如下:

<HTML>

<HEAD>

<METANAME="GENERATOR"Content="oscar999">

</HEAD>

<script>

functionshowmodal()

{

varret=window.showModalDialog("sub.html?temp="+Math.random());

alert("subreturnvalueis"+ret);

}

</script>

<BODY>

<INPUTid=button1type=buttonvalue="opensub"name=button1onclick="showmodal();">

</BODY>

</HTML>

 

sub.html

 代码如下:

<HTML>

<HEAD>

<METANAME="GENERATOR"Content="oscar999">

</HEAD>

<script>

functionreturnMain()

{

window.returnValue="returnfromsub";

window.close();

}

</script>

<BODY>

<INPUTid=button1type=buttonvalue="returnandclose"name=button1onclick="returnMain()">

</BODY>

</HTML>

 

特别说明:在main.html中showModalDialog的方法时,有使用到Math.random()的目的是避免缓存。

 

3.showModalDialog详细使用

vReturnValue=window.showModalDialog(sURL[,vArguments][,sFeatures])

sURL

必选参数,类型:字符串。用来指定对话框要显示的文档的URL。

vArguments

可选参数,类型:变体。用来向对话框传递参数。传递的参数类型不限,包括数组等。对话框通过window.dialogArguments来取得传递进来的参数。

sFeatures

可选参数,类型:字符串。用来描述对话框的外观等信息,可以使用以下的一个或几个,用分号“;”隔开。

dialogHeight对话框高度,不小于100px,IE4中dialogHeight和dialogWidth默认的单位是em,而IE5中是px,为方便其见,在定义modal方式的对话框时,用px做单位。

dialogWidth:对话框宽度。

dialogLeft:距离桌面左的距离。

dialogTop:离桌面上的距离。

center:{yes|no|1|0}:窗口是否居中,默认yes,但仍可以指定高度和宽度。

help:{yes|no|1|0}:是否显示帮助按钮,默认yes。

resizable:{yes|no|1|0}[IE5+]:是否可被改变大小。默认no。

status:{yes|no|1|0}[IE5+]:是否显示状态栏。默认为yes[Modeless]或no[Modal]。

scroll:{yes|no|1|0|on|off}:指明对话框是否显示滚动条。默认为yes。

 

还有几个属性是用在HTA中的,在一般的网页中一般不使用。

dialogHide:{yes|no|1|0|on|off}:在打印或者打印预览时对话框是否隐藏。默认为no。

edge:{sunken|raised}:指明对话框的边框样式。默认为raised。

unadorned:{yes|no|1|0|on|off}:默认为no。

 

4.浏览器兼容

但是并不是所有浏览器对兼容这样的用法。

在Chrome中运行上面的例子的话,父窗口可以任意获取焦点,效果和window.open一样,而且获取的returnVale也是undefined.

以下是各主流浏览器对此方法的支持状况。

浏览器 是否支持 状态 

IE9 ○   

Firefox13.0 ○   

safari5.1 ○   

chrome19.0 × 并不是模态对话框,而是open了一个新窗体 

Opera12.0 × 什么也发生,连个窗体都不弹 

 

 

如果有传入vArguments这个参数为window的话: 

代码如下:

var ret = window.showModalDialog("sub.html?temp="+Math.random(),window);

 

则在子窗口中,以下的值为:

浏览器 模态对话框 window.opener window.dialogArguments returnValue  

 IE9  ○  undefined  [object Window]  ○ 

 Firefox13.0  ○  [objectWindow]  [object Window]  ○ 

 safari5.1  ○  [objectWindow]  [object Window]  ○ 

 chrome19.0  ×  [objectWindow]  undefined  × 

 

 

注意一下Firefox浏览器下,子窗体假如刷新的话window.dialogArguments照样会丢失,变成undefined。以上结果中我们可以看出返回值returnValue就只有chrome浏览器返回的是undefined,其他浏览器都没有问题

 

5.如何解决Chrome的兼容问题。

方向是:设置window.opener.returnValue=""

main.html

代码如下:

<HTML>  

<HEAD>  

<META NAME="GENERATOR" Content="oscar999">  

</HEAD>  

<script>

function showmodal()

{

  var ret = window.showModalDialog("sub.html?temp="+Math.random(),window);

  //for Chrome

  if(ret==undefined)

  {

    ret = window.returnValue;

  }

  alert("sub return value is "+ret);

}

</script>

<BODY>  

<INPUT id=button1 type=button value="open sub" name=button1 onclick="showmodal();">  

</BODY>  

</HTML>

 

sub.html

代码如下:

<HTML>  

<HEAD>  

<META NAME="GENERATOR" Content="oscar999">  

</HEAD>  

<script>

function returnMain()

{

  if(window.opener!=undefined)

  {

    window.opener.returnValue = "return from sub"; 

  }else{

    window.returnValue = "return from sub";

  }

  window.close();

}

</script>

<BODY>  

<INPUT id=button1 type=button value="return and close" name=button1 onclick="returnMain()">  

</BODY>  

</HTML>

 

这里是判断某些对象是否为defined来区分浏览器。当然,也可以判断浏览器的类型的方式进行

 

这里是借用了父窗口的returnValue来使用, 如果父窗口的returnValue也用其他用途是可以使用替换的方式进行了, as:

var oldValue  = window.returnValue; 

var newValue = showModalDialog()

window.returnValue = oldValue  

 

6.需要特别注意的是,Chrome下的测试需要把html 文件放入到web server(Tomcat,...)下通过http url 访问测试。否则就不成功了。

时间: 2024-12-09 19:48:58

showModalDialog模态对话框的使用详解以及浏览器兼容的相关文章

showModalDialog模态对话框的使用详解以及浏览器兼容_javascript技巧

1.ModalDialog是什么?showModalDialog是jswindow对象的一个方法,和window.open一样都是打开一个新的页面.区别是:showModalDialog打开子窗口后,父窗口就不能获取焦点了(也就是无法操作了).可以在子窗口中通过设置window.returnValue的值,让父窗口可以获取这个returnvalue. 2.一个例子1)主窗口main.html,2)在主窗口中通过showModalDialog的方式打开子窗口sub.html3)在子窗口中设置ret

Chrome不支持showModalDialog模态对话框和无法返回returnValue问题的解决方法_javascript技巧

What?模态对话框失效了? 上个礼拜修改测试一个后台管理项目,在测试与各个浏览器兼容性的时候,发现在chrome浏览器下showModalDialog方法显示的并不是模态对话框,就像新打开一个页面一样,父窗口仍然可以随意获取焦点,并可以打开多个窗体,而且返回值returnValue也无法返回,一直是undefined.这么多问题很令人头疼,下面就各个主流最新版的浏览器进行了一下测试. 浏览器 是否支持 状态 IE9 ○ Firefox13.0 ○ safari5.1 ○ chrome19.0

谷歌浏览器不支持showModalDialog模态对话框的解决方法_javascript技巧

忽然发现Chrome浏览器版本 37.0.2062.103 m 不支持showModalDialog模态对话框和无法返回returnValue 项目原先用到的都不能正常执行 找了个折中方案利用window.open代替showModalDialog利用 window.opener.document来操作父页面的元素 复制代码 代码如下: window.open("xsp/exesp?todo=13","","height=500,width=280,sta

使用selenium测试showModalDialog模态对话框

Selenium目前没有提供对IE模态对话框(即通过 showModalDialog方法打开的弹出对话框)的处理.原因在于,模态对话框会将父页面的JS挂起,直至对话框处理完毕才会继续执行父页面JS.因为Selenium的底层实现是基于JS的,所以模态对话框会同时将selenium挂起,selenium无法选中模态对话框,直至超时. 但是很多系统往往有大量的模态对话框应用.这些应用分为两类:一类是选人.选业务类型等操作,这些操作的目的是填充父页面相应的字段,不会触发其他操作:另外一类比较特殊,例如

Android Dialog对话框用法实例详解_Android

本文实例讲述了Android Dialog对话框用法.分享给大家供大家参考,具体如下: Activities提供了一种方便管理的创建.保存.回复的对话框机制,例如 onCreateDialog(int), onPrepareDialog(int, Dialog), showDialog(int),dismissDialog(int)等方法,如果使用这些方法的话,Activity将通过getOwnerActivity()方法返回该Activity管理的对话框(dialog). 1. onCreat

Android 对话框(Dialog)大全详解及示例代码_Android

Activities提供了一种方便管理的创建.保存.回复的对话框机制,例如 onCreateDialog(int), onPrepareDialog(int, Dialog), showDialog(int), dismissDialog(int)等方法,如果使用这些方法的话,Activity将通过getOwnerActivity()方法返回该Activity管理的对话框(dialog). onCreateDialog(int):当你使用这个回调函数时,Android系统会有效的设置这个Acti

javascript showModalDialog模态对话框使用说明_javascript技巧

1. 标准的方法 复制代码 代码如下: <script type="text/javascript"> function openWin(src, width, height, showScroll){ window.showModalDialog (src,"","location:No;status:No;help:No;dialogWidth:"+width+";dialogHeight:"+height+&

js showModalDialog弹出窗口实例详解_javascript技巧

showModalDialog:模式窗口, 一种很特别的窗口,当它打开时,后面的父窗口的活动会停止,除非当前的模式子窗口关闭了, 才能操作父窗口.在做网页Ajax开发时,我们应该有时会用到它来实现表单的填写, 或做类似网上答题的窗口. 它的特点是,传参很方便也很强大,可直接调用父窗口的变量和方法. 使用方法:  vReturnValue = window.showModalDialog(sURL [, vArguments] [,sFeatures])  参数说明:  sURL--  必选参数,

Java文件选择对话框JFileChooser使用详解_java

文件加密器,操作过程肯定涉及到文件选择器的使用,所以这里以文件加密器为例.下例为我自己写的一个文件加密器,没什么特别的加密算法,只为演示文件选择器JFileChooser的使用. 加密器界面如图: 项目目录结构如图: 下面贴出各个文件的源代码: MainForm.java package com.lidi; import javax.swing.*; import java.awt.*; public class MainForm extends JFrame { /** * 构造界面 * *