Extension Chrome code vs Contenu des scripts vs Injecté scripts
J'essaie d'obtenir mon Extension Chrome pour exécuter la fonction init()
chaque fois qu'une nouvelle page est chargée, mais j'ai de la difficulté à comprendre comment le faire. Ce que je comprends, j'ai besoin de faire ce qui suit dans background.html:
- Utilisation
chrome.tabs.onUpdated.addListener()
pour vérifier si la page est
changé - Utilisation
chrome.tabs.executeScript
pour exécuter un script.
C'est le code que j'ai:
//background.html
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
chrome.tabs.executeScript(null, {code:"init();"});
});
//script.js
function init() {
alert("It works!");
}
Je suis également se demander si la fonction init() aura accès à mes autres fonctions situées dans d'autres fichiers JS?
Vous devez vous connecter pour publier un commentaire.
Du code JavaScript dans les extensions de Chrome peuvent être répartis dans les groupes suivants:
Code d'Extension - accès Complet à tous les permis
chrome.*
Api.Cela comprend la page d'arrière-plan, et toutes les pages qui ont un accès direct à celui-ci via
chrome.l'extension.getBackgroundPage()
, comme le navigateur pop-ups.Le contenu des scripts (via le fichier de manifeste ou de
chrome.onglets.executeScript
) - Partielle accès à certains deschrome
Api, un accès complet à la page du DOM (pas à l'un deswindow
objets, y compris les cadres).Le contenu des scripts s'exécutent dans un champ entre l'extension et la page. Le mondial
window
objet d'un Contenu script est distincte de la page/l'extension de l'espace de noms global.Injecté scripts (via cette méthode dans un Contenu de script) - accès Complet à toutes les propriétés de la page. Pas accès à l'un des
chrome.*
Api.Injecté scripts se comportent comme s'ils étaient inclus dans la page elle-même, et ne sont pas connectés à l'extension d'une quelconque façon. Voir ce post pour en savoir plus sur les différentes méthodes d'injection.
Pour envoyer un message à partir de l'injection de script pour le contenu du script, les événements doivent être utilisés. Voir cette réponse pour un exemple. Remarque: le Message transporté dans une extension d'un contexte à l'autre sont automatiquement (JSON)-sérialisés et analysé.
Dans votre cas, le code de la page d'arrière-plan (
chrome.onglets.onUpdated
) est probablement appelée avant que le contenu du scriptscript.js
est évaluée. Ainsi, vous obtiendrez unReferenceError
, parce queinit
ne l'est pas .Aussi, lorsque vous utilisez
chrome.tabs.onUpdated
, assurez-vous de tester si la page est complètement chargée, parce que l'événement se déclenche deux fois: Avant de charger, et sur la finition:chrome.tabs.onUpdated
tir deux fois. Donc ma question je suppose que c'est comment aurais-je injecterinit()
? Doit-on injecter tous mes JavaScripts?init()
est normalement appelée lorsque l'utilisateur clique sur le Navigateur icône d'Action, etinit()
déclenche un tas d'autres fonctions.function init
a pour accéder à la page et extensions de code, l'utilisation d'un contenu de script. Voir le lié réponse pour voir comment injecter des scripts, et cette réponse pour un guide sur la mise en œuvre d'un Contenu de script qui a pour accéder à la page de variables.chrome.tabs.executeScript
,console
,localStorage
de travail, même si elles sont globales de la fenêtre des objets. Mais pas ceux dont la demande a défini dans la fenêtre de l'espace de noms par exemplewindow.ContextHub = window.ContextHub || {};
. Est-il dans la liste blanche de définir ce qui est permis et ce qui ne l'est pas?