`

在BS系统中使用模态对话框(showModalDialog)的解决方案

阅读更多
在BS系统中使用模态对话框(showModalDialog)的解决方案
来源: 未知


     我们知道在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系统的对模态窗体使用的一点心得,希望能帮到大家,文中出现的错误,和有更优化的解决方法,请告知 nittystone@hotmail.com 谢谢
分享到:
评论

相关推荐

    详解VC++模态对话框和非模态对话框

    由于非模态对话框不是由`DoModal`函数控制的,因此在对话框创建后,其对象可能会在其创建的函数执行完毕后被销毁,导致对话框消失。为了避免这种情况,非模态对话框对象应作为类成员变量或在堆上分配内存。对于后者...

    vc的模态对话框和非模态对话框

    4. **对话框关闭**:关闭非模态对话框时,应当使用`CWnd::DestroyWindow`而不是`CDialog::EndDialog`,并在对话框关闭后通过`delete`操作符释放对话框对象。 5. **状态跟踪**:为了处理多次打开非模态对话框的情况...

    模态对话框与非模态对话框程序Java示例

    在Java中,JOptionPane类提供了一些预定义的模态对话框,如消息对话框、确认对话框、输入对话框等。 例如,`C08_3_DialogTest.java`可能包含以下代码,展示了如何使用JOptionPane创建一个模态对话框: ```java ...

    VC中模态对话框和非模态对话框的编程

    - 在对话框类的初始化函数`CDialog::OnInitDialog`中,通常会调用`UpdateData(FALSE)`,确保数据成员的初始值能够在对话框创建时正确地显示在控件上。 - 如果用户点击“OK”按钮关闭对话框,系统会认为输入有效,...

    MFC模态 非模态对话框 ARX2008+VS2005

    在MFC中,对话框数据的获取和设置通常通过`DoDataExchange()`函数完成,该函数负责在对话框控件与成员变量之间交换数据。数据验证可以在`OnInitDialog()`中或自定义的验证函数中进行,以确保用户输入的有效性。 6. ...

    模态对话框和非模态对话框创建和使用VS2010/MFC

    在Microsoft Visual Studio 2010 (VS2010) 中,MFC(Microsoft Foundation Classes)库提供了创建和管理用户界面元素的功能,其中包括模态对话框和非模态对话框。这两种对话框在Windows应用程序开发中扮演着重要的...

    qml自定义模态对话框

    为了在应用程序中使用这个自定义对话框,你可以将其导入并像其他QML组件一样实例化: ```qml import "path/to/your/CustomDialog.qml" as CustomDialog // 使用对话框 CustomDialog { id: customDialog anchors....

    一个简单模态对话框实例

    模态对话框是用户界面设计中的一个重要元素,它在应用程序中起到临时中断主窗口操作,迫使用户必须先处理对话框中的事务,才能继续进行其他操作的功能。这种对话框的特性使得用户不能忽视其存在,因此被称为“模态”...

    mfc中模态、非模态对话框与主对话框之间的数据交换

    点击运行弹出一个对话框,点击DIALOG1按钮弹出一个模态对话框,在该对话框的编辑框输入文本点击确定该对话框消失且输入的文本被显示到主对话框MainDialog中,点击DAILOG2按钮弹出一个非模态对话框,操作现象和模态...

    MFC模态对话框和非模态对话框

    非模态对话框允许用户在对话框打开的同时与应用程序的其他部分进行交互。在MFC中,我们需要继承CDialog类,并重写 OnInitDialog() 函数,然后使用Create()函数来创建和显示非模态对话框。例如: ```cpp class ...

    使用selenium测试showModalDialog模态对话框

    在提供的Java代码示例中,可以看到一种可能的解决方案: ```java public void clickAndSelectModalDialog(String locator){ clickForModalDialog(locator); selenium.selectWindow("name=modal"); } private ...

    子模态对话框关闭后刷新父模态对话框

    在这个例子中,我们使用了Bootstrap的模态插件,并监听了子模态的隐藏事件,然后调用了父模态的更新方法来刷新其内容。 无论使用哪种技术栈,关键在于理解事件驱动的编程思想,以及如何在组件或元素之间传递信息。...

    vc非模态对话框例子

    非模态对话框与模态对话框不同,在非模态对话框活动的同时,用户还可以在应用程序的其他地方工作,而模态对话框在其关闭之前,用户不能在同一个应用程序的其他地方工作。本例将从主框架窗口创建一个简单的非模态...

    Visual C++模态对话框消息处理机制的分析

    在Visual C++中,模态对话框是一种特殊类型的对话框,其消息处理机制与非模态对话框有所区别。模态对话框在被打开后,会暂时挂起其父窗口的消息处理,直至模态对话框被关闭。在模态对话框处于活动状态期间,应用程序...

    Qt主界面获取模态对话框数据的方法

    2. 非模态对话框(Non-modal Dialog):非模态对话框允许用户在对话框打开的同时继续与主界面进行交互。这对于需要频繁访问或需要同时处理多个任务的情况非常有用。 接下来,我们将探讨如何在Qt中获取这两种对话框...

    使用ObjectARX开发CAD制作模态对话框

    在实际开发过程中,需要注意线程同步问题,因为模态对话框会阻塞主线程,如果需要执行耗时操作,应考虑使用异步或后台线程。此外,良好的用户界面设计也很关键,对话框应简洁易懂,避免过于复杂导致用户困惑。 总的...

    android 模态与非模态对话框实现

    在Android应用开发中,对话框(Dialog)是与用户交互的重要元素,分为模态和非模态两种类型。本文将详细介绍这两种对话框的实现,并结合源码和工具进行讲解。 模态对话框(Modal Dialog)是一种阻塞用户界面直至...

    创建非模态对话框

    1. **并行操作**:用户可以在打开非模态对话框的同时与程序中的其他窗口进行交互。 2. **多任务处理**:可以同时打开多个非模态对话框,这使得用户能够在不同对话框之间切换。 3. **资源消耗**:相比模态对话框,非...

    IOS 弹出模拟模态对话框

    在iOS开发中,模态对话框(Modal Dialog)是一种常见的用户交互方式,它可以在当前界面之上弹出一个半透明或不透明的视图,用于显示临时信息、进行关键操作或者像描述中提到的那样,创建登录界面。Xcode 6是苹果提供...

    VS2010模态非模态对话框.rar

    接下来,非模态对话框允许用户在对话框保持打开的同时与应用程序的其他部分进行交互。创建非模态对话框的方法如下: 1. 同样创建一个继承自`CDialog`的类,但这次不需要重载`DoModal()`。 2. 在类的构造函数中,...

Global site tag (gtag.js) - Google Analytics