3

Firefox 侧边栏中加载了一个网页,主文档中加载了另一个网页。现在,我如何要求通过 Firefox 侧边栏访问主文档对象?通过 Firefox 侧边栏文档中的 Javascript 代码访问主文档的示例会有所帮助。

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

@PConory:

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

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

谢谢。

4

3 回答 3

2

据我所知,您实际上是在边栏中加载网站(选中“在边栏中加载此书签”)。如果是这种情况,并且侧边栏正在打开主窗口页面。您可以使用 window.postMessage 在它们之间进行通信。但是就像我说的那样,侧边栏页面必须打开主页,因为您需要窗口引用才能发布消息。

侧边栏.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 漏洞变得毫无意义。

于 2008-09-28T13:24:28.047 回答
1

从侧边栏访问主窗口比返回其他方式要复杂得多。

根据Mozilla 的开发者中心,您需要遍历的 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); 
于 2008-09-28T12:54:11.537 回答
1

您是否正在尝试编写允许侧边栏页面和标签页之间通信的页面内 javascript?哪些页面可以互相看到和交流是有限制的:

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

我不确定页面如何请求在侧边栏中打开页面,反之亦然。但是,如果您可以做到这一点,请使用var child = window.open(...)获取一个方向的参考并window.opener获取另一个方向的参考。

于 2008-09-28T15:54:30.620 回答