Chrome-Erweiterung auf `run_at` `document_start` läuft zu schnell?
EDIT: Etwas falsch war mit meinem Chrome-browser und erstellen einen Konflikt mit meinem Skript, eine komplette Neuinstallation beseitigt, was die Ursache war. Wenn ich passieren, um herauszufinden, was verursacht wurde, werde ich es in hier.
EDIT2: Nur damit jemand der Lektüre dieses im Jahr 2017 wissen, dass ich noch nicht vergessen und ich habe nie dieses problem hatte, da meine vorherigen Bearbeiten.
EDIT3: Es ist 2019 und so weit ich ' ve hatte nie dieses problem wieder.
Habe ich gelernt, wie eine einfache Chrome-Erweiterung, die ein userscript port. Das script funktioniert perfekt mit Tampermonkey mit der Einstellung run at
zu document-start
alle erforderlichen Ereignisse, die müssen gefangen werden, von Anfang an sind alle gefangen genommen.
Jedoch, wenn ich die gleichen Einstellungen in der Chrome-Erweiterung habe ich entdeckt, dass die gleiche ausgeführte Einstellung ist schneller als Tampermonkey ist, die bewirkt, dass die erste Funktion zu scheitern: ( Uncaught TypeError: Cannot call method 'appendChild' of null.
), da es versucht, fügen Sie ein script-element, um die head
Abschnitt, der nicht vorhanden ist, bis 0.010 s später.
My dirty Lösung war bisher die Verwendung einer setInterval
- Funktion mit dem timer auf 10 gesetzt, um zu überprüfen, ob document.head
vorhanden ist, und fahren Sie dann mit dem code, wenn die Bedingung wahr ist.
Gibt es irgendeine Möglichkeit, dass ich diese Arbeit machen richtig die zimmerreserviereung, ohne das resort zu setInterval
oder vielleicht replizieren Tampermonkey ist grant none
option, die angezeigt wird ausführen, um das userscript auf der Webseite Kontext?
Folgende ist mein 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 verabschieden würde den afterscriptexecute
Ereignis, aber bis das passiert, ich bin stecken mit der load
Veranstaltung. Ich danke im Voraus, jede Hilfe zur Verfügung gestellt.
EDIT: ich habe bereits versucht die Vorschläge in die Antworten: die Verwendung eines anderen run at
Punkt, mit DOMContentLoaded
und anfügen", um die document.documentElement
. Alle waren erfolglos, weil: 1 und 2 lässt das Drehbuch vermissen frühen Ereignissen, und 3 liefert das gleiche TypeError als wenn Sie versuchen, zum Anhängen an document.head
.
Das script eingefügt werden/wird ausgeführt, wenn document.readyState = loading
sonst wird es miss frühen notwendige Veranstaltungen, aber nicht so früh zu dem Punkt des seins nicht in der Lage Anhängen childs entweder documentElement
oder head
Ein Beispiel für den code innerhalb simpleuserscript.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);
}
Konsole erscheinen TypeError: Cannot call method 'appendChild' of null
Du musst angemeldet sein, um einen Kommentar abzugeben.
Chrome-Erweiterung Content scripts (ausgeführt von einem
manifest.json
), die ausgeführt werden, beidocument_start
, tun Feuer, bevorDokument.readyState
Doc erreicht hatinteractive
- Sie ist die früheste, die Sie starten möchten, messing, mit die meisten Elemente der Seite.Allerdings können Sie injizieren die meisten
<script>
Knoten sofort, wenn Sie es wünschen. Nur nicht zudocument.head
oderdocument.body
weil Sie noch nicht existieren.Anfügen
documentElement
statt. Zum Beispiel:Oder
Wenn Sie hinzufügen oder ändern anderen DOM-Elemente, die in einem Skript läuft auf
document_start
warten Sie, bis dieDOMContentLoaded
Ereignis wie folgt:document.readyState = loading
oder aber es schlägt immer fehl, zur Aufnahme bestimmter Ereignisse notwendig. Schon versuchtDomContentLoaded
aber das macht es zu spät. Ich habe auch versucht Anhängendocument.documentElement
, aber leider gibt es das gleiche TypeError erwähnt. Bisher ist die einzige Sache, die funktioniert ist diesetInterval
Methode an 0.010 sdocument.head
teilweise vorhanden ist, aber nicht interaktiv. Fügen Sie das Skript genau wie ich gezeigt habe. (Keine Tests fürdocument.head
bis nachdemDOMContentLoaded
.)documentElement
ohne Prüfung fürdocument.head
?documentElement
individuell, das hat nicht funktioniert. Ich gehe zu wählen Sie Ihnen als die richtige Antwort, weil Sie mir geholfen zu verstehen, dass etwas möglicherweise falsch mit meinem browser. Wenn man könnte hinzufügen, daß Hinweis auf Ihre Antwort, so wird es klar, für andere würde ich es wirklich schätzen. Danke für Eure Hilfe, Brock.This question was caused by a problem that can no longer be reproduced or a simple typographical error. While similar questions may be on-topic here, this one was resolved in a manner unlikely to help future readers. This can often be avoided by identifying and closely inspecting the shortest program necessary to reproduce the problem before posting.
" ) - es sei denn, es ist ein zuverlässiger Rezept für Sie zu wiederholen-was nicht der Fall zu sein scheint hier.Dein problem ist, dass beim Einsatz von
"run_at": "document_start"
, das einzige element, das gewährt wird, gibt es in der DOM ist die<html>
element. Wenn Sie möchten, um Fehler zu vermeiden, die relativ zu der Seite geladen, wie zu versuchen, Zugriff auf einige Elemente, die noch nicht erstellt wurden, müssen Sie entweder:Machen Sie Ihr Skript ausführen bei
"document_idle"
oder"document_end"
. Obwohl"document_end"
noch nicht gewähren Sie, dass alle Elemente und Ressourcen der Seite vollständig geladen (aber der DOM wurde bereits analysiert), die"document_idle"
Stichwort geben Ihnen die Gewissheit, dass der DOM geparst wurde und alle Elemente und Ressourcen wurden ordnungsgemäß geladen wurden, bevor das Skript ausgeführt wird.Oder, stattdessen, Sie können weiterhin verwenden
"document_start"
wickeln Sie Ihren code innerhalb einer"DOMContentLoaded"
Zuhörer, die es ausführen, wenn das DOM vollständig fertig laden und zu analysieren, ähnlich wie"document_idle"
. Hier ist ein Beispiel:document_idle
passiert nachdocument_end
window.onload
passiert nachdocument_end
.window.onload
impliziert alle Ressourcen wurden geladen, unddocument_end
Feuer schon nach DOM abgeschlossen ist (was früher).document_idle
oderdocument_end
machen Sie das Skript laden zu spät, so dass es nicht in der Lage zu erfassen frühen Ereignissen. MitDOMContentLoaded
Erträge die gleichen Probleme, das Skript ist eingefügt/run zu spät.document_start
eingefügt wird, nachdem die Letzte<style></style>
, unddocument_end
ist eingefügt inDOMContentLoaded
, heißt das nicht, dass wir, wenn wir nicht verwendendocument_start
,DOMContentLoaded
wird nicht warten, bis<style></style>
, Daherdocument_end
wird ausgeführt, bevor die Zeit, diedocument_start
hätte ausführen?document.replaceChild(n=document.createElement('html'),document.documentElement);n.innerHTML='replacer'
wenn Ihr Skript ist in document_start. Auf der anderen Seite, wenn man an document_idle, er wäre nicht in der Lage zu ersetzen, die Ihr injiziert Zuhörer.