2014-01-06 2 views
0

Моя надстройка должна сделать две вещи:содержание панели Update после щелчка на виджете в Firefox дополнения

  1. Когда я нажимаю на виджет, некоторые contentScript выполняет и некоторые данные возвращаются надстройка
  2. Эти данные должны быть показаны на панели, прикрепленной к виджету.
  3. Если я снова нажму, данные должны быть обновлены и содержимое панели.

Вот что я имею в sdk 1.15 Mozilla.

Сообщение «из виджета» напечатано, как ожидалось, но «из панели» нет.

У меня есть два вопроса:

  1. Если я хочу, чтобы показать foo в моей панели, это правильный способ сделать это? Как обновить панель с информацией, переданной из скрипта содержимого?
  2. Почему мой postMessage не получает сообщение, которое отправил мой Виджет?

    var widgets = require('sdk/widget'); 
    var tabs = require('sdk/tabs'); 
    var self = require('sdk/self'); 
    var data = require('sdk/self').data; 
    
    var requestsPanel = require('sdk/panel').Panel({ 
        width:215, 
        height:160, 
        contentURL: data.url('requests.html'), //this is just dummy data 
    }); 
    
    // try to receive data DOESN'T WORK 
    requestsPanel.on('message', function (foo) { 
        console.log('from panel', foo); 
    }); 
    
    var widget = widgets.Widget({ 
        id: 'div-show', 
        label: 'Show requests', 
        contentURL: data.url('favicon.ico'), 
        panel: requestsPanel, 
        onClick: function() { 
         worker = tabs.activeTab.attach({ 
          contentScript: "self.port.on('getData', function() {"+ 
               "var foo = [1,2,3];"+ 
               "self.port.emit('sendData', foo);"+ 
              "});" 
         }); 
         // request to check for generated requests 
         worker.port.emit('getData'); 
    
         // check the return from generated requests 
         worker.port.on('sendData', function (foo){ 
          console.log('from widget', foo); 
          requestsPanel.postMessage(foo); 
         }); 
        } 
    }); 
    

ответ

2

Panel's postMessage отправить сообщение contentScript панели. У вас нет скрипта содержимого в этом коде для панели: как вы сказали, requests.html - это просто фиктивные данные. Что вам нужно сделать, это удалить requestsPanel.on('message') из вашего кода и поместить слушателя в документ, загруженный панелью.

Чтобы быть ясно, ваш requests.html будет выглядеть так:

<!doctype html> 
<html> 
    <head> 
     <meta charset="utf-8" /> 
     <title>It's my panel</title> 
     <script> 
      addon.on('message', function(data){ 
      console.log(data) 
      }) 
     </script> 
     </head> 
    <body> 
    </body> 
</html> 

Таким образом, вы можете легко обновить любой DOM элемент самого документа, как только вы получите данные. Обратите внимание, что я использовал объект addon. Как вы можете прочитать из приведенной выше документации, для «доверенного контента» (документ, который поставляется вместе с надстройкой, поэтому из папки данных) вам не нужно добавлять сценарий содержимого, но вы можете сами использовать скрипт документа , и с объектом addon для обмена сообщениями. Объект addon ведет себя как self в сценарии содержимого.

Я также предлагаю вам использовать contentScriptFile в вашем виджетах, а не contentScript, особенно если вы хотите отправить на addons.mozilla.org. И вы должны объявить worker, иначе будет необъявленная глобальная переменная - теперь лучше в настоящее время иметь "use strict" в начале нашего JS-файла, чтобы иметь строгий режим.

Помните также, что как только вы пишете код для дополнения Firefox, вы можете воспользоваться преимуществами всех функций ES6 уже реализованы в браузере, как деструктурирующего назначение, пусть, Const, стрелки функции, и так далее.

Так, например, вместо:

var self = require('sdk/self'); // this is useless also in the current code 
var data = require('sdk/self').data; 

Вы можете:

const { data } = require('sdk/self'); 

И вместо:

worker.port.on('sendData', function (foo){ 
     console.log('from widget', foo); 
     requestsPanel.postMessage(foo); 
    }); 

Вы могли бы:

worker.port.on('sendData', foo => { 
     console.log('from widget', foo); 
     requestsPanel.postMessage(foo); 
    }); 

И если удалить журнал, то это будет просто:

worker.port.on('sendData', foo => requestsPanel.postMessage(foo)); 

Надеется, что это помогает!

+0

У меня все еще не было времени, чтобы посмотреть на эту проблему на моей стороне, но ваш ответ очень ясен. Большое спасибо. Я соглашусь, как только проведу немного на моей стороне. –

Смежные вопросы