Signatur
Beschreibung
Die Eigenschaft DocumentType.systemId liefert den Systembezeichner aus einer <!DOCTYPE>-Deklaration. In klassischen HTML-4.01- oder XHTML-Dokumenten ist das die URL der Dokumenttyp-Definition (DTD), etwa http://www.w3.org/TR/html4/strict.dtd.
Zugreifen kann man über document.doctype. Das ist das DocumentType-Objekt des aktuellen Dokuments oder null, wenn kein Doctype vorhanden ist. Bei modernem HTML5 (<!DOCTYPE html>) gibt es keinen Systembezeichner, deshalb ist systemId dort ein leerer String ("").
Praktisch braucht man die Eigenschaft vor allem, um Dokumente zu analysieren oder zu migrieren: Man erkennt Altbestände mit XHTML- oder HTML-4-DTD, stellt fest, ob der Browser im Quirks-Modus rendern könnte, oder baut einen Doctype beim Serialisieren wieder vollständig zusammen. Ein eigenes DocumentType-Objekt mit Systembezeichner erzeugt man über document.implementation.createDocumentType().
Rückgabewert
"", wenn die Deklaration keinen enthält.Beispiele
Systembezeichner des aktuellen Dokuments auslesen
// Mit optionaler Verkettung, falls kein Doctype existiert
const systemId = document.doctype?.systemId ?? null;
if (systemId === null) {
console.log('Kein Doctype vorhanden (Quirks-Modus wahrscheinlich)');
} else if (systemId === '') {
console.log('HTML5-Doctype ohne DTD');
} else {
console.log('DTD-URL:', systemId);
}
Eigenen DocumentType mit DTD erzeugen
const doctype = document.implementation.createDocumentType(
'html',
'-//W3C//DTD XHTML 1.0 Strict//EN',
'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'
);
console.log(doctype.name);
console.log(doctype.publicId);
console.log(doctype.systemId);
Doctype-String aus einem geparsten Dokument rekonstruieren
const html = `<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html><body></body></html>`;
const doc = new DOMParser().parseFromString(html, 'text/html');
const serializeDoctype = (dt) => {
if (!dt) return '';
let out = `<!DOCTYPE ${dt.name}`;
if (dt.publicId) out += ` PUBLIC "${dt.publicId}"`;
else if (dt.systemId) out += ' SYSTEM';
if (dt.systemId) out += ` "${dt.systemId}"`;
return out + '>';
};
console.log(serializeDoctype(doc.doctype));
// Wichtig · Fallstricke
- Schreibgeschützt: Eine Zuweisung an
systemIdwird still ignoriert, im Strict Mode wirft sie einenTypeError. Um den Wert zu ändern, erzeugt man einen neuenDocumentTypeund ersetzt den alten mitreplaceWith(). document.doctypekannnullsein. Ohne Prüfung oder?.gibt es einenTypeError.- Bei HTML5 ist der Wert
""und nichtnull. Die veraltete Kompatibilitätsform<!DOCTYPE html SYSTEM "about:legacy-compat">liefert dagegen"about:legacy-compat". - Die DTD wird von Browsern nicht geladen. Die URL wird nur als Text gespeichert.
- Die zugehörigen Eigenschaften
entities,notationsundinternalSubsetwurden aus dem DOM-Standard entfernt und sind in modernen Browsern nicht mehr vorhanden. - Die Eigenschaft wird in allen gängigen Browsern seit Langem unterstützt.