0

次のようなポップアップの子から親ウィンドウのコントロールにアクセスしたい:

  • からWindow1Window2が開かれます
  • からWindow2Window3が開かれます
  • からWindow3Window2が開かれます

Window2 が Window3 から開かれた場合に備えて、Window2 から Window1 のコントロールにアクセスする必要があります。

私は使用しようとしましたがwindow.opener.getElementById()window.opener.opener.getElementById()ここで混乱しています!

編集:

Window2 を開く Window1 のコード:

window.open('window2');

Window3 を開く Window2 のコード:

window.location.href = 'Window3';

Window2 を開くための Window3 のコード:

window.open('window2');

ここに画像の説明を入力

4

2 に答える 2

1

ウィンドウを再度使用しているため、元のオープナー値は失われます

ウィンドウを識別するには window.name を使用する必要があります

window3 > window.open(url, "window2",.....);
window1 > window.open(url, "window2",.....);

を使用してウィンドウに名前を付けたり、名前を変更したりできます

window.name = "window3";

これも使えます

function getOpenerWindowByName(name)
{
     var w = window;
     while(w = w.opener) if(w.name === name) return w;
     return null;
}
于 2013-01-09T08:12:56.947 に答える
0

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');
于 2013-01-09T07:58:07.920 に答える