我们知道在BS系统中如果想使用模态对话框,我们就要用window.showModalDialog()这个方法, showModalDialog()方法是用来创建一个显示HTML内容的模态对话框,这篇文档是用来对使用showModalDialog()产生模态对话框进行各种应用时产生的问题的解决方法,这篇文档适用于asp,php,jsp等多种web技术,下面sample代码的我会用jsp。 注:这篇文档不涉及showModalDialog()方法的说明 需要了解的请参阅 Msdn文档,和KingErq网友的文档 http://dev.csdn.net/develop/article/44/44896.shtm
我们先写一个大家都很熟悉的showModalDialog()最简单的使用-我们重写一下javascript中window的alert()方法. 我们先做的事情是新建一个文件alert.jsp 代码为: <%@ page contentType="text/html;charset=GBK" language="java" pageEncoding="GBK" %> <% request.setCharacterEncoding("GBK"); String msg=request.getParameter("msg");%> <html xmlns:wsc> <head> <title>#您的系统名称#----------------------------</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <script language=javascript> function findenter() { if (event.keyCode==13) window.close(); } </script> </head> <body onkeydown=javascript:findenter();> <center> <div style="overflow:auto;height:60px" align="center"> <%=msg%> </div> <input type=Button value="确定" onclick="javascript:window.close();"> </center> </body> </html>
然后在你BS系统的unit.js文件中添加下面一个方法 function alert(msg) { var w=250; var h=150; posLeft=(screen.width-w)/2 posTop=(screen.height-h)/2 showModalDialog("alert.jsp?msg=" + msg,"","status:no;dialogHeight: " + h +"px; dialogWidth: " + w +"px;status:no;scroll:no;dialogTop: " + posTop + "px; dialogLeft: " + posLeft + "px'"); } 这时候在引用了unit.js的页面中用 alert()方法时,出现的模式对话框就是我们自己定义的alert.jsp对话框了.用这种方法,我们可以在我们的系统中用showModalDialog方法把 window.alert(), window.confirm(),window.prompt() 等ie的默认的提示框都重写一边,这样系统的ui风格就得到了统一,更加美观. 用showModalDialog模拟alert是他最简单的应用,而大部分的BS系统中我们使用模态对话框的目的是有一个清单页面list.jsp,我们要双击list.jsp页面的一条记录时 弹出edit.jsp这个模态对话框,对这条记录进行编辑,这时候问题来了,在模态对话框的文件是不能重新载入的,就是说如果我们在edit.jsp文件里把<form>的数据post到save.jsp的时候,save.jsp不会在模态对话框里出现,而是弹出一个新的IE窗口,这显然是不能忍受的.这个问题的解决方法是这样的: 我们建立一个中间页面 比如openWindow.jsp 我们想在模态对话框中打开edit.jsp的时候调用 showModalDialog打开openWindow.jsp页面,并把edit.jsp的文件名通过get方法传递给openWindow.jsp. 在openWindow.jsp页面里,建立一个iframe,载入传入的url地址edit.jsp. 这时候,不管在edit.jsp页面怎么refresh,怎么post,都会老老实实的呆在模态对话框里了 下面是实现的代码: openWindow.jsp <%@ page contentType="text/html;charset=GBK" language="java" pageEncoding="GBK" %> <% request.setCharacterEncoding("GBK"); response.addHeader("Cache-Control", "no-cache"); response.addHeader("Expires", "Thu, 01 Jan 1970 00:00:01 GMT"); String dlgurl=request.getParameter("url"); String dlgtitle=request.getParameter("title"); %> <html> <head> <title><%=dlgtitle%></title> </head> <body leftmargin=0 topmargin=0 > <iframe scroll=none width=100 frameborder=0 scrolling=no height=100 src=<%=dlgurl%>></iframe> </body> </html> 在unit.js里添加函数 function showm(title,url,obj,w,h,obj) { var posLeft=(screen.width-w)/2 var posTop=(screen.height-h)/2 var url="OpenWindows.jsp?url=" + url + "&title=" + title; var dlginf="status:no;dialogHeight: " + h +"px; dialogWidth: " + w +"px;status:no;scroll:no;dialogTop: " + posTop + "px; dialogLeft: " + posLeft + "px'"; var rv=showModalDialog(url,obj,dlginf); return rv; }
恩,为了方便阅读,我把代码中的对特殊字符的处理和一些状态等待条去掉了,实际使用中可以依据自己使用的实际情况自己优化.
文中是我开发bs系统的对模态窗体使用的一点心得,希望能帮到大家,文中出现的错误,和有更优化的解决方法,请告知 [email protected] 谢谢

|