浅析IE弹出窗口之session的控制

最近碰到一个问题,在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,所以没有测试过。如有写错的地方,请自己修正一下。

 

 

你可能感兴趣的:(session,object,IE,测试,IIS,微软)