it-swarm.com.de

Wie bekomme ich ein Inhaltsskript zum Laden, nachdem Javascript ausgeführt wurde?

Meine Erweiterung soll ein Inhaltsskript, searchTopic.js, laden, erst nachdem die Seite, in die sie injiziert wurde, bereits vollständig geladen ist (ja, ich habe "run_at" im Erweiterungsmanifest auf "document_end" gesetzt), aber es wird tatsächlich geladen Alle DOM-Objekte wurden erstellt (die wichtigsten werden über Javascript in der Seite erstellt). Die Frage ist also, wie kann ich warten, bis das Javascript der Seite ausgeführt wird? Hier ist mein Manifest:

"content_scripts": [
  {
  "run_at": "document_end",
  "matches": ["https://groups.google.com/forum/*"],
  "js": ["searchTopic.js"]
  }
],
22
FractalBob

"run_at": "document_end" ist das Äquivalent zu DOMContentLoaded. Das heißt, es wird nach dem Laden von static HTML ausgelöst, jedoch vor langsamen Bildern und langsamer Verarbeitung von Javascript.

Sie können also nicht festlegen, dass ein Inhaltsskript nach dem JS der Seite ausgelöst wird, indem Sie das Manifest allein festlegen. Sie müssen dazu im Inhaltsskript selbst kodieren.

Bei Inhaltsskripten wird "run_at": "document_end" vor dem onload-Ereignis ausgelöst (im Gegensatz zum Standardcode document_idle - der zu unvorhersehbaren Zeiten ausgelöst werden kann). 

Der erste Schritt ist also, auf das load-Ereignis mit Code wie dem folgenden in Ihrem Inhaltsskript (searchTopic.js) zu warten:

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

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


Wenn das Skript, das Sie interessieren, einige Zeit in Anspruch nimmt, müssen Sie von Fall zu Fall eine bestimmte Bedingung abfragen. Zum Beispiel:

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
Brock Adams

script Elemente werden in der Reihenfolge ausgeführt. Der Browser beendet sogar das Laden von DOM-Inhalten, wenn script-Knoten in der body vorhanden sind. Dies funktioniert garantiert, ansonsten würde document.write() nicht mehr funktionieren.

Sie haben also zwei Lösungen:

  1. Verwenden Sie das Ereignis onload, um Ihren Code zu laden.
  2. Fügen Sie ein Skripttag als letztes Element der Seite hinzu (das Letzte im Element body). Dieses Skript wird ausgeführt, nachdem alle anderen Skripts und beendet wurden, nachdem der Hauptteil in einen DOM-Baum umgewandelt wurde.
2
Aaron Digulla

Sie verwenden die window.load-Methode.

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
STEEL