Start · Sprachen · JavaScript · Referenz · DocumentType.publicId

DocumentType.publicId

Eigenschaft

Die schreibgeschützte Eigenschaft <code>publicId</code> liefert den öffentlichen Bezeichner (Public Identifier) der Dokumenttyp-Deklaration als String.

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

Signatur

DocumentType.publicId

Beschreibung

Die Eigenschaft DocumentType.publicId gibt den öffentlichen Bezeichner einer Dokumenttyp-Deklaration (DTD) zurück, also den formalen Namen hinter dem Schlüsselwort PUBLIC. Bei <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> lautet der Wert beispielsweise "-//W3C//DTD XHTML 1.0 Strict//EN".

Beim modernen HTML5-Doctype <!DOCTYPE html> gibt es keinen öffentlichen Bezeichner, daher ist der Wert ein leerer String ("") und nicht null. Zugriff erhalten Sie in der Regel über document.doctype, das ein DocumentType-Objekt oder null liefert, wenn keine Deklaration vorhanden ist.

Nützlich ist die Eigenschaft vor allem für Diagnose- und Analysewerkzeuge: um festzustellen, ob eine Seite ein veraltetes HTML-4.01- oder XHTML-Doctype verwendet, um den Doctype beim Serialisieren eines Dokuments zu rekonstruieren oder um XML-Dokumente mit einer bestimmten DTD zu erkennen.

Rückgabewert

Typ
string
Beschreibung
Der öffentliche Bezeichner der DTD oder ein leerer String "", wenn keiner angegeben ist.

Beispiele

Public Identifier der aktuellen Seite auslesen

const doctype = document.doctype;

if (doctype) {
  console.log(`Name: ${doctype.name}`);
  console.log(`publicId: "${doctype.publicId}"`);
} else {
  console.log('Kein Doctype vorhanden (Quirks-Modus wahrscheinlich)');
}
Name: html publicId: ""

Veraltete Doctypes erkennen

const legacyIds = [
  '-//W3C//DTD HTML 4.01//EN',
  '-//W3C//DTD HTML 4.01 Transitional//EN',
  '-//W3C//DTD XHTML 1.0 Strict//EN',
  '-//W3C//DTD XHTML 1.0 Transitional//EN'
];

const checkDoctype = (doc) => {
  const dt = doc.doctype;
  if (!dt) return 'fehlt';
  if (dt.publicId === '') return 'HTML5';
  return legacyIds.includes(dt.publicId) ? `veraltet (${dt.publicId})` : `unbekannt (${dt.publicId})`;
};

console.log(checkDoctype(document));
HTML5

Doctype selbst erzeugen und serialisieren

const dt = document.implementation.createDocumentType(
  'html',
  '-//W3C//DTD XHTML 1.0 Strict//EN',
  'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'
);

console.log(dt.publicId);
console.log(new XMLSerializer().serializeToString(dt));
-//W3C//DTD XHTML 1.0 Strict//EN <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

// Wichtig · Fallstricke

  • Leerer String statt null: Fehlt der Public Identifier (z. B. bei <!DOCTYPE html>), ist der Wert "". Prüfen Sie daher mit === '' und nicht mit === null.
  • document.doctype kann null sein: Ohne Doctype-Deklaration gibt es kein DocumentType-Objekt; ein direkter Zugriff auf document.doctype.publicId wirft dann einen TypeError. Verwenden Sie Optional Chaining: document.doctype?.publicId.
  • Schreibgeschützt: Zuweisungen werden ignoriert (im Strict Mode kommt es zu einem TypeError). Einen anderen Doctype erhalten Sie nur, indem Sie mit document.implementation.createDocumentType() einen neuen Knoten erzeugen und den alten ersetzen – das Umschalten des Rendermodus (Quirks/Standards) erfolgt dadurch aber nicht nachträglich.
  • Den Rendermodus sollten Sie besser über document.compatMode prüfen, statt die publicId selbst auszuwerten.
  • Kompatibilität: wird von allen modernen Browsern und von DOM-Implementierungen wie jsdom unterstützt.