Maison > interface Web > js tutoriel > le corps du texte

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
Libérer: 2024-10-18 11:35:02
original
710 Les gens l'ont consulté

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
    }
  });
}
Copier après la connexion
// Content
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
  if(request.ping) { sendResponse({pong: true}); return; }
  // Process messages
});
Copier après la connexion

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
}
Copier après la connexion
// Content
var executed; // Flag to prevent multiple executions

if(!executed){
  executed = true;
  // Process messages
}
Copier après la connexion

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
  }
});
Copier après la connexion

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
});
Copier après la connexion

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!

source:php
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal