Signatur
Beschreibung
Die Eigenschaft document.implementation ist schreibgeschützt und liefert das DOMImplementation-Objekt, das zum aktuellen Dokument gehört. Es arbeitet unabhängig von einem bestimmten Dokumentinhalt. Mit seinen Fabrikmethoden erzeugen Sie neue, eigenständige Dokumente, die nicht in die aktuelle Seite eingehängt sind.
Diese Methoden stehen zur Verfügung:
createHTMLDocument(title)– erzeugt ein leeres HTML-Dokument mit<html>,<head>,<title>und<body>.createDocument(namespaceURI, qualifiedName, doctype)– erzeugt einXMLDocument, z. B. für SVG oder eigene XML-Formate.createDocumentType(qualifiedName, publicId, systemId)– erzeugt einenDocumentType-Knoten.hasFeature()– veraltet, liefert immertrue.
Typische Einsatzfälle sind das Parsen und Bereinigen von HTML-Fragmenten in einem inerten Dokument, in dem keine Skripte laufen und keine Bilder geladen werden. Weitere Fälle sind das Erzeugen von XML-Dokumenten zur Serialisierung sowie Tests, bei denen ein frisches DOM gebraucht wird, ohne die aktuelle Seite zu verändern.
Rückgabewert
DOMImplementation-Objekt. Für dasselbe Dokument ist es immer dieselbe Instanz.Beispiele
Leeres HTML-Dokument erzeugen und befüllen
const doc = document.implementation.createHTMLDocument('Bericht');
const p = doc.createElement('p');
p.textContent = 'Erstellt außerhalb der aktuellen Seite.';
doc.body.append(p);
console.log(doc.title);
console.log(doc.documentElement.outerHTML);
HTML-Fragment in einem inerten Dokument untersuchen
const untrusted = '<img src="x" onerror="alert(1)"><b>Hallo</b>';
const sandbox = document.implementation.createHTMLDocument('');
sandbox.body.innerHTML = untrusted; // kein Laden, kein onerror
// Event-Handler-Attribute entfernen
sandbox.body.querySelectorAll('*').forEach((el) => {
[...el.attributes]
.filter((a) => a.name.startsWith('on'))
.forEach((a) => el.removeAttribute(a.name));
});
console.log(sandbox.body.innerHTML);
XML-Dokument mit Doctype erzeugen und serialisieren
const impl = document.implementation;
const doctype = impl.createDocumentType('bestellung', '', 'bestellung.dtd');
const xml = impl.createDocument(null, 'bestellung', doctype);
const artikel = xml.createElement('artikel');
artikel.setAttribute('id', '42');
artikel.textContent = 'Tastatur';
xml.documentElement.append(artikel);
console.log(new XMLSerializer().serializeToString(xml));
SVG-Dokument im richtigen Namensraum anlegen
const SVG_NS = 'http://www.w3.org/2000/svg';
const svgDoc = document.implementation.createDocument(SVG_NS, 'svg', null);
const circle = svgDoc.createElementNS(SVG_NS, 'circle');
circle.setAttribute('r', '10');
svgDoc.documentElement.append(circle);
console.log(svgDoc.documentElement.namespaceURI);
// Wichtig · Fallstricke
- Schreibgeschützt: Eine Zuweisung an
document.implementationhat keine Wirkung. Im Strict Mode wirft sie einenTypeError. - Inerte Dokumente sind keine vollständige Absicherung gegen XSS: Solange ein Knoten im erzeugten Dokument bleibt, laufen dort keine Skripte und es werden keine Ressourcen geladen. Das ändert sich, sobald Sie Knoten mit
document.importNode()/adoptNode()übernehmen oder das Markup überinnerHTMLin die aktuelle Seite einfügen. Dann werden gefährliche Attribute wieonerroroderjavascript:-URLs aktiv. Für echtes Bereinigen von HTML nutzen Sie eine geprüfte Bibliothek wie DOMPurify oder die Sanitizer-API, sobald sie verfügbar ist. - Skripte:
<script>-Elemente, die perinnerHTMLeingefügt werden, führt der Browser grundsätzlich nicht aus – weder im erzeugten noch im aktuellen Dokument. createDocument()liefert einXMLDocument. Dort sind Element- und Attributnamen case-sensitiv. Für HTML-Elemente brauchen Sie den XHTML-Namensraumhttp://www.w3.org/1999/xhtml, sonst verhalten sich die Elemente nicht wie HTML-Elemente.hasFeature()ist veraltet und gibt in modernen Browsern immertruezurück. Für Feature-Erkennung taugt die Methode deshalb nicht.- Kompatibilität: Die Eigenschaft wird von allen Browsern unterstützt. In Node.js gibt es sie nicht nativ, wohl aber in DOM-Implementierungen wie jsdom oder happy-dom.