2009-04-24 4 views
6

부모에게 데이터를 다시 제공하는 팝업 창이 있습니다. window.opener.document.data = data_from_popup;Javascript가 자식 창에서 부모 창으로 데이터를 전달하는 중 IE 버그?

잘 작동하지만 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,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()를 호출하여 복사하면 ... 그 중 하나가 작동하지 않습니다 ...!

IE를 만들지 않아도 팝업이 닫힌 후 사용할 수 있도록 보이지 않으므로 (요소 또는 DOM을 구성하는 데 필요한) 값을 저장해야 할 것입니다. :-(

+0

오프너에 어떻게 데이터를 저장 했습니까? 특히 window.opener를 통해 복잡한 데이터 (객체, 배열, 날짜)를 저장 했습니까? –

+0

2 일 window.opener.foo = somevalue; 이로써 여는 창에 전역 변수 "foo"를 저장하거나 팝업 창을 열고 콜백 ... window.opener를 호출합니다.myCallback (someDataObj); 내 오프너 콜백 함수는 데이터로 원하는/수행해야하는 모든 작업을 수행합니다. – scunliffe

+0

흥미 롭습니다. 이 두 가지 예는 IE에서 깨는 내용입니다. 사용자가 자식 윈도우를 닫으면 데이터에 대한 오프너의 참조가 삭제됩니다. – JPot

2

마침내 나는 json 인코딩을 사용하여 팝업 창에서 부모에게 전달하려고했습니다. 전달 된 데이터는 간단한 문자열이며 문제없이 복사 할 수 있습니다. 부모 측에서는 json으로 인코딩 된 문자열을 자바 스크립트 객체로 평가합니다.

관련 문제