2011-11-22 95 views
5

我有覆蓋overlay.xul覆蓋browser.xul的文件。我想以類似於Chrome擴展中實現的方式實現消息傳遞。如何在Firefox擴展中實現消息傳遞?

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); 
  • 什麼是正確的語法消息傳遞?
  • 如何配置內容腳本和瀏覽器腳本之間的連接?

回答

0

如果你所感興趣的是真正注入內容腳本,並與它通信,那麼它應該是更容易使用Add-on SDK,特別是page-mod package。它允許輕鬆注入內容腳本並提供一種通信方式(請參閱我提到的文檔中的「與內容腳本通信」一節)。

至於messageManager,它意味着多進程環境,但它也可以在當前的單進程Firefox中工作。上面代碼的主要問題是:addMessageListener不是全局函數,應該調用messageManager.addMessageListener()。但是,使用messageManager在加載到相同名稱空間的腳本之間傳遞消息,並且可以直接調用對方,這無論如何都是矯枉過正。

要在當前選項卡中的內容腳本在覆蓋腳本會做溝通:

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

和內容腳本將確實有addMessageListener作爲一個全球性的功能,所以這應該工作:

addMessageListener("MyMessenger.MyMessage", function(obj) { 
    console.log(obj.name); 
});