問題陳述
任務handhand的目的是在後台腳本和內容腳本之間建立通訊通道。內容腳本負責將另一個腳本注入到網頁中,注入的腳本是訊息的接收者。然而,這種通訊被證明是不成功的,特別是從後台腳本到內容腳本的初始訊息傳輸。
問題的根源在於內容腳本注入的本質。載入或重新載入擴充功能時,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>
解決方案🎜>解決方案:總是透過執行時間檢查注入腳本
<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中文網其他相關文章!