Fun Facts zu Doctypes

Achtung: dieser Beitrag ist alt! Es kann gut sein, dass seine Inhalte nicht mehr aktuell sind.

Bis letzte Woche konnte ich nur erahnen, wie es ist, Wissenschafts- oder Politblogger zu sein. Diese bedauernswerten Zeitgenossen werden ja auf Schritt und Tritt von abstrusen Gestalten mit originellen Theorien über das Wesen der Welt verfolgt – Esotriker, Kryptofaschisten, Astrologen, 9/11-Besserwisser. Dann aber kam ein HTML5-Verschwörungstheoretiker auf mich zu, der behauptete beweisen zu können, dass der HTML5-Doctype <!DOCTYPE html>) mindestens so schlimm ist wie Handystrahlen und die jüdische Weltverschwörung, denn der HTML5-Doctype löse ja den Quirks Mode aus! Und wenn so ein dahergelaufener Eumel wie John Resig das Gegenteil behauptet, liegt er eben falsch.

Das Problem ist, dass unser HTML5-Verschwörungstheoretiker nicht nur unrecht hat, sondern in etwa so weit daneben liegt, wie ein 9/11-Thruther, der behauptet, die US-Regierung habe am 11. September 2001 nicht das World Trade Center, sondern den Eiffelturm gesprengt. Denn tatsächlich sind Browsern Art und Inhalt eines Doctypes komplett egal. Sofern am Start einer HTML-Seite irgend etwas steht, das grob nach Doctype aussieht, wird jeder Browser die Seite im Standards Mode rendern. Das Folgende ist formal ungültiger, aber wunderbar funktionierender Doctype (hier in Aktion):

<!DOCTYPE html public "Browsern ist völlig egal was im Doctype steht."
	"Solange da irgendwas steht, was grob nach Doctype-Syntax aussieht, wird Standards Mode verwendet.">

Warum aber ist dem Browser der Doctype so egal? Sehen wir uns einmal einen richtigen Doctype an:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

Dieser Doctype besteht aus dem Syntax-Pflichtprogramm (<!DOCTYPE html ...), der Deklaration der hier verwendeten HTML-Variante (XHTML 1.0 Transitional) und einer URL. Diese URL enthält alle Informationen, die der Browser zum Verarbeiten der genannten HTML-Variante braucht. Theoretisch wäre das sehr wichtig, denn threoretisch ist HTML eine SGML-Anwendung. SGML ist so etwas wie der Urahn von XML und HTML stünde demnach in einer solchen Beziehung zu SGML, wie XHTML in Beziehung zu XML steht – das Letztere dient jeweils dazu, Ersteres umzusetzen. In der Theorie müsste man dem Browser als wirklich mitteilen, wo genau er nachlesen kann, wie er die Tags in einer HTML-Seite mit seinem SGML-Parser zu verarbeiten hat. Dieser Informationen findet der Browser unter der im Doctype angegeben URL; die .dtd-Datei enthält eine Liste aller HTML-Tags für den jeweiligen Doctype.

Die Praxis sieht allerdings anders aus. Kein Browser hat je so gearbeitet. Kein Browser hatte je einen SGML-Parser. Kein Browser hat je Doctypes verarbeitet und die .dtd-Dateien heruntergeladen. Es herrschte schließlich in der Anfangszeit des Webs Browserkrieg und man hatte dringenderes zu tun, als korrekte Parser zu implementieren –mit Standards nahm man es schon damals nicht so genau. So entwickelte sich HTML statt zu einer SGML-Anwendung zu einer ganz eigenen Auszeichnungssprache, die eigentlich gar keine Informationen aus Doctypes mehr brauchte. Alle Regeln zu HTML waren und sind auch noch heute fest in die Browser eingebaut.

Und so kommt es, dass Browsern die Inhalte von Doctypes völlig egal sind – Hauptsache es ist überhaupt einer vorhanden. Und folgerichtig funktioniert natürlich der HTML5-Doctype genau so gut wie alle anderen.

