"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment établir une communication du script d'arrière-plan au script injecté via le script de contenu ?

Comment établir une communication du script d'arrière-plan au script injecté via le script de contenu ?

Publié le 2024-11-09
Parcourir:393

How to Establish Communication from Background Script to Injected Script through Content Script?

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 de la page d'arrière-plan à un script de contenu, puis à 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 :

// 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);
      });
    }
  });
}

Script de contenu :

chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) {
  if (request.ping) {
    sendResponse({ pong: true });
    return;
  }
  // Content script action
});

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 d'une fois.

Code :

// 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);
  });
}

Script de contenu :

var injected;

if (!injected) {
  injected = true;
  // Your toplevel code
}

Solution 3 : Injection de script aveugle
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 :

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
    });
  }
});

Une fois l'une de ces solutions implémentée, 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é.

Déclaration de sortie Cet article est réimprimé à l'adresse : 1729218083. En cas d'infraction, veuillez contacter [email protected] pour le supprimer.
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3