10

テキストを1か所に収集するために、ポップアップのリソースであるデータベースに(コンテンツスクリプトを使用して選択を処理する)任意のWebページのテキストを記録したいと考えています。

私がしようとしているのは、ポップアップページでデータベースを作成し、コンテンツスクリプトから管理しようとしていますが、ポップアップはクロムメッセージングを使用してアクティブではありません (開かれていません) が、ポップアップがコンテンツスクリプトからメッセージを受け取るようにすることはできません。

この問題を解決するためにメッセージングを使用するかどうかはわかりません。より良い解決策はありますか?

4

1 に答える 1

26

非表示のポップアップのコンテキストは非アクティブ (閉じている) ため、コンテンツ スクリプトは非表示のポップアップにメッセージを送信できません。

あなたの問題にはいくつかの解決策があります。

オプション 1: メッセージ パッシングなし、ストレージ イベントを使用

chrome.storage「データベース」が実際には単純なキーと値のストアである場合は、 APIに切り替えてください。この API はコンテンツ スクリプトポップアップで使用でき、値の変更を通知するイベントが付属しています。

例:

// Get notified of changes (in the popup?)
chrome.storage.onChanged.addListener(function(changes, areaName) {
    // Do whatever you want with the changes.
});
// Initialization of the popup (print initial information?)
chrome.storage.local.get({keyName: 'defaultValue'}, function(items) {
    // Do something with items.keyName
});

// Content script, storage (remember document title?)
chrome.storage.local.set({keyName: document.title});

オプション 2: バックグラウンド/イベント ページにメッセージを渡す

ポップアップと背景/イベントページは同じプロセスを共有します。ポップアップに関連付けられたデータベースはバックグラウンド ページでも利用でき、その逆も同様です。この方法の概要:

  1. コンテンツ スクリプトは、バックグラウンド ページにメッセージを送信します。
  2. 背景ページはデータベースに値を保存します
  3. ポップアップが開いている場合は、ポップアップのビューを更新します。
  4. ポップアップが開いている場合(以前に閉じていた場合)、データベースを (直接、または を使用してバックグラウンド ページからデータを読み取ることによってchrome.runtime.getBackgroundPage) 読み取り、結果を処理する必要があります。

この回答で、このフローに対応するコードを提供しました。

于 2013-06-14T12:48:14.780 に答える