本文记录在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();
}
}
上述遇到的问题均已解决。关于父页面与子页面之间的传值,建议参考其他相关资料以获取更多技巧。