Javascript从子窗口传递数据到父窗口,IE bug?

时间:2009-04-24 00:34:50

标签: javascript internet-explorer garbage-collection popup

我有一个弹出窗口,可以将数据提供给其父级。使用window.opener.document.data = data_from_popup;

这在FF中运行良好,但在IE(6/7)中,可以在弹出窗口仍然显示的时候访问数据。当我关闭弹出窗口时,看起来数据会被垃圾收集。

我尝试对从弹出窗口收到的数据使用clone()函数:

window.opener.add_data(data_from_popup);

并在父母:

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

它有点奏效,但在某些情况下,clone()函数似乎无限递归。

您是否经历过相同的事情,有没有办法在不使用克隆功能的情况下阻止它?

2 个答案:

答案 0 :(得分: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看起来不会让你在弹出窗口关闭后使用它们。 : - (

答案 1 :(得分:2)

我最终做到的方式是通过json编码我希望传递给弹出窗口中的父对象的复杂对象。传回的数据是一个简单的字符串,可以毫无问题地复制。在父端,json编码的字符串被评估为Javascript对象。