Kommentare (17)

  1. Axel

    17. August 2010, 12:24 Uhr

    Naja, so ganz richtig ist das ja nicht. Bestimmte Doctype triggern eben dann doch den Quirks-Mode:

    http://hsivonen.iki.fi/doctype/

  2. Fabian

    17. August 2010, 12:26 Uhr

    Ich stell' mir gerade vor, wie lang die Lazenz wohl ist, wenn jeder Browser die .dtd-Datei vor dem Darstellen herunterladen und anhand dieser die Objekte der Seite rendern würde? Da würde doch jeder ungeduldig werden!

    Und was würde passieren, wenn die .dtd ein 404er ist? Dann würde der Browser doch wahrscheinlich ein fallback auf seine eigenen Routinen haben? Im Prinzip also das, was die heute haben und aus Prinzip gleich machen? ;)

  3. Peter

    17. August 2010, 12:33 Uhr

    Zitat Axel:

    Naja, so ganz richtig ist das ja nicht. Bestimmte Doctype triggern eben dann doch den Quirks-Mode:

    http://hsivonen.iki.fi/doctype/

    Ich sag ja, die müssen schon grob wie ein normaler Doctype aussehen. Kompletter Blödsinn läuft natürlich nicht.

  4. Jumpingpixel

    17. August 2010, 12:40 Uhr

    @Fabian ich stelle mir vor das die Browser die .dtd einmal holen und im Cache speichern so wie man das mit mod_expires halt macht.

    Und noch ein großen, wenn nicht sogar riesigen, Vorteil hätte die Sache. Alle Browser würde die Element nach den Vorgaben des W3C rendern. Ach wäre das schön.

  5. Bert Kößler

    17. August 2010, 12:45 Uhr

    So weit so gut, nur dass die DTD, würde sie ausgewertet, nichts dazu beitragen würde, WIE die Inhalte zu rendern sind. Die DTD sagt nur aus, welche Elemente innerhalb anderer Elemente erlaubt oder erforderlich sind und ähnliches.

    Abgesehen davon würde mich aber noch interessieren, wer auf die fragwürdige Idee kam, den HTML5-Doctype "<!DOCTYPE html>" zu nennen. Das ist aus meiner Sicht absoluter Schwachsinn, weil es nicht kompatibel zu späteren Versionen ist. Wie soll man jemals HTML5 und HTML6 voneinander unterscheiden können?

    Vielleicht denke ich da ja zu sehr in XML. Dort muss ich auch entweder eine URL angeben oder eine interne DTD schreiben. So macht das Sinn und vernünftige Programme werten das auch aus. Böse Browser.

  6. kuschti

    17. August 2010, 12:45 Uhr

    Danke für den Beitrag und die Erklärung, sehr interessant!

    Aber trotzdem noch eine kleine Verständnis-Frage: Wieso rendert der IE7 oder IE8 eine Seite (also Beispiel hatte ich letztens eine Sharepoint Seite) anders, wenn ich den Doctype ändere? z.B. von HTML 4.01 zu XHTML.

  7. Fabian

    17. August 2010, 13:04 Uhr

    Zitat Jumpingpixel:

    @Fabian ich stelle mir vor das die Browser die .dtd einmal holen und im Cache speichern so wie man das mit mod_expires halt macht.

    Na ja, sofern die .dtd immer den gleichen Pfad/Adresse hat. Irgendwann beginnt man dann seine eigenen .dtd zu hosten/anzubieten woraus dann ein weiteres Chaos entsteht. Und das Problem eines 404-Fehlers ließe sich ja auch nur durch eine gewisse Standardvorgabe, die im Browser hinterlegt ist, vermeiden. Worauf das ganze schon wieder für mich daraus hinausläuft, dass es ein Kuddelmuddel geben wird.

    Zitat Jumpingpixel:

    Und noch ein großen, wenn nicht sogar riesigen, Vorteil hätte die Sache. Alle Browser würde die Element nach den Vorgaben des W3C rendern. Ach wäre das schön.

    So wie ich das bei HTML5 verstehe, wird dort doch explizit vorgegeben, wie man Feature x einzubauen hat, oder? Damit würde doch jeder Browser die Ausgabe gleich gestalten/ausführen, was Inkompatibilitäten vermeidet sollte?

  8. Markus

    17. August 2010, 13:07 Uhr

    Zitat Bert Kößler:

    Abgesehen davon würde mich aber noch interessieren, wer auf die fragwürdige Idee kam, den HTML5-Doctype "" zu nennen. Das ist aus meiner Sicht absoluter Schwachsinn, weil es nicht kompatibel zu späteren Versionen ist. Wie soll man jemals HTML5 und HTML6 voneinander unterscheiden können?

    Angeblich will die WHATWG zu einem unversionierten Modell wechseln, wie es bei CSS der Fall ist.

  9. Peter

    17. August 2010, 13:47 Uhr

    Zitat kuschti:

    Aber trotzdem noch eine kleine Verständnis-Frage: Wieso rendert der IE7 oder IE8 eine Seite (also Beispiel hatte ich letztens eine Sharepoint Seite) anders, wenn ich den Doctype ändere? z.B. von HTML 4.01 zu XHTML.

    Änderst du nur den Doctype oder baust du auch eine XML-Deklaration (<?xml version="1.0" encoding="UTF-8"?>) ein? In dem Fall stünde ganz am Anfang der Datei etwas, das eben nicht nach Doctype aussieht → Quirks Mode.

  10. Thomas Hühn

    17. August 2010, 13:50 Uhr

    Zitat Jumpingpixel:

    Und noch ein großen, wenn nicht sogar riesigen, Vorteil hätte die Sache. Alle Browser würde die Element nach den Vorgaben des W3C rendern. Ach wäre das schön.

    Wie sollte das denn funktionieren? DTDs geben doch nur Syntax an?

  11. molily

    17. August 2010, 14:00 Uhr

    Zitat Bert Kößler:

    Wie soll man jemals HTML5 und HTML6 voneinander unterscheiden können?

    Man kann es nicht, aber es ist auch nicht nötig. HTML5 ist syntaxmäßig das »Ende der Geschichte«: Der HTML5-Parser ist abwärts- und aufwärtskompatibel angelegt. Er wird neue Elemente und Attribute parsen können, solange sie sich an die gegebenen Syntax-Regeln halten. Deshalb wird es »HTML5« geschrieben, nicht »HTML 5« - die 5 ist nicht als Versionsnummer gemeint, auf die eine 6 folgt.

    Das ist nun eigentlich nichts neues. So funktionieren die Browser schon so gut wie immer. Sie verstehen sämtliche Elemente und Attribute der HTML-Geschichte, egal was für eine HTML-Version (also was für ein DOCTYPE) darüber steht. Sie ignorieren unbekannte Elemente einfach bzw. übernehmen sie sogar ins DOM, ohne ihnen eine Semantik zu geben. Es gab browserseitig also nie HTML-Versionen. Ob Version 2, 5 oder 33 ⅓, das hat, wie Peter auch schreibt, keine Auswirkung gehabt.

  12. Lexx

    17. August 2010, 14:18 Uhr

    Mein Horizont hat sich erweitert.

  13. Jens Grochtdreis

    20. August 2010, 05:32 Uhr

    So ganz stimmt Dein Postulat nicht. Es nicht vollkommen egal, welche DTD da oben steht. Vor allem bei älteren Browsern ist der Doctype-Switch eine wichtige Erfindung gewesen. So kann man aus einem IE6 einen IE5.5 machen. Das habe ich früher oft genutzt.

    http://carsten-protsch.de/zwischennetz/doctype/einleitung.html

    Mittlerweile habe ich allerdings den Überblick verloren bzw. interessiere mich nicht mehr dafür. Aber es gibt nicht umsonst den Quirksmode und der wird über die DTD getriggert. Eric Meyer hatte mal darüber geschrieben, warum damals bei Mozilla in der Anfangszeit dieser Modus so wichtig war.

  14. Peter

    20. August 2010, 07:31 Uhr

    Doch, das stimmt sehr wohl. Aber Wie schon in Kommentar 3 gesagt muss der Doctype schon gob nach Doctype aussehen. Tatsächlich scheinen sich einige Browser zu verschlucken wenn der erst String im Doctype ein echter Doctype-Name ist, aber kein zweiter String folgt, was nichts daran ändert, dass komplett egal ist was letztlich drin steht.

    <!DOCTYPE html public "-//W3C//DTD HTML 4.01 Transitional//EN" "http://zombo.com/">

    Beispiel.

    Wenn DTDs von Bedeutung wären, würde, wie ja auch mein Verschwörungstheoretiker geäußert hat, der HTML5-Doctype nicht funktionieren.

  15. Axel

    24. August 2010, 14:03 Uhr

    Zitat Peter:

    Zitat Axel:

    Ich sag ja, die müssen schon grob wie ein normaler Doctype aussehen. Kompletter Blödsinn läuft natürlich nicht.

    Nene, schau mal den Link nochmal genau an.

    Es gibt "normale Doctypes" wie

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

    die den Quirks-Mode aktivieren.

  16. Louis

    30. August 2010, 07:22 Uhr

    Und was ist mit dem "Almost Standards Mode"? Ganz so pauschal kann man das ganze dann vllt. doch nicht machen…

  17. Elefant

    28. September 2010, 18:37 Uhr

    Das Jahr 2001 sollte nicht mehr wiederholt werden

Die Kommentarfunktion ist seit Juli 2014 deaktiviert, weil sie zu sehr von Suchmaschinenoptimierern für manuellen Spam mißbraucht wurde. Wenn du Anmerkungen oder Fragen zum Artikel hast, schreib mir eine E-Mail oder melde dich via Twitter.

Folgt mir!

Kauft mein Zeug!

Cover der HTML5-DVD
Infos auf html5-dvd.de, kaufen bei Amazon

Cover des HTML5-Buchs
Infos auf html5-buch.de, kaufen bei Amazon

Cover des CSS3-Buchs
Infos auf css3-buch.de, kaufen bei Amazon