我的 Firefox 扩展提供了一个 JavaScript 函数,网站可以使用它来访问插件功能。网站调用此函数并提供两个回调。
网站代码:
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");
}
};
这在第一次调用时效果很好,但是下次网站调用 doStuff() 时,新的侦听器会加起来,并且 alert() 会执行两次。下次三个警报,依此类推。
知道如何优雅地避免听众加起来吗?我可以完全清除事件类型吗?
到目前为止没有什么效果:
- 改为使用
self.port.once(..)
,因为我有两个回调事件:只有一个被清除的回调事件,另一个保留并与下一个相加。 - 在注册新的监听器之前,用 删除旧的监听器
self.port.removeListener
,因为我没有旧的回调引用。
问题似乎类似于如何删除事件侦听器?,只是他使用了一个回调监听器,因此可以使用self.port.once(..)
.