代码之家  ›  专栏  ›  技术社区  ›  mtourne

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

  •  6
  • mtourne  · 技术社区  · 17 年前

    我有一个弹出窗口,可以将数据返回给它的父级使用 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 回复  |  直到 17 年前
        1
  •  6
  •   scunliffe    17 年前

    不确定您具体体验到了什么,但我已经在开发和生产应用程序的IE(6,7&8)中成功地定期从子弹出窗口将数据存储在opener上。

    你有一个网址或更多的源代码,你可以提供吗?

    关于一个相关的问题你不是想确定开瓶器上的对象类型从弹出窗口看到的是你吗-这一带有一些已知的虫子。

    更新:

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

    <!--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看起来不允许你在弹出窗口关闭后使用它们:-(

        2
  •  2
  •   mtourne    17 年前

    我最终的方法是通过json编码我想在弹出窗口中传递给父对象的复杂对象然后,传回的数据是一个简单的字符串,可以毫无问题地复制在父端,json编码的字符串被计算为Javascript对象。