Signatur
Beschreibung
createDocumentType() wird über document.implementation aufgerufen und liefert einen neuen, noch nicht eingefügten DocumentType-Knoten. Er steht für die Doctype-Deklaration am Anfang eines Dokuments, etwa <!DOCTYPE html> oder eine XHTML- bzw. SVG-DTD mit öffentlichem und System-Bezeichner.
Typischerweise übergibt man das Ergebnis als dritten Parameter an DOMImplementation.createDocument(). So entsteht ein XML-Dokument, das seinen Doctype von Anfang an hat. Alternativ lässt sich der Knoten mit Node.insertBefore() oder ParentNode.prepend() in ein bestehendes Dokument einfügen, das noch keinen Doctype hat. Die Methode replaceChild() ersetzt einen vorhandenen Doctype.
Gebraucht wird die Methode vor allem beim Erzeugen von XML oder XHTML im Programm, beim Serialisieren mit XMLSerializer (dort taucht die Doctype-Zeile in der Ausgabe auf) und in Testumgebungen. Für normale HTML-Dokumente ist createHTMLDocument() meist bequemer, denn sie legt den HTML5-Doctype selbst an.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $qualifiedName Pflicht | string | Qualifizierter Name des Doctypes, z. B. "html" oder "svg:svg". Er muss ein gültiger XML-Name sein, sonst wird eine Ausnahme geworfen. |
|
| $publicId Pflicht | string | Öffentlicher Bezeichner (PUBLIC), z. B. "-//W3C//DTD XHTML 1.0 Strict//EN". Ohne Bezeichner einen Leerstring übergeben. |
|
| $systemId Pflicht | string | System-Bezeichner, meist die URL der DTD, z. B. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd". Ohne Bezeichner einen Leerstring übergeben. |
Rückgabewert
DocumentType-Knoten mit den Eigenschaften name, publicId und systemId. Sein ownerDocument ist das Dokument der verwendeten DOMImplementation, einen Elternknoten hat er noch nicht.Beispiele
XHTML-Dokument mit Doctype erzeugen und serialisieren
const doctype = document.implementation.createDocumentType(
'html',
'-//W3C//DTD XHTML 1.0 Strict//EN',
'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'
);
const xhtmlDoc = document.implementation.createDocument(
'http://www.w3.org/1999/xhtml',
'html',
doctype
);
console.log(xhtmlDoc.doctype.publicId);
console.log(new XMLSerializer().serializeToString(xhtmlDoc));
HTML5-Doctype ohne Bezeichner
const dt = document.implementation.createDocumentType('html', '', '');
console.log(dt.nodeType === Node.DOCUMENT_TYPE_NODE, dt.name);
console.log(new XMLSerializer().serializeToString(dt));
Fehlenden Doctype in ein XML-Dokument nachträglich einfügen
const xml = new DOMParser().parseFromString(
'<svg xmlns="http://www.w3.org/2000/svg"/>',
'image/svg+xml'
);
console.log(xml.doctype); // null
const svgDoctype = xml.implementation.createDocumentType(
'svg',
'-//W3C//DTD SVG 1.1//EN',
'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'
);
// Doctype muss vor dem Wurzelelement stehen
xml.insertBefore(svgDoctype, xml.documentElement);
console.log(xml.doctype.name);
Ungültigen Namen abfangen
try {
document.implementation.createDocumentType('1ungültig', '', '');
} catch (err) {
console.log(err.name);
}
// Wichtig · Fallstricke
- Alle drei Parameter sind Pflicht. Leere Bezeichner übergibt man als
''. Wer Argumente weglässt, bekommt je nach Browser einenTypeErroroder"undefined"als Zeichenkette. - Ein ungültiger
qualifiedNamelöst einenDOMExceptionvom TypInvalidCharacterErroraus, ein fehlerhaft aufgebauter qualifizierter Name (z. B."a:b:c") je nach ImplementierungNamespaceError. - Ein Dokument darf höchstens einen Doctype haben, und dieser muss vor dem Wurzelelement stehen. Sonst wirft
insertBefore()/appendChild()einenHierarchyRequestError. - Ein nachträglich eingefügter Doctype ändert den Darstellungsmodus (Quirks- oder Standardmodus) eines bereits geladenen Dokuments nicht. Der Modus wird nur beim Parsen festgelegt.
- Interne DTD-Teilmengen und Entitätsdeklarationen lassen sich nicht anlegen. Die alten Eigenschaften
entities,notationsundinternalSubsetwurden aus dem DOM-Standard entfernt. - Unterstützt wird die Methode in allen aktuellen Browsern. In Node.js gibt es sie nur über DOM-Implementierungen wie
jsdom.