Maison > Questions et réponses > le corps du texte
P粉8072394162023-08-25 11:24:31
La seule façon de forcer l'injection d'un script de contenu sans actualiser la page est l'injection programmatique.
Vous pouvez utiliser l'API Tags de Chrome pour obtenir toutes vos balises et y injecter du code. Par exemple, vous pouvez stocker un numéro de version dans le stockage local et chaque fois que vous vérifiez si le numéro de version dans la page d'arrière-plan est obsolète (si c'est le cas), vous pouvez obtenir toutes les balises actives et injecter votre code par programme, ou autre. solutions pour garantir la mise à jour de votre extension.
Utilisez le code suivant pour obtenir toutes les balises :
chrome.tabs.query
et injectez votre code dans toutes les pages
chrome.tabs.executeScript(tabId, {file: "content_script.js"});
P粉1584737802023-08-25 00:54:45
Il existe un moyen de faire en sorte que les extensions contenant beaucoup de scripts de contenu continuent de fonctionner correctement après la mise à niveau et de les rendre actives immédiatement après l'installation.
La façon de l'installer consiste simplement à parcourir tous les onglets de toutes les fenêtres et à injecter par programme un script dans l'onglet avec l'URL correspondante.
manifest.json :
"background": {"service_worker": "background.js"}, "permissions": ["scripting"], "host_permissions": ["<all_urls>"],
Ces host_permissions doivent être les mêmes que celles du script de contenu matches
.
background.js :
chrome.runtime.onInstalled.addListener(async () => { for (const cs of chrome.runtime.getManifest().content_scripts) { for (const tab of await chrome.tabs.query({url: cs.matches})) { chrome.scripting.executeScript({ target: {tabId: tab.id}, files: cs.js, }); } } });
Il s'agit d'un exemple simplifié et ne traite pas des cadres. Vous pouvez utiliser l'API getAllFrames et faire correspondre les URL vous-même, consultez la documentation pour les modèles de correspondance.
Évidemment, vous devez le faire dans une page d'arrière-plan ou une page d'événementscript déclaré dans manifest.json :
"background": { "scripts": ["background.js"] },
background.js :
// Add a `manifest` property to the `chrome` object. chrome.manifest = chrome.runtime.getManifest(); var injectIntoTab = function (tab) { // You could iterate through the content scripts here var scripts = chrome.manifest.content_scripts[0].js; var i = 0, s = scripts.length; for( ; i < s; i++ ) { chrome.tabs.executeScript(tab.id, { file: scripts[i] }); } } // Get all windows chrome.windows.getAll({ populate: true }, function (windows) { var i = 0, w = windows.length, currentWindow; for( ; i < w; i++ ) { currentWindow = windows[i]; var j = 0, t = currentWindow.tabs.length, currentTab; for( ; j < t; j++ ) { currentTab = currentWindow.tabs[j]; // Skip chrome:// and https:// pages if( ! currentTab.url.match(/(chrome|https):\/\//gi) ) { injectIntoTab(currentTab); } } } });
Dans l'ancien Chrome 26 et versions antérieures, les scripts de contenu peuvent restaurer les connexions aux scripts d'arrière-plan. Cela a été corrigé en 2013http://crbug.com/168263. Vous pouvez voir un exemple de cette technique dans une version antérieure de cette réponse.