8

我有一个弹出窗口,可以将数据返回给它的父级。使用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()函数似乎无限递归。

你有没有经历过同样的事情,有没有办法在不使用克隆功能的情况下防止这种情况发生?

4

2 回答 2

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 看​​起来不会让您在弹出窗口关闭后使用它们。:-(

于 2009-04-24T01:33:56.110 回答
2

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

于 2009-06-01T22:13:06.303 回答