2009-04-24 189 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對象

相關問題