关于IE下opener属性易变的解决方案

关于 IE opener 属性易变的解决方案
我们在父窗口和子窗口之间通常用 childl = window.open(pageUrl,’WindowTitle’,'left='+winLeft+',top='+winTop+',height='+winHeight+',width='+winWidth+',scrollbars=yes,resizable=yes');
childl.focus(); 来实现弹出窗口作选择子模块。
在子窗口中用 opener 来实现对父窗口的引用。不过我在最近一个项目用该方法实现对父窗口的 JSCRIPT 中数组进行填充时,发现 opener 工作不稳定,反复做几遍就可能出现 opener 无效的情况,这种情况还只在 IE 中出现,在 FF 中没出现过。经网络上搜索,有高人说 IE 是用类似 RPC 的机制来实现浏览窗口的通信机制的,如果窗口重复打开几遍(即便是每次都执行了关闭),可能会导致子窗口保存的 opener 是一个僵尸句柄。经过若干天的实验,无法实现突破,最后我灵机一动,何不用 model window 来实现,这样句柄易变而导致僵死的可能不就不存在了吗?再说,FF3我试了也支持showModalDialog了,跨平台问题也不存在了。
经过改写,
var ret=window.showModalDialog(pageUrl,new Array(Arr1, Arr2),'dialogLeft:'+winLeft+'px;dialogTop:'+winTop+'px;dialogHeight:'+winHeight+'px;dialogWidth:'+winWidth+'px',false);
if (ret ==null) {//
没有选择就关闭
return;
}
Arr1 = ret[0];
Arr2 = ret[1];
其中 showModalDialog 方法的第二个参数可实现父窗口 JSCRIPT 数据对象传入子窗口,在子窗口对 window.dialogArguments 属性进行引用实现读取传入的参数。示例代码如下:
var ArrTemp1 = window.dialogArguments[0];
子窗口选择好返回前只需对 window returnValue 属性赋值即可实现数据传递回父窗口了。示例代码如下:
window.returnValue = new Array(ArrTemp1, ArrTemp2);
window.close();
这样,模态子窗口(对话框)的引入实现了单线程方式,就能让该功能稳定运行了。
Tips:
1 .两个方法 open showModalDialog 的窗口位置和大小的参数格式不同。 Open left=num1,top=num2,width=num3,height=num4,scollbars=yes|no,resizable=yes|no ,而 showModalDialog 是用 dialogLeft:num1px;dialogTop:num2px;dialogWidth:num3px;dialogHeight:num4px
2 Open 方法的第二个参数是子窗口标题,我试过其中不能出现空格,否则 IE 下会出现参数错误。花了很长时间才找到的哦!

你可能感兴趣的:(IE,对话框,opener,休闲,无法引用)