我使用Mozilla的附加构建器。我正在寻找一种方法来删除contentScript中的事件监听器。我使用端口方式在附加脚本代码和内容脚本代码之间进行通信。
问题是事件“响应”的回调被多次调用。我希望它被调用一次并在事件节目的回调中声明。
有人可以帮我吗?
main.js
代码:
var Panel = require("panel").Panel;
var popup_panel = Panel({
width: 286,
height: 340,
contentURL: require("self").data.url("popup.html"),
allow: { script: true },
contentScriptWhen: "end",
contentScriptFile : [
require("self").data.url("test.js")
],
onShow: function(){
this.port.emit("show");
var pan = this;
this.port.on("hide", function(){pan.hide();});
}
});
var Widget = require("widget").Widget;
var widget = Widget({
id: "mozilla-icon",
label: "My Mozilla Widget",
contentURL: "http://www.mozilla.org/favicon.ico",
panel: popup_panel
});
popup_panel.port.on("get", function(){
popup_panel.port.emit("response");
});
内容脚本(test.js
):
self.port.on("show", function(){
console.log("show");
function response(){
console.log("reponse called");
}
self.port.emit("get");
self.port.once("response", response);
self.port.removeListener("response", response);
});
答案 0 :(得分:1)
最后我发现了问题。这是附加工具包中的一个错误。在函数removeListener的文件api-utils / lib / content / content-worker.js中,索引始终为-1。
indexOf中给出的参数是事件的名称,它搜索一个函数。这是不正确的。
因此,要解决此问题,请将let index = listeners[name].indexOf(name);
替换为let index = listeners[name].indexOf(callback);
。
修改强>
该错误已得到修复。它将在版本1.10中发布,请参阅here