最近碰到一个问题,在showModalDialog打开的模态窗口中,再open一个新窗口,会出现session丢失。
原因:在模态窗口中使用open,IE默认这是一个新窗口,会重新开启session,所以新窗口取不到父窗口的session对象。
根据微软给出的解决方案,是将最初的非模态窗口的window对象传递给模态串口,在用这个window对象来open新窗口。
可以做个简单的测试一下:
a.asp -- 原始窗口(非模态)
b.asp -- 模态窗口,有a.asp通过showModalDialog方式打开
c.asp -- open打开的窗口
=== a.asp ===
<span>sessionId=<%=Session.sessionId%></span>
<span onclick="showModalDialog('b.asp',window,'')">show b.asp</span>
=== b.asp ===
<span>sessionId=<%=Session.sessionId%></span>
<span onclick="dialogArguments.window.open('c.asp','','')">open c.asp</span>
== c.asp ===
<span>sessionId=<%=Session.sessionId%></span>
就是说,其实是用a.asp的window对象打开的c.asp,所以才不会丢失session
但是,项目中往往碰到的并不会这么简单,通常情况是有参数传递,以及父子页面传值与返回的。
再做个简单的测试,还是这三个:
a.asp -- 原始窗口(非模态)
b.asp -- 模态窗口,有a.asp通过showModalDialog方式打开
c.asp -- open打开的窗口
=== a.asp ===
<script>
var paramObj;
function showB(){
var obj=new Object();
obj.p1="aaa";
obj.p2="bbb";
obj.windowObj=window;
paramObj=window.showModalDialog("b.asp",obj,"");
}
</script>
<span>sessionId=<%=Session.sessionId%></span>
<span onclick="showB()">show b.asp</span>
=== b.asp ===
<script>
function openC(){
var returnObj=dialogArguments.obj;
returnObj.p3="ccc";
window.returnValue=returnObj; //向父页面传值
window.close(); //关闭模态窗口,给父页面参数赋值
dialogArguments.windowObj.open("c.asp","","");
}
</script>
<span>sessionId=<%=Session.sessionId%></span>
<span onclick="openC()">open c.asp</span>
=== c.asp ===
<script>
alert(window.opener.paramObj.p3); //取a.asp页面值
</script>
<span>sessionId=<%=Session.sessionId%></span>
注:以上代码,因为没有IIS,所以没有测试过。如有写错的地方,请自己修正一下。