我的Firefox扩展提供了JavaScript功能,网站可以使用该功能访问附加功能。网站调用这个函数并提供两个回调。Firefox扩展(SDK)中的内容脚本添加了事件侦听器
网站代码:
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(),新侦听器添加up和alert()会执行两次。下一次三次警报,等等。
任何想法如何优雅地避免听众加起来?我可以完全清除事件类型吗?
至今没有制定什么:
- 使用
self.port.once(..)
代替,因为我有两个回调事件:只有回击被清除,另外一个保持,而且与下增加了一个。 - 在注册新的侦听器之前,用
self.port.removeListener
删除旧的侦听器,因为我没有旧的回调引用。
问题似乎类似于How to remove an event listener?,只能说他使用一个回调监听,因此可以使用self.port.once(..)
。
是的,'unsafeWindow'是不安全的,我读过http://bit.ly/rJbtA2,但是'document.body.appendChild(script)'对我来说好像不太好... – Hannobo