Addon SDK - 上下文菜单和页面修改工作者

Chr*_*mer 4 javascript firefox-addon-sdk

我一直在研究与页面模块进行通信的上下文菜单,并遇到问题.

只要我不刷新页面,我就可以通过右键单击发送到页面/选项卡的通信.刷新页面时,将创建一个新工作程序,并且上下文菜单无法与工作程序通信.

我现在有两个相同的工人,但就像旧工人已过期一样.这意味着onMessage中的这个循环:不起作用,因为它拾取了第一个worker.

for (index = 0; index < workers.length; index += 1) {
    if (workers[index].tab.index === tabs.activeTab.index) {
    workers[index].port.emit("rightClick", string, ss.storage.product);
    }
}
Run Code Online (Sandbox Code Playgroud)

我一直在寻找删除旧工人刷新,但似乎没有选择这样做.我从根本上错过了一些关于工人处理的事情吗?

我收到的错误是:错误:页面当前是隐藏的,在再次可见之前无法再使用.

这与以下事实是一致的:就工人而言,我现在正在查看同一选项卡中的新页面.我认为worker.on('detach',function(){})应该处理这个问题但似乎这只是关闭选项卡.

任何意见,将不胜感激.

稍微休息后添加 OK我决定使用其他地方推荐的detachWorker功能进行分离.我把它放在我的pageMod对象的顶部,如下所示

// Clean up duplicate worker
for (index in workers) {
    if(workers[index].url === worker.url && workers[index].tab.index === worker.tab.index) {
        detachWorker(workers[index], workers);
    }
}
Run Code Online (Sandbox Code Playgroud)

这解决了问题(暂时),虽然我不认为这是正确的方法.解决方案的任何进展:).

DS.*_*DS. 6

也进入这个.Worker对象似乎在过去的某些页面中保留(并且在历史记录中返回和转发时重复使用).解决方案是监听pagehidepageshow事件,以便只保留当前显示的数组:

var pageMod = require("sdk/page-mod");
var array = require('sdk/util/array');

var pageWorkers = [];
pageMod.PageMod({
  onAttach: function(worker) {
      array.add(pageWorkers, worker);
      worker.on('pageshow', function() { array.add(pageWorkers, this); });
      worker.on('pagehide', function() { array.remove(pageWorkers, this); });
      worker.on('detach', function() { array.remove(pageWorkers, this); });
      // do other work.
  }
});
Run Code Online (Sandbox Code Playgroud)

请注意,array.add函数负责不添加重复项.