webentwicklung-frage-antwort-db.com.de

Schreiben auf Dokument ausführen: Es ist nicht möglich, von einem asynchron geladenen externen Skript aus in ein Dokument zu schreiben, es sei denn, es wird explizit geöffnet.

Ich versuche, ein bestimmtes Skript zu laden, nachdem das Laden der Seite ausgeführt wurde:

function downloadJSAtOnload(){
            var element = document.createElement("script");
            element.src = "scriptSrc";
            document.body.appendChild(element);
        }

         if (window.addEventListener)
                  window.addEventListener("load", downloadJSAtOnload, false);
            else if (window.attachEvent)
                  window.attachEvent("onload", downloadJSAtOnload);
            else window.onload = downloadJSAtOnload;

Und während dieses Skript 'scriptSrc' auszuführen und herunterzuladen scheint und es direkt vor dem Ende des Body-Tags anfügt, gibt es die folgende Meldung (kein Fehler) in der Konsole (Chrome) aus

Fehler beim Ausführen von 'Schreiben' für 'Dokument': Es ist nicht möglich, von einem asynchron geladenen externen Skript aus in ein Dokument zu schreiben, es sei denn, es wird explizit geöffnet.

Was bedeutet das überhaupt? Und soll ich etwas anders machen? Auch wenn ich das erwartete Verhalten bekomme?

63
Parijat Kalia

Ein asynchron geladenes Skript wird wahrscheinlich ausgeführt, nachdem das Dokument vollständig analysiert und geschlossen wurde. Aus diesem Grund können Sie document.write() in einem solchen Skript nicht verwenden (technisch gesehen können Sie das, aber es wird nicht das tun, was Sie wollen).

Sie müssen alle document.write() -Anweisungen in diesem Skript durch explizite DOM-Manipulationen ersetzen, indem Sie die DOM-Elemente erstellen und sie dann mit .appendChild() oder .insertBefore() in ein bestimmtes übergeordnetes Element einfügen. oder Einstellung .innerHTML oder ein Mechanismus für eine solche direkte DOM-Manipulation.

Zum Beispiel anstelle dieser Art von Code in einem Inline-Skript:

<div id="container">
<script>
document.write('<span style="color:red;">Hello</span>');
</script>
</div>

Sie würden dies verwenden, um das obige Inline-Skript in einem dynamisch geladenen Skript zu ersetzen:

var container = document.getElementById("container");
var content = document.createElement("span");
content.style.color = "red";
content.innerHTML = "Hello";
container.appendChild(content);

Wenn sich in dem Container kein anderer Inhalt befand, an den Sie nur anhängen mussten, können Sie dies einfach tun:

var container = document.getElementById("container");
container.innerHTML = '<span style="color:red;">Hello</span>';
76
jfriend00

Ein bisschen zu spät zur Party, aber Krux hat dafür ein Skript namens Postscribe erstellt. Wir konnten dies nutzen, um dieses Problem zu überwinden.

22
the0ther

Falls dies für jemanden nützlich ist, hatte ich das gleiche Problem. Ich habe eine Fußzeile über jQuery in eine Webseite eingefügt. In dieser Fußzeile befanden sich einige Google-Skripte für Anzeigen und Retargeting. Ich musste diese Skripte aus der Fußzeile verschieben und sie direkt auf der Seite platzieren, und das beseitigte den Hinweis.

2
mediaguru