1

Mozilla の Add-on Builder を使用しています。contentScript でイベント リスナーを削除する方法を探しています。ポート ウェイを使用して、アドオン スクリプト コードとコンテンツ スクリプト コードの間の通信を行います。

問題は、イベント「応答」のコールバックが複数回呼び出されることです。一度呼び出されて、イベント show のコールバックで宣言されるようにします。

誰かがそれを手伝ってくれますか?

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 に答える