2010-10-31 79 views
3

我有一個由瀏覽器覆蓋(ff-overlay.xul)組成的擴展,它通過此代碼(來自mozilla擴展生成器)啓動側邊欄(ff-sidebar.xul): (在ff- overlay.xul)在XUL組件之間發送數據

<menupopup id="viewSidebarMenu"> 
    <menuitem key="key_openSidebar_testinstallPackage" observes="viewSidebar_testinstallPackage" /> 
</menupopup> 

<keyset id="mainKeyset"> 
    <key id="key_openSidebar_testinstallPackage" command="viewSidebar_testinstallPackage" /> 
</keyset> 

<broadcasterset id="mainBroadcasterSet"> 
    <broadcaster id="viewSidebar_testinstallPackage" 
     label="&testinstallPackageSidebar.label;" 
     autoCheck="false" 
     type="checkbox" 
     group="sidebar" 
     sidebarurl="chrome://testinstallPackage/content/ff-sidebar.xul" 
     sidebartitle="&testinstallPackageSidebar.label;" 
     oncommand="toggleSidebar('viewSidebar_testinstallPackage');" /> 
</broadcasterset> 

主要覆蓋在overlay.js中js代碼: (在FF-overlay.xul)

<script src="overlay.js"/> 

的邊欄XUL有在FF-sidebar.js js代碼: (在ff-sidebar.xul)

<script src="ff-sidebar.js"/> 

我需要從overlay.js中的一些數據(一個字符串就足夠了)送FF-sidebar.js

我試圖this,但它沒有工作(我不知道如果它可以工作,它應該在主覆蓋圖和當前頁面之間)。

請爲我提供一些意思。

回答

2
+0

Thx =)「例3:使用nsIWindowMediator」的竅門。 – BenoitParis 2010-10-31 18:45:02

+2

@BenoitParis:恩,沒有。你不應該使用它。要在同一個窗口中訪問側邊欄,您的覆蓋代碼正在運行,您應該使用「在側邊欄中訪問文檔」。要以另一種方式工作,您需要「從子窗口訪問頂級文檔的元素」。無論如何,我希望你理解你的代碼最終運行的多個「範圍」或「窗口」的概念。 – Nickolay 2010-10-31 18:54:08

+0

真的是一個很好的提示,這幫助我節省了幾個小時......謝謝...... – VKGS 2012-11-23 06:00:43

1

使用nsIWindowMediator不適合您的情況。如果你需要傳遞一些數據形式overlay.js中,以FF-sidebar.js使用window.QueryInterface這樣的:

overlay.js中

var shell = { 
message : function(){ 
     var msg = "Hello"; 
     return msg; 
} 
} 


FF-SIDEBAR.JS

// put this in the function that is executed when the sidebar loads preferably 
var mainWindow = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor) 
       .getInterface(Components.interfaces.nsIWebNavigation) 
       .QueryInterface(Components.interfaces.nsIDocShellTreeItem) 
       .rootTreeItem 
       .QueryInterface(Components.interfaces.nsIInterfaceRequestor) 
       .getInterface(Components.interfaces.nsIDOMWindow); 
alert(mainWindow.shell.message); //this will alert Hello 

正如您可以注意到疊加對象在另一個範圍內可用。