【问题标题】:Firefox Sidebar and Document object of DOMDOM 的 Firefox Sidebar 和 Document 对象
【发布时间】:2010-09-13 19:57:15
【问题描述】:

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

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

@PConory:

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

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

谢谢。

【问题讨论】:

    标签: javascript firefox sidebar


    【解决方案1】:

    据我所知,您实际上是在边栏中加载网站(选中“在边栏中加载此书签”)。如果是这种情况,并且侧边栏正在打开主窗口页面。您可以使用 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 的漏洞变得毫无意义。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 然而,这不适用于 web 页面。此代码适用于侧边栏中的页面具有特权(即是扩展程序的一部分)的情况。
      【解决方案3】:

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

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

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

      【讨论】:

      • 一个页面不能打开一个侧边栏,但是一个侧边栏页面可以打开一个新标签,或者像你建议的那样弹出 window.open。
      猜你喜欢
      • 2012-01-19
      • 2019-04-21
      • 2012-03-29
      • 2011-04-19
      • 2015-09-16
      • 2010-12-22
      • 2016-06-03
      • 1970-01-01
      • 2019-12-19
      相关资源
      最近更新 更多