2008-09-28 91 views
3

有一個網頁加載在Firefox側邊欄中,另一個網頁加載在主文檔中。現在,我如何通過Firefox側欄訪問主文檔對象?通過firefox側欄文檔中的Javascript代碼來訪問主文檔的例子是很有幫助的。DOM的Firefox邊欄和文檔對象

感謝您的答案。但我必須改進我的問題。主窗口加載了一些網頁,側邊欄有一個網頁。我想讓側邊欄窗口知道當側欄窗口上的鏈接被點擊時用戶在主窗口上選擇了哪些文本。我知道如何從窗口中獲取選定的文本。只有側欄元素增加了我無法超越的問題的複雜性。

@PConory:

我喜歡你的答案,但是當我嘗試它有一個錯誤:

Error: Permission denied to create wrapper for object of class UnnamedClass.

感謝。

回答

1

從側邊欄訪問主窗口要比以其他方式更復雜。

DOM樹,你需要遍歷,根據Mozilla's developer centre是:

#document 
    window     main-window 
    ... 
     browser 
     #document 
      window   sidebarWindow 

從上面的鏈接,下面的代碼將讓你得到在mainWindow對象:

var mWin = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor) 
       .getInterface(Components.interfaces.nsIWebNavigation) 
       .QueryInterface(Components.interfaces.nsIDocShellTreeItem) 
       .rootTreeItem 
       .QueryInterface(Components.interfaces.nsIInterfaceRequestor) 
       .getInterface(Components.interfaces.nsIDOMWindow); 
+0

但是,這不適用於* web *頁面。此代碼適用於側欄中的頁面有特權(即擴展的一部分)的情況。 – Nickolay 2008-09-28 21:47:46

2

據我所知,你實際上是在邊欄中加載一個網站(選中'在Sidebar中加載這個書籤')。如果是這種情況,並且側邊欄打開主窗口頁面。您可以使用window.postMessage在它們之間進行通信。但正如我所說,側邊欄頁面必須打開主頁面,因爲您需要窗口引用才能發佈消息。

sidebar.js

var newwin = window.open('http://otherpage') 
newwin.onload = function() 
{ 
newwin.postMessage('Hey newwin', 'http://sidebar'); 
}; 

mainpage.js 
window.addEventListener('message',function(e) 
{ 
if(message.origin == 'http://sidebar') 
    alert('message from sidebar'); 
},false); 

使用這個你還沒有訪問該文檔,但你想要做的任何更改他們和腳本出來之間可以相互通信。

編輯:把一些更多的想法,如果你從側欄打開窗口,你會有它的DOM。 var newwin = window.open('blah'); newwin.document使洞postMessage事情變得毫無意義。

1

您是否正在嘗試編寫頁內JavaScript,以便在側邊欄頁面和標籤頁之間進行通信?對於哪些頁面可以看到彼此並進行通信有限制:

  • 如果頁面不在同一個域中,則不允許他們說話(同域限制)。
  • 如果一個頁面沒有打開另一個頁面,那麼這兩個頁面都無法獲取對另一個頁面的引用。

我不確定頁面可以如何請求在側邊欄中打開頁面,反之亦然。但是如果您可以管理,使用var child = window.open(...)獲取參考一個方向和window.opener以獲得另一個方向的參考。

+0

頁面無法打開側欄,但側欄頁面可以打開新標籤頁,或者像您建議的那樣使用window.open彈出。 – 2008-09-28 17:19:53