web-dev-qa-db-ja.com

Chrome extension:ポップアップから現在のタブを取得

Chrome=拡張機能を作成しており、その一部で、ポップアップページのボタンがクリックされたときに現在のタブのタイトルとURLを取得する必要があります。

私は以前Chromeのメッセージパッシングシステムを使用してきましたが、多くの努力の結果、多くの場合それを機能させることができました。ただし、ポップアップページでそれらを使用する必要はなかったので、読んだことから、実行するのははるかに困難です。

これまでに把握できたタイムラインは次のとおりです。

  1. popup.html/popup.js:ボタンがクリックされた
  2. popup.html/popup.js:リクエスト/メッセージがコンテンツスクリプトに送信されます
  3. contentScript.js:リクエスト/メッセージはポップアップページから受信されます
  4. contentScript.js:現在のタブのタイトルとURLは変数に保存されます
  5. contentScript.js:2つの変数は文字列化された応答として送信されます
  6. popup.html/popup.js:2つの変数は応答から解析されます

通常、私はこれを理解することができるでしょうが、私は作品の中でスパナを投げたいくつかのことを読みました:

  • chrome.tabs.getSelectedは、バックグラウンドページ/スクリプトでのみ使用できます。これは、コンテンツスクリプトをまったく使用する必要がないことを意味しますか?
  • メッセージはコンテンツスクリプトからポップアップページに直接送信できません。バックグラウンドページを経由する必要があります
  • メッセージを渡す前に、ポップアップウィンドウが存在することを確認する必要があります(ただし、方法は知っていると思います)。

私はすでにChromeのメッセージパッシングシステムが十分に難しいと感じましたが、これは私を完全に混乱させました。したがって、この投稿。

33
mythofechelon

chrome.tabs.getSelected は非推奨です。 chrome.tabs.query 代わりに。

chrome.tabs.queryには2つのパラメータが必要です。クエリオブジェクトと、結果のタブの配列をパラメータとして受け取るコールバック関数です。

「現在のタブ」を取得するには、現在アクティブで現在のウィンドウにあるすべてのタブを照会します。

var query = { active: true, currentWindow: true };

クエリは現在のタブのみを含むTab配列を返すため、コールバックの最初の要素を必ず取得してください

function callback(tabs) {
  var currentTab = tabs[0]; // there will be only one in this array
  console.log(currentTab); // also has properties like currentTab.id
}

その他:

chrome.tabs.query(query, callback);
69
fny