4

ページ mod と通信し、問題に直面するコンテキスト メニューに取り組んでいます。

ページを更新しない限り、ビュー内のページ/タブを右クリックして通信を送信できます。ページを更新すると、新しいワーカーが作成され、コンテキスト メニューがワーカーと通信できません。

現在、同一のワーカーが 2 つありますが、古いワーカーの有効期限が切れたようです。つまり、 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);
    }
}

更新時に古いワーカーを削除しようとしていましたが、そうするオプションがないようです。労働者の扱いについて根本的に何かが欠けていますか?

私が受け取ったエラーは次のとおりです: エラー: ページは現在非表示になっており、再び表示されるまで使用できません。

これは、ワーカーに関する限り、同じタブで新しいページを見ているという事実と一致しています。worker.on('detach', function(){}) がこれを処理するはずだと思っていましたが、これはタブを閉じたときだけのようです。

アドバイスをいただければ幸いです。

追加 OK 少し休憩した後、別の場所で推奨されている detachWorker 関数を detach に使用することにしました。以下のように 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);
    }
}

これは(今のところ)問題を解決しますが、正しいアプローチではないと思います。解決策の進歩:)。

4

3 に答える 3

1

問題が発生したかどうかわかりません。あなたが言及したイベントdetachは、タブがリロードされたときにも発行されます。

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)。Add-on SDK 1.14 では、タブにもidプロパティがあるため、それを使用して自分自身を識別できることにも注意してください。また、for…inインデックスのループは推奨されません: https ://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/for...の説明セクションを確認してください。私はむしろfor…of を使用したいと思います:

for (let worker of workers) { ... }
于 2013-04-01T17:31:06.473 に答える