8

親にデータを返すポップアップウィンドウがあります。使用するwindow.opener.document.data = data_from_popup;

これは FF ではうまく機能しますが、IE (6/7) では、ポップアップがまだ表示されている間、データにアクセスできます。ポップアップを閉じると、データがガベージ コレクションされるように見えます。

popup から受け取ったデータに clone() 関数を使用しようとしました:

window.opener.add_data(data_from_popup);

そして親で:

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

ある程度は機能しますが、特定の条件では、clone()関数は無限に再帰するようです。

同じことを経験したことがありますか?クローン機能を使用せずにそれを防ぐ方法はありますか?

4

2 に答える 2

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() を呼び出してコピーするだけですが...それも機能しません!

IEはポップアップが閉じた後にそれらを使用できるように見えないため、必要な値を保存する必要があると思います(要素またはDOMを形成するため)。:-(

于 2009-04-24T01:33:56.110 に答える
2

私が最終的に行った方法は、ポップアップ ウィンドウで親に渡したい複雑なオブジェクトを json エンコードすることです。返されるデータは単純な文字列であり、問​​題なくコピーできます。親側では、json でエンコードされた文字列が Javascript オブジェクトに評価されます。

于 2009-06-01T22:13:06.303 に答える