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!