1

我使用 Mozilla 的 Add-on Builder。我正在寻找一种在 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);
});

完整的源代码

4

1 回答 1

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 版本中发布,请参见此处

于 2012-09-06T09:03:00.103 回答