5

我有一个文件覆盖overlay.xulbrowser.xul. 我想以与 chrome 扩展中实现的方式类似的方式实现消息传递。

chrome.manifest-

content helloworld content/
overlay chrome://browser/content/browser.xul    chrome://helloworld/content/overlay.xul
overlay chrome://navigator/content/navigator.xul    chrome://helloworld/content/overlay.xul


skin    helloworld  classic/1.0 skin/
style   chrome://global/content/customizeToolbar.xul    chrome://helloworld/content/overlay.css

我如何注册content_script.js在我的情况下是overlay.js哪个?

Overlay.xul -

 <script type="application/x-javascript" src="chrome://helloworld/content/jquery.js" />
 <script type="application/x-javascript" src="chrome://helloworld/content/overlay.js" />
 <script type="application/x-javascript" src="chrome://helloworld/content/background.js" />

现在在我的内部我overlay.js正在使用 -

document.documentElement.addEventListener('click', function(e) {

     messageManager.sendAsyncMessage('MyMessenger.MyMessage', {});

}, true);

而且是background.js——

 addMessageListener("MyMessenger.MyMessage", function(obj) {

    Firebug.Console.log(obj.name);
}, true);
  • 消息传递的正确语法是什么?
  • 如何配置内容脚本和浏览器脚本之间的连接?
4

1 回答 1

0

如果您真正感兴趣的只是注入内容脚本并与之通信,那么使用Add-on SDK应该更容易,尤其是page-mod。它允许轻松注入内容脚本并提供一种通信方式(请参阅我提到的文档中的“使用内容脚本通信”部分)。

至于messageManager,它适用于多进程环境,但也适用于当前的单进程 Firefox。上面代码的主要问题是:addMessageListener不是全局函数,你应该调用messageManager.addMessageListener(). 但是使用messageManager在加载到相同命名空间并且可以直接相互调用的脚本之间传递消息无论如何都是一种矫枉过正。

要与当前选项卡中的内容脚本通信,覆盖中的脚本将执行以下操作:

gBrowser.selectedBrowser.messageManager.sendAsyncMessage('MyMessenger.MyMessage', {});

并且内容脚本确实具有addMessageListener全局功能,因此应该可以:

addMessageListener("MyMessenger.MyMessage", function(obj) {
  console.log(obj.name);
});
于 2011-11-25T09:03:38.780 回答