コンテンツスクリプトを介してバックグラウンドスクリプトから挿入されたスクリプトへの通信を確立するにはどうすればよいですか?

DDD
リリース: 2024-10-18 11:06:03
オリジナル
401 人が閲覧しました

How to Establish Communication from Background Script to Injected Script through Content Script?

バックグラウンド スクリプトからコンテンツ スクリプト、さらに挿入されたスクリプトへのメッセージの送信

問題:
バックグラウンド ページからコンテンツ スクリプト、そして挿入されたスクリプトにメッセージを送信しようとしましたが、プロセスは意図したとおりに動作しませんでした。コンテンツ スクリプトはバックグラウンド スクリプトからメッセージを受信できません。

解決策:
この問題は、コンテンツ スクリプトの挿入方法に起因します。拡張機能が読み込まれるとき、コンテンツ スクリプトは既存のタブに自動的に挿入されません。インジェクションは、拡張機能のロード後に新しいタブが作成されたとき、または既存のタブに移動したときにのみ発生します。

解決策 1: 条件付きスクリプト インジェクション
バックグラウンドとコンテンツ間の通信を確保するためスクリプトでは、条件付きスクリプト インジェクションを使用できます。バックグラウンド スクリプトは、タブがメッセージを受信する準備ができているかどうかを確認し、コンテンツ スクリプトがまだ挿入されていない場合にのみコンテンツ スクリプトを挿入します。

コード:

<code class="javascript">// Background script
function ensureSendMessage(tabId, message, callback) {
  chrome.tabs.sendMessage(tabId, { ping: true }, function (response) {
    if (response && response.pong) { // Content script ready
      chrome.tabs.sendMessage(tabId, message, callback);
    } else { // No listener on the other end
      chrome.tabs.executeScript(tabId, { file: "content_script.js" }, function () {
        if (chrome.runtime.lastError) {
          console.error(chrome.runtime.lastError);
          throw Error("Unable to inject script into tab " + tabId);
        }
        // OK, now it's injected and ready
        chrome.tabs.sendMessage(tabId, message, callback);
      });
    }
  });
}</code>
ログイン後にコピー

コンテンツ スクリプト:

<code class="javascript">chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) {
  if (request.ping) {
    sendResponse({ pong: true });
    return;
  }
  // Content script action
});</code>
ログイン後にコピー

解決策 2: 二重実行の防止
もう 1 つの解決策には、コンテンツ スクリプトをタブに挿入しますが、その実行を防ぐ手段を実装する必要があります。

コード:

<code class="javascript">// Background script
function ensureSendMessage(tabId, message, callback) {
  chrome.tabs.executeScript(tabId, { file: "content_script.js" }, function () {
    if (chrome.runtime.lastError) {
      console.error(chrome.runtime.lastError);
      throw Error("Unable to inject script into tab " + tabId);
    }
    // OK, now it's injected and ready
    chrome.tabs.sendMessage(tabId, message, callback);
  });
}</code>
ログイン後にコピー

コンテンツ スクリプト:

<code class="javascript">var injected;

if (!injected) {
  injected = true;
  // Your toplevel code
}</code>
ログイン後にコピー

解決策 3: 無差別スクリプトの挿入
最後に、拡張機能の初期化時にすべてのタブにコンテンツ スクリプトを挿入することを選択できます。これは、スクリプトが複数回実行されたとき、またはページが読み込まれた後にスクリプト自体に干渉しない場合にのみ推奨されます。

コード:

<code class="javascript">chrome.tabs.query({}, function (tabs) {
  for (var i in tabs) {
    // Filter by URL if needed
    chrome.tabs.executeScript(tabs[i].id, { file: "content_script.js" }, function () {
      // Now you can use normal messaging
    });
  }
});</code>
ログイン後にコピー

いずれか 1 回これらのソリューションが実装されると、メッセージはバックグラウンド スクリプトからコンテンツ スクリプト、そして最終的には挿入されたスクリプトに正常に中継されます。

以上がコンテンツスクリプトを介してバックグラウンドスクリプトから挿入されたスクリプトへの通信を確立するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート