Maison >interface Web >js tutoriel >Comment envoyer des messages d'un script d'arrière-plan vers un script de contenu puis vers un script injecté ?
Énoncé du problème
La tâche à portée de main vise à établir un canal de communication entre un script d’arrière-plan et un script de contenu. Le script de contenu est chargé d'injecter un autre script dans la page Web, et le script injecté est le destinataire des messages. Cependant, cette communication s'avère infructueuse, en particulier la transmission initiale du message du script d'arrière-plan au script de contenu.
La racine du problème réside dans la nature de l’injection de script de contenu. Chrome n'injecte pas automatiquement de scripts de contenu dans les onglets existants lorsqu'une extension est chargée ou rechargée. Au lieu de cela, l'injection ne se produit que lors d'une navigation ultérieure dans les onglets ou lors de l'ouverture de nouveaux onglets correspondant aux modèles d'URL spécifiés.
Solution 1 : Assurer la préparation du script de contenu
<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>
Solution 2 : Toujours injecter le script avec vérification de l'exécution
<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>
Solution 3 : Injection aveugle lors de l'initialisation
<code class="js">chrome.tabs.query({}, function(tabs) { for(var i in tabs) { chrome.tabs.executeScript(tabs[i].id, {file: "content_script.js"}); } }); </code>
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!