Comment charger un script de contenu après L'exécution du Javascript d'une page?

Mon extension est censée charger un script de contenu, searchTopic.js, seulement après que la page dans laquelle il est injecté soit déjà complètement chargée (Oui, j'ai mis " run_at "à" document_end " dans le manifeste d'extension), mais en fait il se charge avant que tous les objets DOM aient été créés (les objets cruciaux sont créés via Javascript dans la page). Donc, la question Est, Comment puis-je attendre que le Javascript de la page soit exécuté? Voici mon manifeste:

"content_scripts": [
  {
  "run_at": "document_end",
  "matches": ["https://groups.google.com/forum/*"],
  "js": ["searchTopic.js"]
  }
],
22
demandé sur FractalBob 2012-12-17 19:29:48

3 réponses

"run_at": "document_end" est équivalent à DOMContentLoaded.{[11] } c'est-à-dire qu'il se déclenche après le chargement du statique HTML, mais avant les images lentes et la finition lente du javascript.

Vous ne pouvez donc pas définir un script de contenu à déclencher après le JS de la page, simplement en définissant le manifeste seul. Vous devez coder pour cela dans le script de contenu lui-même.

Pour les scripts de contenu, {[2] } se déclenche avant l'événement onload (contrairement à la valeur par défaut document_idle - qui peut se déclencher à des moments imprévisibles).

Donc, la première étape consiste à attendre l'événement load avec du code comme celui-ci dans votre script de contenu(searchTopic.js):

window.addEventListener ("load", myMain, false);

function myMain (evt) {
    // DO YOUR STUFF HERE.
}


Dans le cas où le script que vous aimez prend un certain temps à terminer, vous devrez interroger certaines conditions au cas par cas. Par exemple:

window.addEventListener ("load", myMain, false);

function myMain (evt) {
    var jsInitChecktimer = setInterval (checkForJS_Finish, 111);

    function checkForJS_Finish () {
        if (    typeof SOME_GLOBAL_VAR != "undefined"
            ||  document.querySelector ("SOME_INDICATOR_NODE_css_SELECTOR")
        ) {
            clearInterval (jsInitChecktimer);
            // DO YOUR STUFF HERE.
        }
    }
}
38
répondu Brock Adams 2012-12-17 16:20:35

script les éléments sont exécutés dans l'ordre. Le navigateur arrête même de charger le contenu DOM s'il y a des nœuds script dans le body. Ceci est garanti pour fonctionner, sinon document.write() cesserait de fonctionner.

Vous avez donc deux solutions:

  1. utilisez l'événement onload pour charger votre code.
  2. ajoute une balise de script comme dernier élément de la page (dernière chose dans l'élément body). Ce script sera exécuté après que tous les autres scripts ont terminé et après que le corps a été converti en arbre DOM.
2
répondu Aaron Digulla 2012-12-17 16:08:28

Vous utilisez la fenêtre.la méthode de chargement.

function addLoadEvent(a) {
    var b = window.onload;
    "function" != typeof window.onload ? window.onload = a : window.onload = function () {
        b && b(),
            a()
    }
}
function init() {
    alert('init');
}
addLoadEvent(init);
0
répondu STEEL 2017-07-20 05:25:22