Signatur
Beschreibung
Die Eigenschaft shadowRootSerializable spiegelt das boolesche HTML-Attribut shadowrootserializable eines <template>-Elements wider. Sie gehört zum deklarativen Shadow DOM. Ein <template shadowrootmode="open"> legt beim Parsen des HTML-Codes direkt einen Shadow Root am Elternelement an, ganz ohne JavaScript.
Ist das Attribut gesetzt, bekommt der erzeugte ShadowRoot die Eigenschaft serializable === true. Solche Shadow Roots werden von Element.getHTML({ serializableShadowRoots: true }) bzw. ShadowRoot.getHTML() mit ausgegeben. Das nutzt man z. B. beim serverseitigen Rendern (SSR), bei Snapshots oder beim Kopieren von Web-Komponenten samt ihrem Shadow-Inhalt.
Im Skript liefert die Eigenschaft true, wenn das Attribut vorhanden ist, sonst false. Setzt man den Wert, wird das Attribut hinzugefügt bzw. entfernt. Das Gegenstück im Skript ist die Option serializable von Element.attachShadow().
Rückgabewert
true, wenn das Attribut shadowrootserializable gesetzt ist, sonst false. Beim Schreiben wird das Attribut hinzugefügt (true) oder entfernt (false).Beispiele
Eigenschaft lesen und setzen (Spiegelung des Attributs)
const tpl = document.createElement('template');
console.log(tpl.shadowRootSerializable); // false
tpl.shadowRootSerializable = true;
console.log(tpl.hasAttribute('shadowrootserializable')); // true
console.log(tpl.outerHTML);
Deklarativen, serialisierbaren Shadow Root per setHTMLUnsafe() erzeugen
const host = document.createElement('div');
host.setHTMLUnsafe(`
<my-card>
<template shadowrootmode="open" shadowrootserializable>
<p>Hallo aus dem Shadow DOM</p>
</template>
</my-card>`);
const card = host.querySelector('my-card');
console.log(card.shadowRoot.serializable); // true
console.log(card.shadowRoot.innerHTML.trim());
Shadow-Inhalt mit getHTML() serialisieren (z. B. für SSR/Snapshots)
const host = document.createElement('div');
host.setHTMLUnsafe(
'<x-badge><template shadowrootmode="open" shadowrootserializable><b>Neu</b></template></x-badge>'
);
// Ohne Option: Shadow Root fehlt in der Ausgabe
console.log(host.getHTML());
// Mit Option: serialisierbare Shadow Roots werden als <template> ausgegeben
console.log(host.getHTML({ serializableShadowRoots: true }));
Unterstützung prüfen
const supportsSerializable =
'shadowRootSerializable' in HTMLTemplateElement.prototype;
console.log(supportsSerializable ? 'Unterstützt' : 'Nicht unterstützt – Fallback nötig');
// Wichtig · Fallstricke
- Wirkt nur beim Parsen: Das Attribut hat nur Einfluss, wenn der HTML-Parser das Template zusammen mit
shadowrootmodeverarbeitet. Das passiert beim ersten Laden des Dokuments sowie beisetHTMLUnsafe()undDocument.parseHTMLUnsafe(). Wenn manshadowRootSerializablean einem bereits bestehenden oder percreateElementerzeugten Template setzt und das Template dann einfügt, entsteht kein Shadow Root.innerHTMLverarbeitet deklaratives Shadow DOM ebenfalls nicht. - Template verschwindet: Nach dem Parsen wird das deklarative Template in den Shadow Root umgewandelt und ist nicht mehr im DOM. Den Zustand prüft man danach über
element.shadowRoot.serializable. - Ohne
shadowrootmodebleibt das Attribut wirkungslos. - Ein
closed-Shadow-Root kann zwar serialisierbar sein, wird vongetHTML()aber nur ausgegeben, wenn man ihn ausdrücklich über die OptionshadowRootsübergibt. - Sicherheit:
setHTMLUnsafe()bereinigt keine Eingaben. Verarbeitet man damit nicht vertrauenswürdiges HTML, drohen XSS-Lücken. - Kompatibilität: Die Eigenschaft ist relativ neu (Chromium 125, Firefox 128, Safari 18). In älteren Browsern ist sie
undefined, deshalb vorher die Unterstützung prüfen.