2012-09-05 202 views
1

我使用Mozilla的附加组件生成器。我正在寻找一种方法来删除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); 
}); 

full source code

+0

如何创建监听器以禁用隐藏面板,当我点击面板时? – 2015-09-07 06:25:23

回答

1

最后我发现这个问题。这是附加套件中的一个错误。在函数removeListener的文件api-utils/lib/content/content-worker.js中,索引始终为-1。

indexOf中给出的参数是事件的名称,它搜索一个函数。这是不正确的。

所以为了解决这个问题,我用let index = listeners[name].indexOf(callback);替换let index = listeners[name].indexOf(name);

编辑

的错误已得到修复。它会在版本1.10中发布,请参阅here

+0

是的,这就是我发现的 - 你快一点。提交了[bug 788981](https://bugzilla.mozilla.org/show_bug.cgi?id=788981)。 –

+0

非常感谢修正弗拉基米尔^^。 –

相关问题