Javascript 插件SDK-上下文菜单和页面mod workers

Javascript 插件SDK-上下文菜单和页面mod workers,javascript,firefox-addon-sdk,Javascript,Firefox Addon Sdk,我一直在开发一个上下文菜单,它与页面模块进行通信,并遇到了一个问题 只要不刷新页面,我就可以通过右键单击视图中的页面/选项卡发送通信。当我刷新页面时,将创建一个新的工作程序,并且上下文菜单无法与该工作程序通信 我现在有两个完全相同的工人,但老工人好像已经过期了。这意味着onMessage:中的这个循环不起作用,因为它拾取第一个工作进程 for (index = 0; index < workers.length; index += 1) { if (workers[index].t

我一直在开发一个上下文菜单,它与页面模块进行通信,并遇到了一个问题

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

我现在有两个完全相同的工人,但老工人好像已经过期了。这意味着onMessage:中的这个循环不起作用,因为它拾取第一个工作进程

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);
    }
}

这解决了问题(目前),尽管我认为这不是正确的方法。关于解决方案的任何进展:)。

我不确定是否了解您的问题。您提到的事件也会在重新加载选项卡时发出:

const { add, remove } = require("sdk/util/array");
const workers = [];

require("sdk/page-mod").PageMod({
  include: "*",
  contentScript: "alert('executed')",
  onAttach: function(worker) {
    add(workers, worker);
    console.log('attached: ', workers.length);

    worker.on('detach', function() {
      remove(workers, worker);
      console.log('detached: ', workers.length);
    })
  }
});
重新加载页面时,将执行分离的侦听器。无论如何,要检查选项卡与工作程序的关联是否为活动选项卡,您应该能够只比较选项卡对象:
(workers[index].tab==tabs.activeTab)
。还请注意,在附加SDK 1.14中,选项卡还具有
id
属性,因此您可以使用它来标识自己。 并且索引的
循环中…的
:检查描述部分。我宁愿使用:


零是正确的,重新加载时会发出事件
detach

但是,当我在同一选项卡中打开不同的页面时,不会发出分离事件
因此,也就是说,当我在选项卡1中加载了一些页面A,并单击在同一选项卡1中打开不同页面B的链接时,我必须手动分离页面A的工作程序(?)


我也遇到了这个。Worker对象似乎在过去的一些页面中一直存在(并且在历史中来回使用)。解决方案是侦听
pagehide
pageshow
事件,以便仅将当前显示的工作线程保留在数组中:

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.
  }
});

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

这看起来很有希望,我已经走了很长一段路,现在我将不得不回溯一点,但我会尝试一下。我认为我的问题正在显现,因为:a)我正在用pagemod观看一个页面,b)有一个上下文单击,它也会根据一个worker(在workers中)的结果修改相同的DOM。当我不执行上下文单击,而是第二次刷新页面时,问题就出现了。“页面隐藏废话废话”。当我有时间的时候,我会准备一个演示来演示。喜欢数组util!我仍然没有找到解决这个问题的方法,在任何给定刷新时,工作进程都会重新生成,导致重复。Chrome似乎通过
Chrome.extension.onRequest.removeListener()更有效地处理这个问题。
for (let worker of workers) { ... }
var workers = [];    

require('page-mod').PageMod({
  include: '*',
  contentScriptWhen: 'end',
  contentScript: [require('self').data.url('bla.js')],
  onAttach: function(worker) {
    var w = workers.length;
    while (w--) {
      if (worker.tab === workers[w].tab) {
        workers.splice(w, 1);
        break;
      }
    }
    workers.push(worker);
    // other stuff
  }
});
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.
  }
});