项目中有时候需要通过在浏览器中弹出模式对话框,让用户在对话框中选择,确定后能在父窗口指定的字段填写上用户在对话框中选择的值。可以先使用js定义如下方法:
注意到这里使用的方法是:
其中参数如下,
url
代表要在该对话框中加载的url地址,注意到我们项目中加载的是action;
vArguments
可选参数,类型:变体。用来向对话框传递参数。传递的参数类型不限,包括数组等。对话框通过window.dialogArguments来取得传递进来的参数(这里开始我不知道是干嘛用的,就随便传了个值==b)。
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。
在模式对话框关闭后,我们需要将返回的结果写到父窗口中的指定field,就如我们定义的方法最后那个判断部分。显然我们返回的是一个数组,实际上,你可以自己定义模式对话框的返回值,下面是上述action跳转的jsp页面(即对话框中显示部分的js代码):
当用户选择完毕后,点击“确定”按钮,调用上面这个函数,判断用户是否选择了代码,通过
我们定义了窗口关闭后的返回值,这样我们在父窗口就得到了这个数组,并能把它们写到指定的页面字段用于表单提交。
有意思吗?(语无伦次了,这是我第一次写blog,多多关照哈大家)
然后下面再来个小例子:
testModelDialog.html是父窗口:
aModelDialog.html是弹出窗口:
- /**
- * 弹出一个对话框用于选择代码
- * @param codeTableName 代码的名称,例如proType
- * @param width 弹出对话框的宽度
- * @param height 弹出对话框的高度
- * @param labelId 用于显示该代码编号的html元素id,该元素用于向后台传实际代码编号,例如”01“
- * @param valueId 用于显示该代码意义的html元素id,该元素用于在前台显示该代码实际代表的字符串,例如”电影“
- * @return
- *
- * 例子:
- * <script>
- * var contextPath = "${pageContext.request.contextPath}";//通过这个把路径传过去
- * </script>
- * <s:hidden name="userProductDuty.dutyCode" id="dutyCode_valueId"></s:hidden>
- <s:textfield name="dutyCode_label" id="dutyCode_labelId" cssClass="textNoSize" cssStyle="width:150px;" label="责任者方式" labelposition="left" labelSeparator=":" required="true"
- size="5" value="%{codeList.{?#this.codeTableName=='dutyCode'&&#this.codeNumber==#request['userProductDuty.dutyCode']}.{codeMean}[0]}"
- οnclick="chooseCodeNumber(contextPath,'dutyCode','400','300','dutyCode_labelId','dutyCode_valueId')">
- </s:textfield>
- 注意上面那个隐藏字段的命名
- */
- function chooseCodeNumber(pageContextPath,codeTableName,width,height,labelId,valueId) {
- var codeMean = document.getElementById(labelId).value;
- var codeNumber = document.getElementById(valueId).value;
- var rtValue = showModalDialog(
- pageContextPath + '/admin/security/code/popCommonCode.action?filter_codeTableName='+codeTableName + "&selectedNumberId=" + codeNumber
- ,'code chooser',
- 'dialogWidth:' + width + 'px;dialogHeight:' + height + 'px;dialogLeft:200px;dialogTop:150px;center:yes;help:yes;resizable:yes;status:yes');
- if(rtValue != null && rtValue.length > 0) {
- document.getElementById(labelId).value = rtValue[1];
- document.getElementById(valueId).value = rtValue[0];
- }
- }
/** * 弹出一个对话框用于选择代码 * @param codeTableName 代码的名称,例如proType * @param width 弹出对话框的宽度 * @param height 弹出对话框的高度 * @param labelId 用于显示该代码编号的html元素id,该元素用于向后台传实际代码编号,例如”01“ * @param valueId 用于显示该代码意义的html元素id,该元素用于在前台显示该代码实际代表的字符串,例如”电影“ * @return * * 例子: * <script> * var contextPath = "${pageContext.request.contextPath}";//通过这个把路径传过去 * </script> * <s:hidden name="userProductDuty.dutyCode" id="dutyCode_valueId"></s:hidden> <s:textfield name="dutyCode_label" id="dutyCode_labelId" cssClass="textNoSize" cssStyle="width:150px;" label="责任者方式" labelposition="left" labelSeparator=":" required="true" size="5" value="%{codeList.{?#this.codeTableName=='dutyCode'&&#this.codeNumber==#request['userProductDuty.dutyCode']}.{codeMean}[0]}" οnclick="chooseCodeNumber(contextPath,'dutyCode','400','300','dutyCode_labelId','dutyCode_valueId')"> </s:textfield> 注意上面那个隐藏字段的命名 */ function chooseCodeNumber(pageContextPath,codeTableName,width,height,labelId,valueId) { var codeMean = document.getElementById(labelId).value; var codeNumber = document.getElementById(valueId).value; var rtValue = showModalDialog( pageContextPath + '/admin/security/code/popCommonCode.action?filter_codeTableName='+codeTableName + "&selectedNumberId=" + codeNumber ,'code chooser', 'dialogWidth:' + width + 'px;dialogHeight:' + height + 'px;dialogLeft:200px;dialogTop:150px;center:yes;help:yes;resizable:yes;status:yes'); if(rtValue != null && rtValue.length > 0) { document.getElementById(labelId).value = rtValue[1]; document.getElementById(valueId).value = rtValue[0]; } }
注意到这里使用的方法是:
- showModalDialog(url,[, vArguments] [, sFeatures])
showModalDialog(url,[, vArguments] [, sFeatures])
其中参数如下,
url
代表要在该对话框中加载的url地址,注意到我们项目中加载的是action;
vArguments
可选参数,类型:变体。用来向对话框传递参数。传递的参数类型不限,包括数组等。对话框通过window.dialogArguments来取得传递进来的参数(这里开始我不知道是干嘛用的,就随便传了个值==b)。
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。
在模式对话框关闭后,我们需要将返回的结果写到父窗口中的指定field,就如我们定义的方法最后那个判断部分。显然我们返回的是一个数组,实际上,你可以自己定义模式对话框的返回值,下面是上述action跳转的jsp页面(即对话框中显示部分的js代码):
- function confirm_select(){
- if(document.getElementById('selectedNumberId').value != null &&
- document.getElementById('selectedNumberId').value != '') {
- window.returnValue = new Array(2);
- window.returnValue[0] = document.getElementById('selectedNumberId').value;
- window.returnValue[1] = document.getElementById('selectedCodeMeanId').value;
- }
- window.close();
- }
function confirm_select(){ if(document.getElementById('selectedNumberId').value != null && document.getElementById('selectedNumberId').value != '') { window.returnValue = new Array(2); window.returnValue[0] = document.getElementById('selectedNumberId').value; window.returnValue[1] = document.getElementById('selectedCodeMeanId').value; } window.close(); }
当用户选择完毕后,点击“确定”按钮,调用上面这个函数,判断用户是否选择了代码,通过
- window.returnValue = new Array(2);
window.returnValue = new Array(2);
我们定义了窗口关闭后的返回值,这样我们在父窗口就得到了这个数组,并能把它们写到指定的页面字段用于表单提交。
有意思吗?(语无伦次了,这是我第一次写blog,多多关照哈大家)
然后下面再来个小例子:
testModelDialog.html是父窗口:
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
- <HTML>
- <HEAD>
- <TITLE> New Document </TITLE>
- <META NAME="Generator" CONTENT="EditPlus">
- <META NAME="Author" CONTENT="">
- <META NAME="Keywords" CONTENT="">
- <META NAME="Description" CONTENT="">
- </HEAD>
- <script>
- function popupDialog(fieldId,width,height){
- var ret = window.showModalDialog("aModelDialog.html",'你喜欢的女生是谁呢?',
- 'dialogWidth:' + width + 'px;dialogHeight:' + height + 'px;dialogLeft:200px;dialogTop:150px;center:yes;help:yes;resizable:yes;status:yes');
- document.getElementById(fieldId).value = ret;
- }
- </script>
- <BODY>
- 点击回答你的问题:<input type="text" name="fieldName" id="fieldId" onclick="popupDialog('fieldId',300,400);"/>
- <input type="button" value="..." onclick="popupDialog('fieldId',400,300);"/>
- </BODY>
- </HTML>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
</HEAD>
<script>
function popupDialog(fieldId,width,height){
var ret = window.showModalDialog("aModelDialog.html",'你喜欢的女生是谁呢?',
'dialogWidth:' + width + 'px;dialogHeight:' + height + 'px;dialogLeft:200px;dialogTop:150px;center:yes;help:yes;resizable:yes;status:yes');
document.getElementById(fieldId).value = ret;
}
</script>
<BODY>
点击回答你的问题:<input type="text" name="fieldName" id="fieldId" οnclick="popupDialog('fieldId',300,400);"/>
<input type="button" value="..." οnclick="popupDialog('fieldId',400,300);"/>
</BODY>
</HTML>
aModelDialog.html是弹出窗口:
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
- <HTML>
- <HEAD>
- <TITLE> 模式对话框</TITLE>
- <META NAME="Generator" CONTENT="EditPlus">
- <META NAME="Author" CONTENT="">
- <META NAME="Keywords" CONTENT="">
- <META NAME="Description" CONTENT="">
- </HEAD>
- <SCRIPT LANGUAGE="JavaScript">
- <!--
- function confirm_answer(){
- if(document.getElementById('my_answer_id').value == '') {
- alert('你必须回答问题!');
- return;
- }
- window.returnValue = document.getElementById('my_answer_id').value;
- window.close();
- }
- //-->
- </SCRIPT>
- <BODY>
- 我的答案:<input type="text" id="my_answer_id"/><input type="button" value="提交" onclick="confirm_answer();"/>
- </BODY>
- <SCRIPT LANGUAGE="JavaScript">
- <!--
- if(window.dialogArguments!=null)
- alert(window.dialogArguments);
- //-->
- </SCRIPT>
- </HTML>