为什么我的加载面板的内容脚本在更改contentUrl后不再响应端口消息?

时间:2015-03-09 22:51:57

标签: javascript firefox-addon firefox-addon-sdk

我正在使用addon-sdk构建Firefox附加组件。

该插件有一个按钮,可在点击时显示面板。该面板有一个运行它的内容脚本。现在,我需要根据用户的当前标签显示不同的面板,并偶尔显示外部网址。

因此,main.js脚本跟踪用户的当前选项卡,并使用panel.port.emit()将消息发送到内容脚本,内容脚本更改面板的HTML以匹配所需的任何内容。

但是,正如我所提到的,有时候面板只显示一个外部网址,所以我需要将其重置回原来的网址。这是我的代码:

function panelListMode(currentTab, data){

  panel.resize(350,300);

  //This is the line causing the trouble
  panel.contentURL = self.data.url("panel.html");

  console.log("sending message");
  panel.port.emit("generateList",data);
}

如果我在更改contentURL后发出消息,则内容脚本似乎没有收到任何内容。我现在该特定行是引起问题的行,因为如果我对其进行评论,则内容脚本会收到该消息。

有些东西告诉我这是因为面板需要再次加载DOM,我需要等到它准备就绪,然后内容脚本才能执行任何操作。但是......除了刚才包含的脚本之外,还没有内容脚本吗?

据我所知,小组没有准备好"我可以听到发出信息的各种事件。

我错过了什么?

编辑经过一些实验,我能够找到更多。如果我将panel.html复制到与panel2.html相同的目录并更改我的功能,那就是:

function panelListMode(currentTab, data){

  panel.resize(350,300);

  //This is the line causing the trouble
  panel.contentURL = self.data.url("panel2.html");

  console.log("sending message");
  panel.port.emit("generateList",data);
}

问题已经消失。我已经尝试了一下,当我尝试将contentURL更改为面板中已设置的html时,内容脚本将停止一起工作。

这是一些非常奇怪的行为......我遇到过一个错误吗?

1 个答案:

答案 0 :(得分:1)

  

据我所知,面板没有“准备好”的事件,我可以听取发出信息。

我认为确实如此,至少在内部看来,但我不确定它们是否暴露出来。

但即使它没有,你可以简单地从内容脚本中发出自己的端口消息,一旦附加并注册了自己的监听器。在插件中收到该消息后,您可以继续使用该端口。