2009-04-24 40 views
6

Tôi đã có một cửa sổ bật lên cung cấp dữ liệu cho cha mẹ của nó. Sử dụng window.opener.document.data = data_from_popup;Javascript truyền dữ liệu từ cửa sổ con đến cửa sổ chính, lỗi IE?

Điều này hoạt động tốt trong FF, nhưng trong IE (6/7) dữ liệu có thể được truy cập trong thời gian cửa sổ bật lên vẫn được hiển thị. Khi tôi đóng cửa sổ bật lên, có vẻ như dữ liệu được thu thập rác.

Tôi đã cố gắng sử dụng một hàm clone() cho các dữ liệu nhận được từ popup:

window.opener.add_data(data_from_popup); 

và phụ huynh:

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

Nó phần nào hoạt động, nhưng trong điều kiện nhất định chức năng clone() dường như recurse vô hạn.

Bạn đã bao giờ trải nghiệm điều tương tự chưa, và có cách nào để ngăn chặn điều đó mà không cần sử dụng chức năng sao chép không?

Trả lời

6

Không chắc chắn chính xác những gì bạn đang gặp phải, nhưng tôi đã lưu thành công dữ liệu trên trình mở từ cửa sổ bật lên con thường xuyên trong IE (6,7 & 8) trong các ứng dụng phát triển và sản xuất.

bạn có URL hoặc một số mã nguồn khác mà bạn có thể cung cấp không?

trên ghi chú liên quan ... bạn không cố gắng xác định loại đối tượng trên công cụ mở ... từ cửa sổ bật lên là bạn? - có một số lỗi IE đã biết trong khu vực này.

Cập nhật:

Dưới đây là một ví dụ nhanh ...

<!--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> 

Cập nhật 2

Trong thử nghiệm dường như trong IE7, IE8 (nhưng không IE6) sau khi cửa sổ bật lên bị đóng, mọi dữ liệu tham chiếu bị mất (tham chiếu không chụp ảnh chụp nhanh) do đó nếu bạn cần dữ liệu sau khi cửa sổ bật lên bị đóng, bạn sẽ cần phải sao chép nó.

Tôi nghĩ nếu dữ liệu có thể được gói trong một mảng, nhân bản là một miếng bánh. Chỉ cần gọi .slice() để sao chép nó, nhưng ... không hoạt động hoặc!

Tôi đoán bạn sẽ cần phải lưu các giá trị mà bạn cần (hoặc để tạo thành phần tử hoặc DOM) vì IE không giống như nó sẽ cho phép bạn sử dụng chúng sau khi đóng cửa sổ bật lên. :-(

+0

Bạn lưu trữ dữ liệu trên trình mở như thế nào? Cụ thể, bạn đã lưu trữ dữ liệu phức tạp (đối tượng, mảng, ngày tháng) qua window.opener? –

+0

Tôi đã sử dụng 2 1. window.opener.foo = somevalue, nhờ đó mà lưu trữ một biến toàn cầu "foo" trên cửa sổ đang mở, hoặc tôi sẽ mở một cửa sổ popup và gọi một cuộc gọi lại ... nói window.opener.myCallback (someDataObj); nơi hàm gọi lại của tôi mở bất cứ điều gì nó muốn/cần với dữ liệu. – scunliffe

+0

Thú vị. Hai ví dụ là những gì phá vỡ trong IE. Khi người dùng đóng cửa sổ con, tham chiếu của trình mở đối với dữ liệu chỉ là f *** ed. – JPot

2

Cách cuối cùng tôi đã làm là bằng cách mã hóa json đối tượng phức tạp mà tôi muốn chuyển cho phụ huynh trong cửa sổ bật lên. bên mẹ chuỗi mã hóa json được đánh giá thành đối tượng Javascript

Các vấn đề liên quan