Maison  >  Article  >  interface Web  >  Comment envoyer des messages d’un script d’arrière-plan vers un script de contenu puis vers un script injecté ?

Comment envoyer des messages d’un script d’arrière-plan vers un script de contenu puis vers un script injecté ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-18 12:04:26182parcourir

How to Send Messages from a Background Script to a Content Script and then to an Injected Script?

Envoi d'un message d'un script d'arrière-plan à un script de contenu, puis à 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.

Comprendre le problème

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.

Solutions

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 &amp;&amp; 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn