Envoi d'un message d'un script d'arrière-plan à un script de contenu, puis à un script injecté
Problème :
Malgré la tentative d'envoi de messages depuis la page d'arrière-plan vers un script de contenu puis vers un script injecté, le processus n'a pas fonctionné comme prévu. Le script de contenu ne peut pas recevoir de messages du script d'arrière-plan.
Solution :
Le problème vient de la manière dont les scripts de contenu sont injectés. Lorsqu'une extension est chargée, elle n'injecte pas automatiquement de scripts de contenu dans les onglets existants. L'injection ne se produit que lorsqu'un nouvel onglet est créé ou qu'un onglet existant est parcouru après le chargement de l'extension.
Solution 1 : Injection de script conditionnelle
Pour assurer la communication entre l'arrière-plan et le contenu scripts, une injection de script conditionnelle peut être utilisée. Le script d'arrière-plan peut vérifier si l'onglet est prêt à recevoir des messages et injecter le script de contenu uniquement s'il n'est pas déjà injecté.
Code :
<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>
Script de contenu :
<code class="javascript">chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) { if (request.ping) { sendResponse({ pong: true }); return; } // Content script action });</code>
Solution 2 : Prévention de la double exécution
Une autre solution consiste à injecter le script de contenu dans l'onglet mais à mettre en œuvre des mesures pour empêcher son exécution plus de une fois.
Code :
<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>
Script de contenu :
<code class="javascript">var injected; if (!injected) { injected = true; // Your toplevel code }</code>
Solution 3 : Indiscrimination Injection de script
Enfin, vous pouvez choisir d'injecter le script de contenu dans tous les onglets lors de l'initialisation de l'extension. Ceci n'est conseillé que si votre script n'interfère pas avec lui-même lorsqu'il est exécuté plusieurs fois ou après le chargement de la page.
Code :
<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>
Une fois l'un des ces solutions sont implémentées, les messages peuvent être relayés avec succès du script d'arrière-plan vers le script de contenu, et éventuellement vers le script injecté.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!