Chrome-Erweiterung auf `run_at`` document_start` läuft zu schnell?

EDIT: Irgendetwas stimmte nicht mit meinem Chrome-Browser und verursachte einen Konflikt mit meinem Skript. Eine vollständige Neuinstallation beseitigte die Ursache des Problems. Wenn ich herausfinde, was es verursacht hat, werde ich es hier einfügen.

EDIT2: Nur um jedem, der dies 2017 liest, mitzuteilen, dass ich das nicht vergessen habe und dieses Problem seit meiner letzten Bearbeitung noch nie hatte.

EDIT3: Es ist 2019 und bisher hatte ich dieses Problem nie wieder.

Ich habe gelernt, wie man eine einfache Chrome-Erweiterung erstellt, die ein Userscript-Port ist. Das Skript funktioniert perfekt mit Tampermonkey mit der Einstellungrun at zudocument-start, alle notwendigen Ereignisse, die von Anfang an erfasst werden müssen, werden erfasst.

Als ich jedoch dieselben Einstellungen in der Chrome-Erweiterung vorgenommen habe, habe ich festgestellt, dass dieselbe Ausführungseinstellung schneller ist als die von Tampermonkey, wodurch die erste Funktion fehlschlägt: Uncaught TypeError: Cannot call method 'appendChild' of null.), da versucht wird, ein Skriptelement an das @ anzuhänghead Abschnitt, der erst 0.010s später existiert.

Meine schmutzige Lösung war bisher die Verwendung einessetInterval -Funktion mit dem Timer auf 10, um zu prüfen, obdocument.head existiert und fahren Sie mit dem Code fort, wenn die Bedingung erfüllt ist.

Gibt es eine Möglichkeit, wie ich diese Funktion korrekt ausführen kann, ohne auf @ zurückgreifen zu müssesetInterval oder repliziere vielleicht Tampermonkey'sgrant none Option, mit der das Userscript im Kontext der Webseite ausgeführt wird?

Das Folgende ist meine manifest.json-Datei:

{
    "manifest_version": 2,
    "content_scripts": [ {
        "js":        [ "simpleuserscript.user.js" ],
        "matches":   [ "https://www.google.com/*"],
        "run_at":    "document_start"
    } ],
    "converted_from_user_script": true,
    "description":  "Chrome extension",
    "name":         "Testing",
    "version":      "1"
}

All dies könnte vermieden werden, wenn Chrome das @ übernehmen würafterscriptexecute Ereignis, aber bis das passiert, bin ich mit dem @ steckload Veranstaltung. Ich bedanke mich im Voraus für jede Hilfe.

EDIT: Ich habe die Vorschläge in den Antworten bereits ausprobiert: mit einem anderenrun at point mitDOMContentLoaded und an @ anhängdocument.documentElement. Alle waren nicht erfolgreich, weil: 1 und 2 das Skript frühe Ereignisse verpassen lassen und 3 denselben TypeError zurückgibt wie beim Versuch, an @ anzuhängedocument.head.

Das Skript muss eingefügt / ausgeführt werden, wenndocument.readyState = loading oder es wird frühzeitig notwendige Ereignisse verpassen, aber nicht so früh, dass keine Kinder an @ angehängt werden könnedocumentElementoderhead

Ein Beispiel für den Code insimpleuserscript.user.js:

var script = document.createElement("script");
script.textContent = "console.log('success')";
if(document.head) {
    document.head.appendChild(script);
} else if(document.documentElement) {
    document.documentElement.appendChild(script);
}

Console zeigtTypeError: Cannot call method 'appendChild' of null

Antworten auf die Frage(4)

Ihre Antwort auf die Frage