2

コンテンツ スクリプトとページ アクション ポップアップの間でデータを渡す方法がわかりません。

タイトルにマイナスダッシュが含まれるすべてのページのページ アクションを示す、次の単純なスケルトンから始めました。

  • 拡張マニフェスト ( manifest.json):

    {
       …
       "permissions": ["http://example.org/*"],
       "background": {"scripts": ["background.js"]},
       "page_action": {"default_popup": "popup.html", …},
       "content_scripts": {
         "matches": ["http://example.org/*"],
         "js": ["content.js"]
       }
    }
    
  • バックグラウンド スクリプト ( background.js):

    chrome.extension.onRequest.addListener(function (msg, sender, respond) {
      if (msg && msg.what === "match") {
        console.log("Match:", msg.title);
        chrome.pageAction.show(sender.tab.id);
      }
    }
    
  • コンテンツ スクリプト ( content.js)、ドキュメントのタイトルをチェック:

    var title = document.title;
    if (title.indexOf("-") >= 0) {
      chrome.extension.sendRequest({"what": "match", "title": title});
    }
    

今、ページ アクションのポップアップで、一致したページのタイトルを表示したいと思います。最後に読み込まれたページのタイトル (この回答を使用して行われるように) ではなく、アクティブなタブのタイトルです。

私の最初の方法は、コンテンツ スクリプトにクエリを送信することでしたが、ドキュメントによると、それはすべてのchrome.extension.sendMessageリスナー (つまり、すべてのタブのすべてのコンテンツ スクリプト)に送信されます。誰の応答を受け取るかについての明確な定義はありません。また、必要に応じて使用できません。を使用して現在のタブを見つけようとすると、が返されます。これは、クエリがタブ以外のコンテキスト (ポップアップ) から来るためです。chrome.tabs.sendMessage tabIdchrome.tabs.getCurrentnull

たぶんコミュニケーションには使えると思うけどchrome.tabs.executeScript、これはただ汚く感じるだけだ。

それでも、これは非常に簡単に実行できる基本的なことであり、何かが欠けているだけだと思います。誰かが、できればサンプルコードで私を助けてくれませんか?

更新: Mappy の例の拡張機能を見つけましchrome.tabs.onUpdatedた。アクティブなタブを追跡するために使用します。残念ながら、これにはtabs許可が必要です。個人的には、可能な限り最小限の権限を使用したいと考えています。

それで、残念ながら許可システムの設計が悪いので、このようにするしかないのでしょうか、それとも回避策はありますか? chrome.pageAction.onClickedイベント ハンドラー (Tab必要なオブジェクトを提供する) でポップアップを表示できるようになれば幸いです...

4

2 に答える 2

1

コードに複数の問題があります

  • のchrome.extension.sendRequestchrome.extension.sendRequest({"what": "match", "title": title});非推奨です
  • マニフェストにある場合、chrome.pageAction.onClicked"page_action": {"default_popup": "popup.html", …},は起動しません。
  • chrome.extension.sendMessage will send it to all listeners (i.e. all my content scripts on all tabs),は無効な仮定であり、拡張ページに送信されます。

あなたの質問を何度も読み込もうとしましたが、何を達成したいのか理解できませんでした。説明してもらえますか?

于 2013-01-26T10:17:44.277 に答える
1

onClickポップアップにイベントリスナーを追加する必要があると思います:

chrome.pageAction.onClicked.addListener(function(tabs.Tab tab) {...});

こちらのドキュメントを参照してください。

イベントリスナーのコールバックは、確か​​にアクティブなタブである tabId を提供します。

于 2013-01-26T07:20:19.087 に答える