2016-08-29 4 views
0

Я разрабатываю расширение FireFox с помощью JPM Addon. Я загружая панель из основного 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

Вы должны прочитать раздел «Scripting trusted panel content» в MDN sdk/panel page. Наиболее актуальный текст:

Как скрипт контента, эти сценарии могут взаимодействовать с дополнительным кодом с помощью postMessage() API или port API. Важнейшим отличием является то, что эти скрипты получают доступ к объектам postMessage и port через объект addon, тогда как скрипты контента получают к ним доступ через объект 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);'. BTW: Если вы переносите расширение Chrome, и вы еще этого не сделали, вы можете взглянуть на [WebExtensions] (https://developer.mozilla.org/en-US/Add-ons/WebExtensions) API, который очень похож на расширения Chrome. – Makyen

+0

Я использовал функцию в панели, чтобы вернуть строку на основе локализации браузера. Однако в FF кажется, что вам нужно использовать require ('sdk/l10n'). Get, который доступен только через файл index.js. Мне нужно выяснить, как вызвать функцию локализации. –