2016-08-29 36 views
0

我正在使用JPM Addon開發FireFox擴展。我加載面板從主index.js文件是這樣的...FF Addon(JPM)從Panel的腳本傳遞消息到主索引腳本

var panel = require('sdk/panel'); 
var panel = panel.Panel({ 
    contentURL: url('pages/popup.html'), 
    onHide: doHide 
}); 

//and in another place... 
panel.show({ 
      position: button 
     }); 

的頁/ popup.html文件引用的JavaScript文件,我使用相對路徑來加載它。我需要弄清楚如何將此JavaScript文件中的消息(由面板網頁加載)傳遞到插件的主要index.js腳本文件。

我試過的postMessage以及port.emit ...

所以,要麼

//index.js 
panel = require("sdk/panel").Panel({ 
    onMessage: function(message) { 
    console.log(message); 
    } 
}); 

//popup.js - panel file 
panel.postMessage('something'); 

......或者......

//index.js 
panel.on("message", function(text) { 
    console.log(text); 
}); 

//popup.js 
self.port.emit('message', 'hello world'); 

然而,這兩個唐似乎沒有用。幫幫我!

回答

0

您應該閱讀MDN sdk/panel page中的「Scripting trusted panel content」部分。最相關的文字是:

像一個內容腳本,這些腳本可以與之通信的附加使用postMessage() API或port API代碼。關鍵區別在於這些腳本通過addon對象訪問postMessageport對象,而內容腳本通過self對象訪問它們。

所以,你popup.js代碼應該是:

addon.port.emit('message', 'hello world'); 

而且你index.js

panel.port.on("message", function(text) { 
    console.log(text); 
}); 

有一個例子附加在「 Scripting trusted panel content「部分顯示可信任面板(面板內容來自附加組件)和主要背景腳本之間的雙向通信t的附加。

+0

是否可以從插件腳本調用函數?實際上,我正在移植一個Chrome擴展程序,並且無法使用我需要的回調。 –

+1

@ShahidThaika,消息傳遞是異步的(可能從一個進程到另一個進程)。 Chrome也是如此。如果你的意思是一個同步函數來從附加腳本發送*消息,那麼是的。對於上面的代碼,這將是'panel.port.emit(nameOfMessage,message);'。順便說一句:如果您正在移植Chrome擴展程序,但您尚未這樣做,則可能需要查看[WebExtensions](https://developer.mozilla.org/en-US/Add-ons/WebExtensions) API,與Chrome擴展程序非常相似。 – Makyen

+0

我在面板中使用了一個函數來根據瀏覽器的本地化返回一個字符串。然而,在FF中,似乎你需要使用require('sdk/l10n')。get,它只能通過index.js文件訪問。我需要弄清楚如何調用本地化功能。 –

相關問題