私の Firefox 拡張機能は、Web サイトがアドオン機能にアクセスするために使用できる JavaScript 関数を提供しています。Web サイトはこの関数を呼び出し、2 つのコールバックを提供します。
ウェブサイト コード:
function onButtonClick() {
var callbackSuccess = function() { alert("Yeah!"); };
var callbackError = function() { alert("Oh no!"); };
if (window.magicAddon) { // Check if my addon is installed
magicAddon.doStuff(callbackSuccess, callbackError);
}
}
コンテンツ スクリプト:
unsafeWindow.magicAddon = {
doStuff: function(callbackSuccess, callbackError) {
// Bind the two callbacks to events. The addon will fire one of them
self.port.on("doStuffSuccess", callbackSuccess);
self.port.on("doStuffError", callbackError);
// Fire the event that lets the addon do stuff
self.port.emit("doStuff");
}
};
これは最初の呼び出しではうまく機能しますが、次に Web サイトが doStuff() を呼び出すと、新しいリスナーが追加され、alert() が 2 回実行されます。次回は 3 つのアラートなど。
リスナーが加算されることをエレガントに回避する方法はありますか? イベントタイプを完全にクリアできますか?
これまでに機能しなかったこと:
self.port.once(..)
2 つのコールバック イベントがあるため、代わりに使用します。発生したイベントのみがクリアされ、もう 1 つのイベントは残り、次のイベントに加算されます。self.port.removeListener
古いコールバック参照がないため、新しいリスナーを登録する前に、古いものを で削除します。
問題は、イベントリスナーを削除する方法に似ているようです? 、彼は 1 つのコールバック リスナーを使用しているため、 を使用できるということだけself.port.once(..)
です。