2010-10-31 91 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 

正如您可以注意到叠加对象在另一个范围内可用。