Signatur
Beschreibung
getHTML() gibt die Kindknoten eines Elements als HTML-String zurück. Ohne Argumente ist das Ergebnis fast immer dasselbe wie beim Lesen von element.innerHTML. Neu ist, dass die Methode auch Shadow Roots ausgeben kann. Diese erscheinen im String als deklaratives Shadow DOM, also als <template shadowrootmode="open|closed">…</template>.
Das braucht man vor allem, wenn man Web Components mit ihrem Shadow DOM vollständig als HTML speichern will. Typische Anwendungen sind serverseitiges Rendern (SSR), Snapshots für Tests, das Speichern von Editor-Inhalten oder das Kopieren von Komponenten in ein anderes Dokument. Um den String wieder einzulesen, nutzt man Element.setHTMLUnsafe() oder Document.parseHTMLUnsafe(). Nur diese beiden Methoden erzeugen aus deklarativem Shadow DOM wieder echte Shadow Roots.
Ein Shadow Root landet nur dann im Ergebnis, wenn eine dieser Bedingungen erfüllt ist:
serializableShadowRoots: trueist gesetzt und der Shadow Root ist serialisierbar. Das ist er, wenn er mitattachShadow({ mode, serializable: true })oder über das Attributshadowrootserializableangelegt wurde.- Der Shadow Root steht ausdrücklich im Array
shadowRoots. Das funktioniert auch bei geschlossenen (closed) und nicht serialisierbaren Shadow Roots.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $options | Object | {} | Optionales Objekt, das festlegt, wie Shadow Roots ausgegeben werden. |
| $options.serializableShadowRoots | boolean | false | Bei true werden alle als serialisierbar markierten Shadow Roots im Teilbaum ausgegeben. |
| $options.shadowRoots | ShadowRoot[] | [] | Shadow Roots, die in jedem Fall ausgegeben werden, auch wenn sie geschlossen oder nicht serialisierbar sind. |
Rückgabewert
innerHTML. Ausgewählte Shadow Roots erscheinen als <template shadowrootmode>.Beispiele
Einfache Umwandlung wie mit innerHTML
const box = document.createElement('div');
box.innerHTML = '<p>Hallo <strong>Welt</strong></p>';
console.log(box.getHTML());
console.log(box.getHTML() === box.innerHTML);
Serialisierbaren Shadow Root mit ausgeben
const host = document.createElement('user-card');
const shadow = host.attachShadow({ mode: 'open', serializable: true });
shadow.innerHTML = '<span>Max Mustermann</span>';
// Ohne Option wird das Shadow DOM ignoriert
console.log(JSON.stringify(host.getHTML()));
// Mit Option wird es als deklaratives Shadow DOM ausgegeben
console.log(host.getHTML({ serializableShadowRoots: true }));
Geschlossenen Shadow Root ausgeben und wieder einlesen
const host = document.createElement('div');
const closedRoot = host.attachShadow({ mode: 'closed' });
closedRoot.innerHTML = '<b>Intern</b>';
// Den Shadow Root ausdrücklich angeben
const html = host.getHTML({ shadowRoots: [closedRoot] });
console.log(html);
// Wieder einlesen: nur setHTMLUnsafe erzeugt echte Shadow Roots
const wrapper = document.createElement('section');
wrapper.setHTMLUnsafe(`<div>${html}</div>`);
console.log(wrapper.firstElementChild.shadowRoot); // closed, deshalb null
console.log(wrapper.firstElementChild.childNodes.length); // kein <template> im Light DOM
// Wichtig · Fallstricke
- Browser-Kompatibilität: Die Methode ist erst seit 2024 in allen großen Browsern verfügbar (Chrome 125, Firefox 128, Safari 18). Für ältere Browser prüft man mit
'getHTML' in Element.prototypeund nutzt sonstinnerHTML, allerdings ohne Shadow DOM. - Nur der Inhalt: Wie bei
innerHTMLfehlt das Element selbst im Ergebnis. Anders alsouterHTMLgibt es keine Variante mit dem Element selbst. - Einlesen:
innerHTMLundinsertAdjacentHTMLmachen aus deklarativem Shadow DOM keine Shadow Roots. Die<template>-Elemente bleiben dann einfach als Templates stehen. NursetHTMLUnsafe()undDocument.parseHTMLUnsafe()werten sie aus. - Sicherheit: Mit der Option
shadowRootslassen sich auch geschlossene Shadow Roots auslesen. Gibt man solche Strings an Dritte weiter, kann das Implementierungsdetails oder Daten preisgeben. Ein ausgegebener String ist außerdem nicht bereinigt. Wird er aus fremden Quellen wieder eingelesen, droht XSS. Unsicheres HTML sollte man vorher bereinigen, zum Beispiel mit DOMPurify oder der Sanitizer-API. - Formularzustände wie der aktuelle Wert eines
<input>, Event-Listener und JavaScript-Eigenschaften werden nicht mit ausgegeben. Übernommen werden nur Attribute und Knoten.