Start · Sprachen · JavaScript · Referenz · DocumentType.systemId

DocumentType.systemId

Eigenschaft

Die schreibgeschützte Eigenschaft <code>systemId</code> gibt den Systembezeichner (meist die URL der DTD) einer Dokumenttyp-Deklaration als String zurück.

seit JavaScript Baseline: alle Browser (DOM Level 2) Kategorie: webapi

Signatur

DocumentType.systemId

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

Typ
string
Beschreibung
Der Systembezeichner (in der Regel eine DTD-URL) oder ein leerer String "", 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);
}
HTML5-Doctype ohne DTD

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);
html -//W3C//DTD XHTML 1.0 Strict//EN http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd

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));
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

// Wichtig · Fallstricke

  • Schreibgeschützt: Eine Zuweisung an systemId wird still ignoriert, im Strict Mode wirft sie einen TypeError. Um den Wert zu ändern, erzeugt man einen neuen DocumentType und ersetzt den alten mit replaceWith().
  • document.doctype kann null sein. Ohne Prüfung oder ?. gibt es einen TypeError.
  • Bei HTML5 ist der Wert "" und nicht null. 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, notations und internalSubset wurden 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.