Question

Je suis super proche pour obtenir ma course d'extension Chrome parfaitement, mais je suis en cours d'exécution dans une dernière question maintenant.

Le problème semble être lié au script contenu injecté à plusieurs reprises sur des sites comme Facebook, où la page est pas rechargés après avoir cliqué sur un lien, etc ...

Je pense que le problème est lié au site étant très AJAX dépendant.

Si je vous rafraîchir la page entière, ou de la charge pour la première fois, alors il n'y a pas de problème. Mes courses d'extension et le script contenu est injecté correctement.

Cependant, si je charge la page du temps initial, puis cliquez sur un lien sur le site, la rubrique « contenu » de Facebook chargera ce lien que vous avez cliqué sur, alors que la barre de navigation bleue flottant au sommet ne rafraîchir ou changement.

i.e.. la page entière ne se recharge pas. Étant donné que la section « contenu » du site et la barre de navigation sont à la fois dans le même cadre, le script contenu ne cesse de s'injecter une autre fois pour chaque lien que vous cliquez.

Alors finalement je vois dans mon journal de la console qu'il est en cours d'exécution 2x, 3x, 4x, etc .. 5X Comme je clique autour sur plus de liens, le nombre augmente de 1 à chaque fois.

Ma question est la suivante:

Yat-il un moyen simple de vérifier si le script de contenu est déjà présent / actif avant de l'injecter à nouveau? Ou que peut-être utilisé comme un travail autour d'une telle situation?

Était-ce utile?

La solution

Je prédit un problème similaire lors de l'écriture du script de contenu pour mon extension alors j'ai ajouté un attribut unique à l'élément <body> de chaque page avec le nom de l'extension et la version.

La première chose que le script contenu n'est de vérifier si cet attribut déjà des scripts et arrête si elle le fait. Dans le cas contraire, il va ajouter cet attribut (avec une valeur de true) et poursuivre son but.

Si vous voulez voir ma solution ;

L'aspect légèrement plus compliqué de cette technique est la version à l'aide aller chercher passage de messages l'analyse du manifeste (récupéré dans une requête AJAX) pour un objet JSON.

Pour voir exactement comment j'ai réalisé ce regard sur les fonctions de init et onRequestHelper ici ;

Bien sûr, vous pourriez code juste dur la version ou omettre complètement. Tant que le nom d'attribut est unique.

Autres conseils

Dans le cadre parent, pourriez-vous ajouter quelque chose de similaire ou window.doneInjecting = true;? (Ou peut-être ajouter un élément caché à la page - Je ne sais pas si les cadres enfants peuvent accéder aux variables JavaScript de leurs parents)

Mais la mise au fond d'un simple drapeau, de sorte que chaque fois que votre script de contenu est injecté, vérifier si le drapeau existe et continuer que si elle ne le fait pas?

OnUpdated se déclenche chaque fois que les changements d'état d'un onglet. il suffit de charger vos scripts de contenu à changeInfo.status == "complete"

background.js

chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
chrome.tabs.getSelected(null, function(tab) {
    // Do some stuff
    if (changeInfo.status == "complete")
    {
        // load your scripts here
        chrome.tabs.executeScript(tabId, {file: "jquery.js"});
        chrome.tabs.executeScript(tabId, {file: "jquery.highlight.js"});
    }
});
});
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top