Как перезагрузить всплывающую панель виджета с Firefox Addon SDK? - PullRequest
5 голосов
/ 01 февраля 2012

Мой аддон открывает всплывающую панель (popup.html).

Когда пользователь меняет текущую вкладку на другую вкладку, всплывающая панель скрывается, пока пользователь снова не щелкнет значок надстройки. (Между тем аддон все еще «живет» на заднем плане).

Когда всплывающая панель открывается во второй раз, мне нужно, чтобы она ПЕРЕЗАГРУЗИЛА свой контентURL (popup.html), но я нашел способ сделать это.

Это может показаться простым, но у меня мало опыта с надстройкой SDK.

Любая помощь будет оценена.

Это мой код:

exports.main = function() {
  data = require('self').data;
  var tabs = require("tabs");

  var popupPanel = require("panel").Panel({
    width:550,
    height:400,
    contentURL: data.url("popup.html"),  
    contentScriptFile: [data.url("popup.js")],       
    contentScript: " "+
      "self.port.on('curTabMsg', function(curTabMsg) {" +
        "main(curTabMsg['curTab']);" +
      "});"
  }); 


  require('widget').Widget({
    panel: popupPanel,
    onClick: function() {    
      popupPanel.port.emit("curTabMsg",{'curTab': tabs.activeTab.url}); 
    }
  });
};

Ответы [ 3 ]

4 голосов
/ 04 февраля 2012

Обновить HTML-код iframe не моя проблема, в конце концов.(Мне также нужно было перезагрузить свой contentScript)

Итак, наконец, я создал новую панель при каждом нажатии виджета.

Я добавил новый файл в библиотеку myPanel.js

function getPanel(contentURL,contentScriptFile,contentScript){
    var popupPanel = require("panel").Panel({
          width:550,
          height:400,
          contentURL: contentURL,  
          contentScriptFile: contentScriptFile,       
          contentScript: contentScript
         }); 
    return popupPanel;   
}

exports.getPanel = getPanel;

И в моем main.js:

exports.main = function() {
    data = require('self').data;
    var myPanel=require("myPanel");
    var tabs = require("tabs");

    let myWidget = require('widget').Widget({
      id: "SomeId",
      label: "Some lable",
      contentURL: data.url("some.png"),
      onClick: function() { 
          var panel = myPanel.getPanel(data.url("popup.html"),[data.url("popup.js")],
                      "self.port.on('curTabMsg', function(curTabMsg) {" +
                            "main(curTabMsg['curTab']);" +
                        "});");        
          panel.show();
          panel.port.emit("curTabMsg",{'curTab': tabs.activeTab.url}); 
      }
    });
};
0 голосов
/ 22 октября 2015

Поскольку нет способа переключения contentScript вместе с pageContent, я перехожу к другому решению: все мои "страницы" - это просто разделы в одном html-файле, и все разделы скрыты (css: {display: none;}), кроме одного,И вместо того, чтобы менять контент, я просто показываю другую его часть.

Недостаток: contentScript одинаков для всех «страниц».Но все работает отлично.

0 голосов
/ 03 февраля 2012

Основываясь на совете, который я получил от Владимира Паланта и canuckistani, я заменил свой contentURL на iFrame

<iframe id="mainFrame" name="mainFrame" src="" frameborder="0" height ="100%" width="100%"></iframe>

Затем по сценарию контента я установил iFram src с новым html.

function reload(tabUrl)
{
    document.getElementById("mainFrame").src=tabUrl;
}


var popupPanel = require("panel").Panel({
          width:550,
          height:400,
          contentURL: data.url("container.html"),  
          contentScriptFile: [data.url("popup.js")],       
          contentScript: " "+
            "self.port.on('curTabMsg', function(curTabMsg) {" +
                "reload(curTabMsg['curTab']);" +
            "});"
         }); 
...