2009-04-24 190 views
6

我有一个弹出式窗口,将数据返回给它的父项。使用window.opener.document.data = data_from_popup;JavaScript将数据从子窗口传递给父窗口,IE bug?

这在FF中可以很好地工作,但在IE(6/7)中,仍可以在弹出窗口仍显示时访问数据。当我关闭弹出窗口时,它看起来像数据被垃圾收集。

我试着使用克隆()函数从弹出接收到的数据:

window.opener.add_data(data_from_popup); 

,并在父:

function add_data(data_from_popup) { 
data = clone(data_from_popup); 
} 

它有点工作,但在一定条件下clone()函数似乎无限递归。

你有没有经历过同样的事情,有没有一种方法来防止这种情况,而不使用克隆功能?

回答

6

不确定你正在经历什么,但是我已经在开发和生产应用程序中定期在IE浏览器(6,7 & 8)中从子弹出窗口成功地将数据存储在开启器中。

你有一个URL或一些你可以提供的源代码吗?

在一个相关的说明...你不是试图确定开启器上的对象的类型...从弹出是你? - 这个地区有一些已知的IE漏洞。

更新:

这里有一个简单的例子...

<!--main window--> 
<script> 
    function getThing(id){ 
    url = 'http://mysite.com/...whatever...'; 
    features = 'locationbar=X,menubar=Y...'; 
    window['popup4'+id] = open(url, 'someNameWithoutSpaces', features); 
    } 
    function popupCallback(data){ 
    alert('I got data back! ' + data); 
    document.getElementById('someID').innerHTML = '<b>' + data.label + ' (' + data.id + ')</b>'; 
    //close the popup (now that we have/are done with the data) 
    window['popup4someID'].close(); 
    } 
</script> 
<div id="someID">{Nothing Selected Yet}</div> 
<input type="button" value="Pick One" onclick="getThing('someID');"/> 

<!--popup window--> 
<script> 
    function saveSelection(){ 
    //acquire data however you want/need 
    var selData = {}; 
    selData.id = 123456; 
    selData.label = 'iPod Touch (Jeff Atwood Edition)'; 
    //call callback on opener 
    window.opener.popupCallback(selData); 
    } 
</script> 

更新2

在测试看来在IE7,IE8(但不是IE6)弹出窗口关闭后,任何参考数据丢失(参考文献不捕捉快照),因此如果您在弹出窗口关闭后需要数据,则需要克隆它。

我想如果数据可以包装在一个数组中,克隆是一块蛋糕。只需调用.slice()就可以复制它,但是...那也行不通

我想你会需要保存你需要的值(无论是表单元素还是DOM),因为IE看起来不会让你在弹出关闭后使用它们。 :-(

+0

你是如何在opener上存储数据的?具体来说,你是否通过window.opener存储了复杂的数据(对象,数组,日期)? – 2009-04-24 02:16:30

2

我终于做到这一点的方式是通过json编码复杂的对象,我想传递给父窗口在弹出窗口。传回的数据然后是一个简单的字符串,可以复制没有问题。 parent方面的json编码的字符串被评估为一个Javascript对象

相关问题