Problemstellung
Die Aufgabe Das vorliegende Ziel besteht darin, einen Kommunikationskanal zwischen einem Hintergrundskript und einem Inhaltsskript einzurichten. Das Inhaltsskript ist dafür verantwortlich, ein weiteres Skript in die Webseite einzufügen, und das eingefügte Skript ist der Empfänger der Nachrichten. Diese Kommunikation erweist sich jedoch als erfolglos, insbesondere die anfängliche Nachrichtenübertragung vom Hintergrundskript zum Inhaltsskript.
Die Wurzel des Problems liegt darin die Art der Content-Script-Injection. Chrome fügt Inhaltsskripte nicht automatisch in vorhandene Tabs ein, wenn eine Erweiterung geladen oder neu geladen wird. Stattdessen erfolgt die Injektion nur bei anschließender Tab-Navigation oder beim Öffnen neuer Tabs, die den angegebenen URL-Mustern entsprechen.
Lösung 1: Stellen Sie die Bereitschaft des Inhaltsskripts sicher
<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>
Lösung 2: Skript immer mit Laufzeitprüfung injizieren
<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>
Lösung 3: Wahllose Injektion bei der Initialisierung
<code class="js">chrome.tabs.query({}, function(tabs) { for(var i in tabs) { chrome.tabs.executeScript(tabs[i].id, {file: "content_script.js"}); } }); </code>
Das obige ist der detaillierte Inhalt vonWie sende ich Nachrichten von einem Hintergrundskript an ein Inhaltsskript und dann an ein injiziertes Skript?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!