Javascript Firefox扩展一直在后台运行

Javascript Firefox扩展一直在后台运行,javascript,firefox-addon,firefox-addon-sdk,Javascript,Firefox Addon,Firefox Addon Sdk,我创建了一个Firefox扩展,在popup.html中有iframe。 为了在iframe和main.js之间传递消息,我使用postMessage方法 收到消息时,弹出窗口的行为异常。我使用console.log获取正在接收的消息。消息获取console.log,表示多次单击扩展的次数。 例如,如果我打开了扩展4次,iframe只传递消息一次,但消息接收4次 为了让您理解,我正在一步一步地编写过程: 打开一个选项卡,然后单击extension 消息从iframe传递到main.js,main

我创建了一个Firefox扩展,在popup.html中有iframe。 为了在iframe和main.js之间传递消息,我使用postMessage方法

收到消息时,弹出窗口的行为异常。我使用console.log获取正在接收的消息。消息获取console.log,表示多次单击扩展的次数。 例如,如果我打开了扩展4次,iframe只传递消息一次,但消息接收4次

为了让您理解,我正在一步一步地编写过程:

打开一个选项卡,然后单击extension

消息从iframe传递到main.js,main.js在接收到消息后,console.js会记录相同的消息。现在此消息出现一次

单击任意位置关闭扩展。再次单击扩展>消息传递>控制台。将同一消息记录两次

重复这个过程,它会记录消息很多次,然后单击扩展名

这是Firefox的bug吗?还是我做错了什么? 编辑: 以下是my main.js中的一些片段:

if (self.port !== undefined){  
  self.port.on("show", function(a,b) {  
    myApp.initialize(a,b);  
  });
}

var myApp = {
  initialize: function (a,b){
    window.addEventListener ("message" , receiveMessage, false);
    function receiveMessage(event){
      console.log("event.data - - - - - - ",event.data);
    }
  },
  goAbc : function(){
    self.port.emit("close");
  }
}
iframe中的代码是:

$(document).ready(function(){
  parent.postMessage("getData", "*");
});
编辑:还有一个问题: 如果我在代码中的某个地方调用myApp.goAbc,它会说self.port未定义。这里有什么问题?我是否应该使用其他东西来代替self.port?

每次放映时,您都会调用myApp.initialize,这会为EventListener添加一个新的事件侦听器。所以第一次,有一个,下一次会有另一个,额外的一个,你再次调用addEventListener,总共两个,以此类推


相反,您需要准确地调用addEventListener一次,而不是每次都调用一次。

请发布一个示例代码。@nMail:我已经用代码更新了问题。请看一看提出新问题,不要使用“编辑补充”功能。尽管如此,如果你想得到好的答案或答案,那么你必须发布一个完整的、可复制的例子。猜测你的窗口和/或自我从何而来毫无意义。@N迈尔:好的。当然我对SO的提问几乎是新手,所以我对如何发布问题并不太在行嘿,谢谢。我还有一个问题,因此我再次编辑这个问题。帮帮我,我也是。谢谢: