Start · Sprachen · JavaScript · Referenz · HTMLScriptElement.textContent

HTMLScriptElement.textContent

Eigenschaft

Liest oder setzt den eingebetteten Quelltext eines <code>&lt;script&gt;</code>-Elements; beim Setzen wird mit Trusted Types ein <code>TrustedScript</code> erwartet.

seit JavaScript Baseline: alle Browser (Trusted-Types-Unterstützun Kategorie: webapi

Signatur

HTMLScriptElement.textContent

Beschreibung

Die Eigenschaft textContent eines HTMLScriptElement enthält den eingebetteten Inhalt zwischen <script> und </script>. Sie ist von Node.textContent geerbt. Für Script-Elemente ist ihr Setter aber eigens definiert, weil der Inhalt hier ausführbarer Code ist und damit ein Einfallstor für Cross-Site-Scripting (XSS).

Beim Lesen erhältst du immer einen string, also z. B. den Quelltext eines Inline-Skripts oder die Daten eines Datenblocks wie <script type="application/json">. Beim Setzen akzeptiert die Eigenschaft einen string oder ein TrustedScript-Objekt. Ist per Content Security Policy require-trusted-types-for 'script' aktiv, wird ein einfacher String abgelehnt und ein TypeError geworfen. Das gilt nicht, wenn eine Default-Policy den String umwandelt.

Typische Anwendungsfälle:

  • Serverseitig eingebettete Konfigurations- oder Initialdaten aus einem JSON-Datenblock auslesen.
  • Ein Inline-Skript dynamisch erzeugen: document.createElement("script"), dann textContent setzen und das Element ins Dokument einfügen.
  • Den Inhalt von Templates oder Import Maps (type="importmap") prüfen.

Wichtig: Code wird nur ausgeführt, wenn das Skript-Element ins Dokument eingefügt wird und vorher noch nicht gestartet war. Wenn du textContent eines bereits ausgeführten Skripts änderst, wird der Code nicht erneut ausgeführt.

Parameter

Name Typ Default Beschreibung
$value Pflicht string | TrustedScript Neuer Inhalt des Skripts (nur beim Setzen). Ist Trusted Types erzwungen, muss hier ein TrustedScript übergeben werden, z. B. aus policy.createScript().

Rückgabewert

Typ
string
Beschreibung
Der aktuelle eingebettete Textinhalt des <script>-Elements. Ohne Inhalt ist es ein leerer String. Beim Lesen wird nie ein TrustedScript zurückgegeben.

Beispiele

Initialdaten aus einem JSON-Datenblock lesen

// HTML: <script id="app-config" type="application/json">{"apiUrl":"/api","debug":true}</script>
const configEl = document.getElementById("app-config");
const config = JSON.parse(configEl.textContent);
console.log(config.apiUrl, config.debug);
/api true

Inline-Skript dynamisch erzeugen und ausführen

const script = document.createElement("script");
script.textContent = 'console.log("Dynamisches Skript läuft");';
// Ausgeführt wird erst beim Einfügen ins Dokument
document.head.append(script);

// Späteres Ändern führt NICHT zu erneuter Ausführung
script.textContent = 'console.log("Wird nie ausgegeben");';
Dynamisches Skript läuft

Sicher setzen mit Trusted Types

// Voraussetzung: CSP-Header  require-trusted-types-for 'script'; trusted-types app-scripts
const policy = window.trustedTypes?.createPolicy("app-scripts", {
  createScript: (input) => {
    // Nur freigegebene Codeschnipsel zulassen
    const allowed = ['console.log("Analytics bereit");'];
    if (!allowed.includes(input)) throw new TypeError("Skript nicht erlaubt");
    return input;
  },
});

const code = 'console.log("Analytics bereit");';
const script = document.createElement("script");
script.textContent = policy ? policy.createScript(code) : code;
document.body.append(script);
Analytics bereit

Inhalt eines Inline-Skripts prüfen

const inlineScripts = [...document.querySelectorAll("script:not([src])")];
inlineScripts.forEach((s, i) => {
  console.log(`Skript ${i}: ${s.textContent.trim().length} Zeichen`);
});
Skript 0: 128 Zeichen

// Wichtig · Fallstricke

Sicherheit (XSS): Schreibe niemals ungeprüfte Benutzereingaben oder URL-Parameter in script.textContent. Das ist gleichbedeutend mit eval(). Eine Content Security Policy ohne 'unsafe-inline' blockiert dynamisch erzeugte Inline-Skripte, es sei denn, du vergibst eine passende nonce (script.nonce = ...) oder erlaubst per 'strict-dynamic' Skripte, die von vertrauenswürdigen Skripten nachgeladen werden.

Trusted Types: Ist require-trusted-types-for 'script' aktiv, löst das Zuweisen eines einfachen Strings einen TypeError aus. Nutze dann trustedTypes.createPolicy() mit createScript. Trusted Types wird in Chromium-Browsern seit Langem unterstützt, in Firefox und Safari erst seit Kurzem. Prüfe deshalb mit window.trustedTypes, ob die API vorhanden ist.

Keine erneute Ausführung: Ein Skript läuft höchstens einmal. Wenn du textContent nach dem Einfügen änderst, wird nichts neu ausgeführt. Erzeuge stattdessen ein neues Element. Umgekehrt werden Skripte, die über innerHTML eingefügt werden, grundsätzlich nicht ausgeführt.

JSON-Datenblöcke: Wenn der Server Daten in <script type="application/json"> einbettet, muss er </script bzw. < escapen (z. B. als \u003c). Sonst kann der Block vorzeitig enden, was eine XSS-Lücke öffnet. JSON.parse(el.textContent) ist die sichere Art, solche Daten zu lesen.

Alternativen: HTMLScriptElement.text verhält sich fast gleich. innerText akzeptiert ebenfalls ein TrustedScript.