Start · Sprachen · JavaScript · Referenz · DOMImplementation

DOMImplementation

Schnittstelle

Stellt dokumentunabhängige Methoden bereit, etwa zum Erzeugen neuer HTML-, XML- oder SVG-Dokumente und Doctype-Knoten; erreichbar über <code>document.implementation</code>.

seit JavaScript Baseline: alle Browser Kategorie: webapi

Signatur

interface DOMImplementation

Beschreibung

DOMImplementation ist eine Hilfsschnittstelle, die Operationen bündelt, die an kein bestimmtes Dokument gebunden sind. Man erzeugt sie nicht selbst: Jedes Document stellt über die Eigenschaft document.implementation ein fertiges Objekt bereit.

Die Schnittstelle bietet vier Methoden:

  • createHTMLDocument(title): erzeugt ein neues, leeres HTML-Dokument mit <html>, <head>, <title> und <body>.
  • createDocument(namespaceURI, qualifiedName, doctype): erzeugt ein neues XMLDocument, z. B. für SVG oder eigene XML-Formate.
  • createDocumentType(qualifiedName, publicId, systemId): erzeugt einen DocumentType-Knoten, der sich an createDocument() übergeben lässt.
  • hasFeature(): veraltet, gibt aus Kompatibilitätsgründen immer true zurück.

In der Praxis braucht man das vor allem für inaktive Dokumente: HTML lässt sich dort parsen und bearbeiten, ohne dass Skripte laufen, Bilder geladen werden oder die sichtbare Seite neu berechnet wird. Typische Einsätze sind HTML-Vorverarbeitung, Tests, das Erzeugen von XML-Exporten und isolierte DOM-Bäume, deren Knoten man später mit document.importNode() oder adoptNode() in die sichtbare Seite übernimmt.

Parameter

Name Typ Default Beschreibung
$title string Nur bei createHTMLDocument(): Titel des neuen Dokuments. Fehlt er, wird auch kein <title>-Element angelegt.
$namespaceURI Pflicht string|null Nur bei createDocument(): Namensraum des Wurzelelements, z. B. "http://www.w3.org/2000/svg", oder null.
$qualifiedName Pflicht string Bei createDocument() der Name des Wurzelelements (leerer String = kein Wurzelelement), bei createDocumentType() der Doctype-Name, z. B. "svg:svg".
$doctype DocumentType|null null Nur bei createDocument(): optionaler Doctype-Knoten, erzeugt mit createDocumentType().
$publicId Pflicht string Nur bei createDocumentType(): öffentlicher Bezeichner (PUBLIC-Kennung) des Doctypes.
$systemId Pflicht string Nur bei createDocumentType(): Systembezeichner, meist die URL der DTD.

Rückgabewert

Typ
Document | XMLDocument | DocumentType | boolean
Beschreibung
createHTMLDocument() liefert ein Document, createDocument() ein XMLDocument, createDocumentType() einen DocumentType und hasFeature() immer true.

Beispiele

Zugriff auf die Instanz und neues HTML-Dokument erzeugen

// DOMImplementation wird nicht instanziiert, sondern über das Dokument bezogen
const impl = document.implementation;
console.log(impl instanceof DOMImplementation);

const doc = impl.createHTMLDocument('Bericht');
const p = doc.createElement('p');
p.textContent = 'Erstellt in einem separaten Dokument';
doc.body.append(p);

console.log(doc.title);
console.log(doc.body.innerHTML);
true Bericht <p>Erstellt in einem separaten Dokument</p>

Fremdes HTML inaktiv parsen und Links auslesen

const html = '<article><a href="/a">A</a><img src="x" onerror="alert(1)"><a href="/b">B</a></article>';

// Im inaktiven Dokument werden weder Bilder geladen noch Handler ausgeführt
const sandbox = document.implementation.createHTMLDocument('');
sandbox.body.innerHTML = html;

const links = [...sandbox.querySelectorAll('a')].map(a => a.getAttribute('href'));
console.log(links);

// Gewünschten Teil in die echte Seite übernehmen
const article = document.importNode(sandbox.querySelector('article'), true);
article.querySelectorAll('img').forEach(img => img.remove());
document.body.append(article);
["/a", "/b"]

SVG-Dokument mit Doctype erzeugen und serialisieren

const SVG_NS = 'http://www.w3.org/2000/svg';
const impl = document.implementation;

const doctype = impl.createDocumentType(
  'svg',
  '-//W3C//DTD SVG 1.1//EN',
  'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'
);
const svgDoc = impl.createDocument(SVG_NS, 'svg', doctype);

const circle = svgDoc.createElementNS(SVG_NS, 'circle');
circle.setAttribute('cx', '50');
circle.setAttribute('cy', '50');
circle.setAttribute('r', '40');
svgDoc.documentElement.append(circle);

console.log(new XMLSerializer().serializeToString(svgDoc));
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg"><circle cx="50" cy="50" r="40"/></svg>

XML-Export für eine Datenliste

const produkte = [{ id: 1, name: 'Tisch' }, { id: 2, name: 'Stuhl' }];

const xml = document.implementation.createDocument(null, 'produkte', null);
for (const { id, name } of produkte) {
  const el = xml.createElement('produkt');
  el.setAttribute('id', id);
  el.textContent = name;
  xml.documentElement.append(el);
}

console.log(new XMLSerializer().serializeToString(xml));
<produkte><produkt id="1">Tisch</produkt><produkt id="2">Stuhl</produkt></produkte>

// Wichtig · Fallstricke

Keine eigene Instanz: new DOMImplementation() wirft einen TypeError. Verwende immer document.implementation.

Sicherheit: In einem mit createHTMLDocument() erzeugten Dokument laufen keine Skripte, und onerror-Handler werden beim Parsen nicht ausgelöst. Das Dokument ist aber kein Bereinigungswerkzeug: Übernimmst du Knoten per importNode()/adoptNode() in die sichtbare Seite, werden gefährliche Attribute wie onerror oder javascript:-URLs dort aktiv (XSS). Bereinige Fremd-HTML vorher, z. B. mit DOMPurify, und prüfe Trusted Types bzw. die Content Security Policy (CSP).

Knoten gehören zu ihrem Dokument: Elemente aus einem neuen Dokument hängt man mit append() zwar oft stillschweigend in ein anderes ein (implizites Adoptieren), sauberer ist aber importNode(). Bei createDocument() immer createElementNS() mit dem passenden Namensraum verwenden, sonst landen SVG-Elemente im falschen Namensraum und werden nicht gerendert.

Veraltet: hasFeature() gibt immer true zurück und taugt nicht zur Feature-Erkennung. Prüfe stattdessen direkt, ob die gewünschte Eigenschaft oder Methode existiert.

Kompatibilität: Alle Methoden laufen in allen modernen Browsern. In Node.js gibt es kein DOM; nutze dort Bibliotheken wie jsdom. Wer nur HTML-Text parsen will, greift oft zur Alternative DOMParser.