解决Firefox中showModalDialog的window.dialogArguments丢失问题

作者:闭包旅人

时间:2026-10-30

浏览:260

本文记录在Firefox浏览器中使用showModalDialog模态窗口时,子页面跳转导致window.dialogArguments对象丢失的问题。提供了两种解决方案:一是通过frameset或iframe包装子页面以保留引用;二是利用window.opener对象直接操作父页面隐藏域,并针对IE与非IE浏览器进行分支处理,确保跨浏览器环境下的数据传递正常。

文章目录

此前在项目开发中遇到一个浏览器兼容性问题,解决后特此记录,并补充关于模态窗口的相关资料。

问题详细描述如下:

在Firefox浏览器中弹出子窗口,子页面包含分页功能。点击“下一页”导致子页面刷新后,window.dialogArguments对象丢失,alert输出显示为undefined(具体解决方法见下文)。

模态窗口弹出方法及样式处理

近期开发网站时需要使用模态窗口功能,期间遇到若干问题,经查阅资料后逐一解决。以下是关于弹出窗口的几种常用方法:

a.window.open(pageURL,name,parameters); b.window.showModalDialog()方法用来创建一个显示HTML内容的模态对话框(IE 4+支持) c.window.showModelessDialog()方法用来创建一个显示HTML内容的非模态对话框(IE 5+支持) 2.显示样式问题:所用到的是window.showModalDialog(),此方法弹出的窗口在IE6下显示比IE7 ,IE8 下高度要小点,所以你可以写个js 解决这点(IE6下高度需要+35PX左右, dialogLeft 属性可以根据屏幕宽度设置) 代码片段如下:


 var swidth=window.screen.width;
 if(parseInt(width)>swidth)
 swidth=100;
 else
 swidth=(swidth-parseInt(width))/2;
varwindowStatus="dialogWidth:"+width+"px;dialogHeight:"+height+"px;dialogTop:80px;dialogLeft:"+swidth+"px;center:1;status:no;scroll:no;resizable:no;help:no;";
 
//弹出方法
 if(url.indexOf("?")<0){window.showModalDialog(url+'?setTime='+newDate().getTime(),obj,windowStatus);}
 else{window.showModalDialog(url+'&setTime='+newDate().getTime(),obj,windowStatus);}

Firefox中dialogArguments丢失的解决方案

关于Firefox浏览器中dialogArguments对象丢失的问题:在showModalDialog弹出的窗口中进行分页数据显示时,若点击页面信息获取分页数据的ID并传回父窗口,在IE环境下运行正常。但在Firefox 3.0中运行时,如果页面不发生跳转,可以正常调用window.dialogArguments;一旦页面发生跳转,window.dialogArguments的引用便会丢失。

现提供两种解决方法:

a. 将showModalDialog窗口的页面放置在frameset或iframe中进行包装。示例如下:window.showModalDialog("test.aspx");test.aspx页面的内容如下:


<frameset cols="0,*">
<frame src=""/>
<frame src="分页显示数据的页面"/>
</frameset> 

此时页面返回方法变为:


function returnValue(flag)
{
 var myObj = window.parent.dialogArguments;
 myObj.value = flag;
 window.parent.close();
}

这样即可获取到返回值。b. 如果不想额外增加一个页面,可以使用以下方法。此方法利用了window.opener.document对象,该对象在IE7、IE8中似乎不支持(本人已测试,具体效果可能因机器而异)。通过判断浏览器类型,给父页面的隐藏域赋值,再由父页面进行处理。代码如下:


function returnValue(flag)
 {
 document.getElementById("rValue").value=flag;
 if (window.ActiveXObject) //IE浏览器 
 {
 var myObj = window.dialogArguments;
 //alert(myObj);
 myObj.value = flag;
 window.close();
 }
 else{
 window.opener.document.getElementById("hid_oilid").value=flag;
 window.opener.document.getElementById("txt_oil").value=flag+"号";
 //self.close();
 window.close();
 } 
 }

上述遇到的问题均已解决。关于父页面与子页面之间的传值,建议参考其他相关资料以获取更多技巧。

实用工具推荐

电子包浆

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

使用 ›
图片压缩

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

使用 ›
相关文章