关于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下会出现参数错误。花了很长时间才找到的哦!
本文出自 “守望者的技术日记和六..” 博客,请务必保留此出处http://dannyyuan.blog.51cto.com/212520/240940