Maison  >  Article  >  interface Web  >  Comment résoudre le problème de communication inter-script dans les extensions Chrome de l'arrière-plan à l'arrière-plan injecté ?

Comment résoudre le problème de communication inter-script dans les extensions Chrome de l'arrière-plan à l'arrière-plan injecté ?

DDD
DDDoriginal
2024-10-18 11:35:02618parcourir

How to Resolve Inter-Script Communication Issue in Chrome Extensions from Background to Injected Background?

Messagerie entre plusieurs scripts dans les extensions Chrome : de l'arrière-plan à l'injection

Arrière-plan

Dans Dans le contexte des extensions Chrome, l'envoi de messages entre des scripts exécutés dans différents environnements peut s'avérer difficile. Voici une analyse détaillée et une solution au problème spécifique auquel vous êtes confronté lorsque vous tentez d'envoyer des messages du script d'arrière-plan à un script de contenu, puis à un script injecté.

Problème :

Votre code ne parvient pas à envoyer des messages en raison de la manière dont les scripts de contenu sont injectés dans les cibles. Initialement, les scripts de contenu ne sont pas présents dans les onglets existants sauf si une page déclenche spécifiquement leur injection. Cela signifie que lorsque votre script en arrière-plan tente d'envoyer un message à un onglet lors du chargement de l'extension, il n'y a aucun écouteur pour le recevoir.

Solutions :

Solution 1 : Message à la demande

Vérifiez si le script de contenu est prêt avant d'envoyer des messages :

// 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
      // Inject the script and then send the message
    }
  });
}
// Content
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
  if(request.ping) { sendResponse({pong: true}); return; }
  // Process messages
});

Solution 2 : Injecter et exécuter une fois

Injectez le script de contenu mais assurez-vous qu'il ne s'exécute qu'une seule fois :

// Background
function injectAndSend(tabId, message, callback){
  // Inject script and send message
}
// Content
var executed; // Flag to prevent multiple executions

if(!executed){
  executed = true;
  // Process messages
}

Solution 3 : Injecter sans discernement

Injecter des scripts de contenu sans en s'appuyant sur leur présence :

// Background
chrome.tabs.query({}, function(tabs) {
  for(var i in tabs) {
    // Inject scripts and send messages
  }
});

Solution 4 : Utiliser l'action du navigateur

Attachez votre logique de messagerie à une action du navigateur pour des interactions utilisateur spécifiques :

chrome.browserAction.onClicked.addListener(function() {
  // Process messages
});

Scripts de contenu orphelins

Une implication à considérer est le phénomène des scripts de contenu orphelins. Lorsqu'une extension est rechargée, les scripts de contenu peuvent ne pas être correctement nettoyés, laissant derrière eux des écouteurs d'événements qui peuvent interférer avec les scripts nouvellement injectés.

Solution :

Implémenter un mécanisme de battement de cœur pour vérifier la connexion entre le script de contenu et le script d'arrière-plan. Si le battement de cœur échoue, le script de contenu doit désenregistrer les auditeurs et différer toute action.

Conclusion :

En comprenant le comportement des scripts de contenu dans les extensions Chrome et en employant les techniques de messagerie, vous pouvez envoyer efficacement des messages du script d'arrière-plan aux scripts de contenu et aux scripts injectés.

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