問題ステートメント
タスク当面の目的は、バックグラウンド スクリプトとコンテンツ スクリプトの間に通信チャネルを確立することです。コンテンツ スクリプトは Web ページに別のスクリプトを挿入する役割を果たし、挿入されたスクリプトがメッセージの受信者になります。ただし、この通信、特にバックグラウンド スクリプトからコンテンツ スクリプトへの最初のメッセージ送信は失敗していることが判明しています。
問題の根本は以下にあります。コンテンツ スクリプト インジェクションの性質。 Chrome は、拡張機能の読み込みまたは再読み込み時に、コンテンツ スクリプトを既存のタブに自動的に挿入しません。代わりに、挿入は、後続のタブ ナビゲーション、または指定された URL パターンに一致する新しいタブを開いたときにのみ発生します。
解決策 1: コンテンツ スクリプトの準備を確認する
<code class="js">// Background 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); } else { chrome.tabs.sendMessage(tabId, message, callback); } }); } }); } // Content script chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) { if(request.ping) { sendResponse({pong: true}); return; } /* Content script action */ });</code>
解決策 2: ランタイム チェックを使用して常にスクリプトを注入する
<code class="js">// Background function ensureSendMessage(tabId, message, callback){ chrome.tabs.executeScript(tabId, {file: "content_script.js"}, function(){ if(chrome.runtime.lastError) { console.error(chrome.runtime.lastError); } else { chrome.tabs.sendMessage(tabId, message, callback); } }); } // Content script var injected; if(!injected){ injected = true; /* your toplevel code */ }</code>
解決策 3: 初期化時に無差別に注入する
<code class="js">chrome.tabs.query({}, function(tabs) { for(var i in tabs) { chrome.tabs.executeScript(tabs[i].id, {file: "content_script.js"}); } }); </code>
以上がバックグラウンド スクリプトからコンテンツ スクリプト、さらに挿入されたスクリプトにメッセージを送信するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。