Firefox的侧边栏和DOM的Document对象

时间:2020-03-06 14:50:41  来源:igfitidea点击:

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

感谢回答。但是,我必须细化我的问题。主窗口加载了一些网页,侧边栏包含了一个网页。我希望侧边栏窗口知道单击侧边栏窗口上的链接时用户在主窗口上选择了什么文本。我知道如何从窗口中获取选定的文本。只是侧边栏元素增加了我无法克服的问题的复杂性。

@PConory:

我喜欢回答,但尝试时出现错误:

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

谢谢。

解决方案

从侧边栏访问主窗口比从另一侧返回要困难得多。

根据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);

据我所知,我们实际上是在侧边栏中加载网站(选中了"在侧边栏中加载此书签")。在这种情况下,如果侧边栏正在打开主窗口页面,则为AND。我们可以使用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变得毫无意义。

我们是否正在尝试编写允许在侧边栏页面和标签页之间进行通信的页内JavaScript?哪些页面可以互相查看和通信有限制:

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

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