我正在使用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时,内容脚本将停止一起工作。
这是一些非常奇怪的行为......我遇到过一个错误吗?
答案 0 :(得分:1)
据我所知,面板没有“准备好”的事件,我可以听取发出信息。
我认为确实如此,至少在内部看来,但我不确定它们是否暴露出来。
但即使它没有,你可以简单地从内容脚本中发出自己的端口消息,一旦附加并注册了自己的监听器。在插件中收到该消息后,您可以继续使用该端口。