Start · Sprachen · JavaScript · Referenz · HTMLScriptElement.blocking

HTMLScriptElement.blocking

Eigenschaft

Gibt eine dynamische <code>DOMTokenList</code> zurück, die das <code>blocking</code>-Attribut eines <code>&lt;script&gt;</code> widerspiegelt, z. B. <code>render</code> zum Blockieren des Renderns.

seit JavaScript Chromium 105+ (Chrome, Edge, Opera); in Firefox un Kategorie: webapi

Signatur

HTMLScriptElement.blocking

Beschreibung

Die schreibgeschützte Eigenschaft blocking eines HTMLScriptElement spiegelt das HTML-Attribut blocking als dynamische DOMTokenList wider. Die Liste enthält die Vorgänge, die blockiert werden sollen, solange das Skript geladen und ausgeführt wird. Laut Spezifikation gibt es derzeit nur einen gültigen Wert: render.

Mit blocking="render" wartet der Browser mit dem ersten Rendern der Seite, bis das Skript geladen und ausgeführt ist. Das ist vor allem bei async- oder type="module"-Skripten hilfreich. Diese blockieren das Rendern normalerweise nicht, müssen aber manchmal vor dem ersten Rendern laufen, damit die Seite nicht flackert. Typische Fälle sind A/B-Tests, das Umschalten des Farbschemas (Dunkelmodus), Übersetzungen oder die Vorbereitung von View Transitions.

Die Eigenschaft ist zwar schreibgeschützt, lässt sich aber über die Methoden der DOMTokenList ändern (add(), remove(), toggle(), contains()). Weist man ihr direkt einen String zu, wird dieser an value weitergeleitet und setzt damit das Attribut. Ob ein Wert unterstützt wird, prüft man mit script.blocking.supports("render").

Rückgabewert

Typ
DOMTokenList
Beschreibung
Dynamische Liste der Tokens aus dem blocking-Attribut. Einziger gültiger Wert ist derzeit "render". Fehlt das Attribut, ist die Liste leer.

Beispiele

Attribut aus dem Markup auslesen

// HTML im <head>:
// <script id="theme" src="/js/theme.js" type="module" blocking="render"></script>
const script = document.getElementById('theme');

console.log(script.blocking.value);               // Inhalt des Attributs
console.log(script.blocking.contains('render'));  // blockiert das Skript das Rendern?
console.log(script.blocking.length);
render true 1

Funktion erkennen und Unterstützung von „render“ prüfen

const supportsRenderBlocking = () => {
  if (!('blocking' in HTMLScriptElement.prototype)) return false;
  const probe = document.createElement('script');
  return probe.blocking.supports('render');
};

console.log(supportsRenderBlocking()
  ? 'Render-Blocking wird unterstützt'
  : 'Nicht unterstützt – Ersatzlösung verwenden');
Render-Blocking wird unterstützt // z. B. in Chrome 105+

Asynchrones A/B-Test-Skript vor dem ersten Rendern einfügen

// Dieses Inline-Skript steht im <head> und läuft, bevor <body> geparst wird
const script = document.createElement('script');
script.src = '/js/ab-test.js';
script.async = true;

if ('blocking' in script) {
  script.blocking.add('render'); // kein Flackern, bis die Variante gesetzt ist
}

document.head.append(script);
console.log(script.getAttribute('blocking'));
render

Token per Zuweisung setzen und wieder entfernen

const script = document.querySelector('script[src="/js/i18n.js"]');

// Eine Zuweisung wird an blocking.value weitergeleitet
script.blocking = 'render';
console.log(script.outerHTML.includes('blocking="render"'));

script.blocking.remove('render');
console.log(script.hasAttribute('blocking'), script.blocking.length);
true true 0

// Wichtig · Fallstricke

  • Browser-Unterstützung: Die Eigenschaft gibt es nur in Chromium-basierten Browsern (ab Version 105). In Firefox und Safari ist sie undefined. Prüfe die Unterstützung daher immer mit 'blocking' in HTMLScriptElement.prototype oder blocking.supports('render'). Browser ohne Unterstützung ignorieren das Attribut einfach.
  • Nur im Kopfbereich und nur früh wirksam: Render-Blocking greift nur, solange der Browser noch render-blockierende Elemente zulässt. Das ist der Fall, bis der Parser <body> erreicht. Wird ein Skript später dynamisch eingefügt oder das Token später gesetzt, blockiert es das erste Rendern nicht mehr.
  • Performance: Jedes render-blockierende Skript verzögert First Contentful Paint und Largest Contentful Paint. Setze render nur für kleine, wirklich nötige Skripte ein. Ein langsamer Server eines Drittanbieters kann sonst die ganze Seite aufhalten.
  • Klassische Skripte ohne async/defer im <head> blockieren das Rendern ohnehin schon, weil der Parser auf sie wartet. Wirklich sinnvoll ist das Attribut vor allem bei async- und Modul-Skripten.
  • Unbekannte Tokens (z. B. "paint") nimmt die Liste zwar auf, sie haben aber keine Wirkung. supports() liefert für sie false.