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é.
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