簡體   English   中英

如何使用javascript從孩子的孩子訪問父母的控件?

[英]How access parent's controls from child of child using javascript?

我想從彈出窗口的子級訪問父窗口的控件,例如:

  • Window1打開Window2
  • Window2打開Window3
  • Window3打開Window2

現在,當從Window3打開Window2時,我需要從Window2訪問Window1的控件,我該怎么辦?

我試圖使用window.opener.getElementById()window.opener.opener.getElementById()感到困惑!

編輯:

在Window1中打開Window2的代碼

window.open('window2');

在Window2中打開Window3的代碼

window.location.href = 'Window3';

在Window3中打開Windows2的代碼:

window.open('window2');

在此處輸入圖片說明

由於您再次使用窗口, 因此原始的開啟器值將丟失

您必須使用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;
}

您可以通過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);
}

上面的代碼應該始終返回基本打開器,只要在創建該窗口后在每個新打開的窗口上執行一次即可(此時整個窗口鏈仍處於活動狀態)。

顯然,如果基礎窗口曾經關閉,那么您就有問題了;)

更新

抱歉,我認為上面的內容很清楚,我想這是您是否處理了Windows之間的大量相互通信-但如果不是,則不行:)無論如何,我已經添加了注釋以解釋代碼並添加了用法信息以使事情更清晰。

放置以下內容,以便將其加載到將打開的每個窗口中。

<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');

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM