2008-09-28 100 views
3

有一个网页加载在Firefox侧边栏中,另一个网页加载在主文档中。现在,我如何通过Firefox侧栏访问主文档对象?通过firefox侧栏文档中的Javascript代码来访问主文档的例子是很有帮助的。DOM的Firefox边栏和文档对象

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

@PConory:

我喜欢你的答案,但是当我尝试它有一个错误:

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

感谢。

回答

1

从侧边栏访问主窗口要比以其他方式更复杂。

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

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

但是,这不适用于* web *页面。此代码适用于侧栏中的页面有特权(即扩展的一部分)的情况。 – Nickolay 2008-09-28 21:47:46

2

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

1

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

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

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

+0

页面无法打开侧栏,但侧栏页面可以打开新标签页,或者像您建议的那样使用window.open弹出。 – 2008-09-28 17:19:53