【问题标题】:Javascript passing data from child window to parent window, IE bug?Javascript将数据从子窗口传递到父窗口,IE错误?
【发布时间】:2009-04-24 00:34:50
【问题描述】:

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

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

【问题讨论】:

    标签: javascript internet-explorer garbage-collection popup


    【解决方案1】:

    不确定您到底遇到了什么,但我已经成功地在开发和生产应用程序的 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 看​​起来不会让您在弹出窗口关闭后使用它们。 :-(

    【讨论】:

    • 你是如何在开瓶器上存储数据的?具体来说,您是否通过 window.opener 存储了复杂的数据(对象、数组、日期)?
    • 我用过两件事。 1 window.opener.foo = somevalue;这会在打开的窗口中存储一个全局变量“foo”。或者我会打开一个弹出窗口并调用回调...比如说 window.opener.myCallback(someDataObj);我的开瓶器回调函数对数据做任何它想要/需要的事情。
    • 有趣。这两个例子是 IE 中的中断。当用户关闭子窗口时,opener 对数据的引用只是 f***ed。
    • 也就是说,对复杂数据类型(对象、数组、日期)的引用是 f***ed。标量类型(字符串、数字、布尔值)很好。
    • 是的,我正在尝试将复杂数据传递给父窗口。所以只是复制它会失败,克隆它也会失败,可能是因为我们试图在克隆函数中确定对象的类型。那么有没有合适的方法来做到这一点,比如 json 将对象编码为字符串并在父端解码?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2015-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-16
      • 2019-01-31
      • 1970-01-01
      相关资源
      最近更新 更多