JavaScript showModalDialog 模态窗口关闭后刷新父页面或跳转

作者:异步漫步

时间:2026-10-26

浏览:266

本文介绍如何使用JavaScript的showModalDialog打开模态窗口,并在子窗口关闭时通过window.returnValue向父窗口返回值。父窗口根据返回值决定刷新页面或跳转至指定URL,同时提供避免缓存和解决表单提交新窗口问题的技巧。

文章目录

模态窗口刷新父页面场景

场景包含两个窗口:A窗口作为父窗口,B窗口作为模态子窗口。A窗口中包含一个DATAGRID控件和一个触发按钮。点击该按钮时,会弹出B模态窗口。在B窗口中完成数据添加并提交后,需要实现B窗口自动关闭,并刷新A父窗口。

基础刷新实现代码

参考代码如下:

 
<script type="text/javascript">
function openSubWin()
{ 
window.showModalDialog('b.html', 'newwindow', 'height=500, width=400, top=0, left=0, toolbar=no, menubar=yes, scrollbars=yes,resizable=yes,location=no, status=no');
window.location.reload();
} 
</script>

上述代码用于弹出子窗体b.html,并在关闭子窗体时触发父页面的刷新操作。



复杂场景下的父窗口处理

在开发物资系统时再次遇到模态窗口相关问题,此次情况比之前复杂,故记录如下。


父窗口 JavaScript 方法实现:


代码如下:

 
function openwin(id){
var answer=window.showModalDialog("demand.do?method=queryBOM&mdid="+id+"&d="+escape(new Date()),window.self,"dialogWidth:700px;dialogHeight:620px:center:yes");
if(answer==1){
window.location.href = "demand.do?method=selmd&d="+escape(new Date()); //转到处理页面
//window.location.reload(); 刷新父窗口
//winow.location.reload(true);
} 
} 

在URL中增加escape(new Date())参数以避免读取缓存。此外,也可以在子窗口中添加以下Meta标签来禁止缓存:


<META HTTP-EQUIV="pragma" CONTENT="no-cache">


子窗口返回值与缓存控制

<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate">


子窗口 JavaScript 方法:


代码如下:

 
function reVal(){
window.returnValue=1; //父窗口中 answer的值
window.close();
} 

打开模态窗口后,父窗口会等待子窗口返回值。如果是表单提交或按钮点击,应执行reVal()方法。


通过返回answer的值,设置window.returnValue=1。测试发现该值似乎仅支持String类型,数组类型无效。



常见问题与解决方案

在子窗口中使用 window.opener.location.reload(); 无效,不适用于模态窗口,应使用 window.open() 相关机制。



另一个问题是模态窗口内form提交会弹出新窗口。解决方法是在<head>标签内添加<base target="_self">即可解决。


注:起初尝试不通过form提交,而是用js window.location.href 跳转到不同action处理,发现


<base target="_self"> 不生效。似乎该标签仅针对form action="" 起作用,此处可能可用iframe实现。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章