Firefox的Sidebar和Document对象

时间:2008-09-28 12:31:03

标签: javascript firefox sidebar

在Firefox侧边栏中加载了一个网页,并在主文档中加载了另一个网页。现在,如何通过Firefox侧栏请求访问主文档对象?通过firefox侧边栏文档中的Javascript代码执行此操作以访问主文档的示例将会很有帮助。

感谢您的回答。但是,我必须改进我的问题。主窗口加载了一些网页,侧边栏有一个网页。我希望侧边栏窗口在单击侧边栏窗口上的链接时知道用户在主窗口上选择了哪些文本。我知道如何从窗口中获取所选文本。只有侧边栏元素增加了我无法超越的问题的复杂性。

@PConory:

我喜欢你的答案,但是当我尝试它时会出现错误:

  

错误:拒绝为类的对象创建包装器的权限   UnnamedClass。

感谢。

3 个答案:

答案 0 :(得分:2)

据我所知,您实际上是在侧边栏中加载了一个网站(选中了“在补充工具栏中加载此书签”)。如果是这种情况,请参阅侧栏是否打开主窗口页面。您可以使用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使得post postMessage的事情毫无意义。

答案 1 :(得分:1)

从侧边栏访问主窗口比回到另一个方向要复杂得多。

根据Mozilla's developer centre,您需要遍历的DOM树是:

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

答案 2 :(得分:1)

您是否正在尝试编写允许侧边栏页面和标签页之间进行通信的页内JavaScript?哪些页面可以看到彼此并进行通信存在限制:

  • 如果页面不在同一个域中,则不允许他们说话(同域限制)。
  • 如果一个页面没有打开另一个页面,则任何一个页面都无法获取对另一个页面的引用。

我不确定页面如何请求在侧边栏中打开页面,反之亦然。但是如果你可以管理它,使用var child = window.open(...)获取一个方向的引用,window.opener来获取另一个方向的引用。