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)
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/
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? ;)
Peter ¶
17. August 2010, 12:33 Uhr
Zitat Axel:
Ich sag ja, die müssen schon grob wie ein normaler Doctype aussehen. Kompletter Blödsinn läuft natürlich nicht.
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.
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.
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.
Fabian ¶
17. August 2010, 13:04 Uhr
Zitat Jumpingpixel:
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:
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?
Markus ¶
17. August 2010, 13:07 Uhr
Zitat Bert Kößler:
Angeblich will die WHATWG zu einem unversionierten Modell wechseln, wie es bei CSS der Fall ist.
Peter ¶
17. August 2010, 13:47 Uhr
Zitat kuschti:
Ä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.Thomas Hühn ¶
17. August 2010, 13:50 Uhr
Zitat Jumpingpixel:
Wie sollte das denn funktionieren? DTDs geben doch nur Syntax an?
molily ¶
17. August 2010, 14:00 Uhr
Zitat Bert Kößler:
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.
Lexx ¶
17. August 2010, 14:18 Uhr
Mein Horizont hat sich erweitert.
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.
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.
Beispiel.
Wenn DTDs von Bedeutung wären, würde, wie ja auch mein Verschwörungstheoretiker geäußert hat, der HTML5-Doctype nicht funktionieren.
Axel ¶
24. August 2010, 14:03 Uhr
Zitat Peter:
Nene, schau mal den Link nochmal genau an.
Es gibt "normale Doctypes" wie
die den Quirks-Mode aktivieren.
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…
Elefant ¶
28. September 2010, 18:37 Uhr
Das Jahr 2001 sollte nicht mehr wiederholt werden