window.opener
チェーンを逆方向にスキャンできます。
function getBaseOpener(win){
var opener;
do {
/// check to see if our storage property has been set, if so use it
/// this gets around the problem that the window.opener chain may have
/// been broken.
if ( win.baseOpener ) {
opener = win.baseOpener;
break;
}
/// for each window.opener we find scan backwards until we find a
/// window that has no window.opener. This should be our main window.
} while( (opener = win.opener) && (win = opener) );
/// return the result and store it for next time, this will prevent
/// problems if any of our openers are ever closed.
return (win.baseOpener = opener);
}
上記は、そのウィンドウが作成された直後に新しく開かれたウィンドウごとに 1 回実行される限り、常にベースオープナーを返す必要があります (ウィンドウチェーン全体がその時点でまだ有効です)。
明らかに、ベース ウィンドウが閉じられている場合は問題があります ;)
アップデート
申し訳ありませんが、上記は明確だと思いました。ウィンドウ間の相互通信を多く処理したことがあると思いますが、そうでない場合はそうではありません:) .
以下を配置して、開かれる各ウィンドウに読み込まれるようにします。
<script>
function getBaseOpener(win){
var opener;
do {
if ( win.baseOpener ) {
opener = win.baseOpener;
break;
}
} while( (opener = win.opener) && (win = opener) );
return (win.baseOpener = opener);
}
/// this first execution is important, it creates the baseOpener
/// property that will keep our link to the main window even
/// if our parents have been closed and reopened later on.
var mainWindow = getBaseOpener(window);
</script>
次に、ベース ウィンドウを取得する必要がある場合は、コード内の任意の場所で、次を使用します。
mainWindow
または getBaseOpener を再度実行します。
getBaseOpener(window)
これは常にベース/メイン ウィンドウ (ウィンドウ 1) を返す必要があります。ただし、ベース ウィンドウ自体から実行された場合を除きますundefined
。
使用したい場合は、次getElementById
のようにドキュメントにアクセスする必要があります。
mainWindow.document.getElementById('element_id');