Indexed DB, die neue HTML5-Datenbank im Browser. Teil 1: ein kurzer Überblick

Veröffentlicht am 21. Januar 2013

Logo für HTML5 Offline-Technologien

Die Indexed Database API (kurz Indexed DB) nimmt in der Web-Plattform die Rolle der dicken Datenbank ein. Während Web Storage als Cookie-Ersatz eingeplant ist und nicht als zuverlässiger Datenspeicher für große Applikationen taugt, ist Indexed DB genau dafür gedacht. Anders als bei Web Storage kann Indexed DB neben Strings auch Zahlen, Objekte und Arrays persistent speichern und selbst Blobs stellen kein Problem dar. Darüber hinaus können die gespeicherten Inhalte einfach aus der Datenbank herausgepickt werden und über Teile der Daten zu iterieren ist auch möglich – wie es bei einer richtigen Datenbank eben sein sollte. Damit stellt diese API einen wichtigen Mosaikstein im HTML5-Universum dar, denn einen anderen großkalibrigen Datenspeicher für offlinefähige Webapps wird es so bald nicht nicht browserübergreifend geben.

Nachdem ich fast zwei Wochen lang nichts weiter getan habe, als in den Spezifikationen und Implementierungen von Indexed DB herumzustochern, wird es Zeit, Bericht zu erstatten. Dieser erste Teil behandelt das Wesen der API gemäß der Spezifikationen. Das hier durchexerzierte Beispiel sollte aus dem Stand in aktuellen Chrome- und Firefox-Versionen sowie im Internet Explorer 10 funktionieren – wie man Indexed DB auch allen anderen Browserfamilien beibringt und was es an Fallstricken und Tools gibt, folgt im zweiten Teil.

Wieso Indexed DB?

IndexedDB ist eine NoSQL-Datenbank, ähnlich wie die in der Open-Source-Welt bekannten CouchDB und MongoDB. Solche Datenbanken haben anders als z.B. MySQL keine festen Datenbanktabellen, sondern bestehen aus Ansammlungen von „Dokumenten“ (meist JSON-Objekte) als Datensätzen. Innerhalb einer solchen Ansammlung können die einzelnen Datensätze bei Bedarf unterschiedlich aufgebaut sein, was mit einer starren Tabellenstruktur wie in den bekannten SQL-Datenbanken nicht ohne weiteres möglich ist. Der Preis für diese Flexibilität ist natürlich, dass die Applikation, die mit der Datenbank arbeitet, für alle unterschiedlich aufgebauten Dokumente gerüstet sein muss – die Datenbank wird im Vergleich zu SQL also konzeptionell vereinfacht, die Applikation potenziell komplexer. Behauptungen, nach denen das eine Modell skalierbarer oder performanter sei als das andere, dürften für die Arbeit im Webbrowser wohl erst mal von untergeordneter Bedeutung sein.

Obwohl NoSQL zur Zeit recht hip ist (in dem Rahmen, in dem Datenbanken hip sein können), ist es dennoch im Vergleich zu SQL die eher ungewöhnliche Lösung. Warum kommt gerade die in unsere Browser? Es gab mit Web SQL Database mal einen Ansatz, SQL-Datenbanken im Rahmen von HTML5 zu standardisieren, was aber 2010 gescheitert ist. Alle Browserhersteller, die an Web SQL interessiert waren, haben als Basis ihrer Umsetzung SQLite gewählt, ein bewährtes Open-Source-Datenbanksystem. In Folge traten auf dem Weg zur Standardisierung zwei Probleme auf:

  1. Hätte ein Browserhersteller ein anderes System als SQLite als Datenbank-Backend gewählt, wäre dessen Subset der SQL-Syntax nicht das gleiche gewesen, wie das der anderen Browser und die Implementierungen wären nicht kompatibel gewesen
  2. Solange nicht zwei voneinander unabhängige Implementierungen einer Technologie vorliegen, kann diese nicht zum Webstandard erhoben werden

Aus dieser Zwickmühle gab es nur einen Ausweg: hinfort mit Web SQL, her mit einer von Grund auf neuen Lösung. Die Spezifikationen für Indexed DB beschreiben ein komplett eigenes NoSQL-System, von der Browser-API bis hin zu den Algorithmen der einzelnen Datenbank-Operationen. Jeder Browserhersteller kann anhand dessen seine eigene Implementierung bauen, die dann trotzdem kompatibel zur Konkurrenz ist und auf dem Weg zum Webstandard nicht stört.

Hallo Welt mit Indexed DB I: Datenbank und Object Stores

Die API von Indexed DB in ihrer Gesamtheit ist recht komplex, weswegen wir uns in diesem Post auf das Durchexerzieren eines einfaches Schreiben-Lesen-Löschen-Beispiels beschränken, bei dem wir lediglich die Namen toller Browser-Features in einer Datenbank ablegen. Wie jede NoSQL-Datenbank hat auch Indexed DB seine ganz eigene Terminologie. Diese wird in den Spezifikationen umfassend erklärt; die wichtigsten Begriffe sind die Folgenden:

  • Datenbanken enthalten Object Stores
  • Object Stores entsprechen Datenbank-Tabellen und enthalten Datensätze
  • Ein Datensatz ist ein Key mit einem dazugehörigen Wert
  • Ein Key kann ein String eine Zahl oder ein Array sein und identifiziert einen Datensatz
  • Werte können alles mögliche sein: Strings, Zahlen, Objekte, Arrays, Blobs …
  • Transaktion sind ein Set gemeinsam durchgeführter Operationen
  • Cursor sind ein Iterationsmechanismus für größere Mengen von Datensätzen

Um etwas mit Indexed DB zu machen, braucht es zunächst eine Datenbank. Eine solche lässt sich ganz einfach per window.indexedDB.open() öffnen bzw. erzeugen:

// Datenbank anlegen
var request = indexedDB.open('html5', 1);

Die Datenbanken sind nach Origin (Kombination aus Host, Protokoll und Port einer Webapp) getrennt, d.h. foo.com kann nicht die Datenbank von www.bar.de öffnen.

Das erste Funktionsargument von indexedDB.open() ist der Name der Datenbank, das zweite die Versionsnummer. Diese Nummer wird für die interne Versionierung der Webapp verwendet – wann immer man Änderungen an der Struktur der DB vornehmen möchte, ändert man diese Zahl. Diese Änderung hat dann Auswirkung auf die Events der Datenbank-Anlege-Operation. Wie der obrige Code mit seinem var request bereits erahnen lässt, wird in der Zeile mit indexedDB.open() nicht wirklich die Datenbank angelegt, sondern es wird ein entsprechender asynchroner Request gestartet. Ist dieser abgeschlossen, feuern die folgenden Events auf dem request-Objekt:

  1. error wenn etwas beim Anlegen der Datenbank schiefgelaufen ist
  2. upgradeneeded wenn die Datenbank-Version sich geändert hat oder die Datenbank erstmals angelegt wurde
  3. success wenn die Datenbank geöffnet wurde (nach einem eventuellen upgradeneeded-Event)

Das upgradeneeded-Event ist von besonderer Bedeutung, denn nur im Event Handler von upgradeneeded können Änderungen an der Datenbankstruktur durchgeführt werden – versucht man z.B. einen neuen Object Store außerhalb von upgradeneeded anzulegen, setzt es eine Exception.

Beim ersten Aufruf unseres Beispiels legt der Browser die Datenbank „html5“ neu an, d.h. das upgradeneeded-Event feuert. Wir nutzen dies, um in der Datenbank einen Object Store anzulegen, der unsere liebsten HTML-Features enthalten wird:

// Änderungs/Erzeugungs-Event
request.onupgradeneeded = function(){
  console.log('Datenbank angelegt');
  var db = this.result;
  if(!db.objectStoreNames.contains('features')){
    store = db.createObjectStore('features', {
      keyPath: 'key',
      autoIncrement: true
    });
  }
};

Mit der createObjectStore()-Methode der frisch angelegten Datenbank (this.result im Event Handler) lassen sich neue Stores anlegen. Als Argumente werden ein Name sowie ein Konfigurations-Objekt übergeben, das in unserem Fall nur die Durchnummerierung der Datensätze festlegt. Hier entscheiden wir uns für automatisch generierte fortlaufende Nummern (autoIncrement: true) im Feld key unserer Einträge (keyPath: 'key').

Nach dem upgradeneeded-Event (oder sofort, wenn es keine DB-Änderungen gab) feuert das success-Event, sofern sich die Datenbank fehlerfrei öffnen ließ:

// Öffnungs-Event (feuert nach upgradeneeded)
request.onsuccess = function(){
  console.log('Datenbank geöffnet');
  var db = this.result;
  ...
}

Ab hier können wir mit Indexed DB in die Vollen gehen und nach Herzenslust Datensätze speichern, auslesen und löschen.

Hallo Welt mit Indexed DB II: Operationen und Transaktionen

Als Beispiel-Datensatz nehmen wir das denkbar einfachste JavaScript-Objekt:

// Zu speichernder Datensatz
var item = { title: 'Web Storage' };

Um mit Datensätzen in Indexed DB zu arbeiten, braucht es immer die gleichen vier Schritte:

  1. Transaktions-Objekt erstellen
  2. Object Store(s) auswählen
  3. Operation(en) starten (put, delete usw.)
  4. Events abwarten

Ein Transaktions-Objekt erhält man, indem man db.transaction() mit den Namen der betroffenen Object Stores sowie den gewünschten Berechtigungen (readonly oder readwrite) füttert:

// Speicher-Transaktion
var trans = db.transaction(['features'], 'readwrite');

Ab dann ist alles weitere ganz einfach: aus dem Transaktions-Objekt die jeweiligen Object Stores herauspicken (trans.objectStore('storeName')), die gewünschten Operationen veranlassen und auf das success-Event warten:

var store = trans.objectStore('features')
var request = store.put(item); // `item` in dem Store ablegen

// Erfolgs-Event
request.onsuccess = function(evt){
  console.log('Eintrag ' + evt.target.result + ' gespeichert');
  ...
};

Das gleiche Prinzip greift, wenn Einträge aus eine Object Store ausgelesen werden sollen. Im einfachsten Fall, wenn nur ein Datensatz mit bekanntem Key ausgelesen werden soll, braucht es nur ein store.get(42) um z.B. den Eintrag mit dem Key 42 auszulesen.

Wenn es ein bisschen mehr sein darf, werden Cursor und Key Ranges benötigt. Nachdem die Auslese-Transaktion eröffnet und der Object Store gewählt wurde …

var trans = db.transaction(['features'], 'readonly');
var store = trans.objectStore('features');

… muss Indexed DB mitgeteilt werden, für welchen Daten-Ausschnitt wir uns interessieren. Key Ranges sind hier das Mittel der Wahl. Mit einer der Methoden von window.IDBKeyRange lassen sich verschiedene Objekte erzeugen, die solche Ausschnitte beschreiben. Diese Objekte können zwei fixe Grenzwerte haben („alle Einträge von 23 bis 42“) oder nach oben oder unten offen sein (z.B. „alle Einträge ab 42“). Beispiele:

  • IDBKeyRange.lowerBound(0) für alle Einträge von 0 bis Ende
  • IDBKeyRange.upperBound(10) für alle Einträge bis 10
  • IDBKeyRange.only(23, 42) für alle Einträge zwischen 23 bis 42

Diese Grenzwerte beziehen sich in unserem Fall auf den Key der Datensätze; möchte man anhand anderer Felder durch die Datensätze rattern, kombiniert man Key Ranges mit Indizes. In jedem Fall öffnet man mit openCursor()-Methode von Store oder Index einen Cursor (ggf. mit Richtungsangabe), dessen success-Event für jeden Datensatz einmal feuert. In unserem Fall machen wir es uns so einfach wie möglich:

// Cursor für alle Einträge von 0 bis zum Ende
var range = IDBKeyRange.lowerBound(0);
var cursorRequest = store.openCursor(range);

// Wird für jeden gefundenen Datensatz aufgerufen... und einmal extra
cursorRequest.onsuccess = function(evt){
  var result = evt.target.result;
  ...
};

Das success-Event feuert für jeden Datensatz sowie wenn alle Datensätze abgearbeitet wurden nochmal. Für gefundene Datensätze ist die target.result-Eigenschaft des Event-Objekts der gefundene Eintrag, beim letzten Event null. Mit dem Datensätzen kann dann die gewünschte Arbeit verrichtet werden und am Ende der Cursor mittels target.result.continue() zum nächsten Eintrag bewegt werden.

In unserem simplem Beispiel machen wir nichts weiter, als den Eintrag in die Konsole zu schreiben und ihn dann gleich wieder zu löschen:

if(result){
  console.log('Eintrag gefunden:', result.value);

  // Eintrag wieder löschen
  var trans = db.transaction(['features'], 'readwrite');
  var store = trans.objectStore('features');
  var key = result.value.key;
  var request = store.delete(key);
  request.onsuccess = function(evt){
    console.log('Eintrag ' + key + ' gelöscht');
  }
  
  // Cursor zum nächsten Eintrag bewegen
  result.continue();

}

Und fertig! Damit haben wir nur ein sehr sehr simples Beispiel (Demo, Gist) geschaffen, aber eines, das zumindest die wichtigsten Eckpunkte von Indexed DB demonstriert. Und so richtig schwer war es ja nicht – Indexed DB folgt dem löblichen Trend moderner HTML5-APIs, möglichst einfache Schnittstellen für die Webapps von morgen bereitzustellen. Bleibt nur die ewige Frage nach der Browserunterstützung …

In welchen Browser funktioniert Indexed DB?

Grundsätzlich ist diese Frage leicht zu beantworten: in Chrome, Firefox und IE 10 gibt es Unterstützung, ansonsten sieht es finster aus. In allen drei Browsern ist die API mittlerweile ohne Vendor-Prefix benutzbar und es wird allenthalben davon ausgegangen, dass das auch so bleibt, d.h. dass die aktuelle Spezifikationen den Stand des späteren Standards wiederspiegeln.

Problematisch sind alle Browser, die nicht Chrome, Firefox oder IE 10 sind, wobei „problematisch“ gewohnt relativ ist. Zum einen lässt sich Indexed DB per Polyfill für die meisten Browser nachrüsten, zum anderen gibt es durchaus, anders als es Caniuse (noch) angibt, Indexed DB in Android-Browsern ab Version 4 – wenn auch in einer Version aus der frühen Kreidezeit. Alles kein Problem, alles zu fixen, alles in Teil 2 dieses Artikels beschrieben.

Termine für Januar, Februar und März 2013

Veröffentlicht am 16. Januar 2013

Der Erklärbär ist wieder auf Tour! Falls ihr euch mit HTML5- und CSS3-Wissen betanken lassen möchtet, habe ich im ersten Quartal exakt je eine solche Gelegenheit für euch auf Lager:

  • 4. - 6. Februar in München: HTML5-Schulung bei der Open Source School. Mein bewährtes drei­tä­gi­ges HTML5-Standardprogramm stattet die Teilnehmer im Druckbetankungsverfahren mit so gut wie allem aus, was man zu HTML5 wissen muss. Von semantischem Markup bis hin zu Canvas-Programmierung ist alles dabei. Geboten wird ein großer Praxisanteil, kleine Arbeitsgruppen und ein Buch gibt es obendrein.
  • 7. - 8. Februar in München: CSS3-Schulung bei der Open Source School. Mein zweitä­gi­ges CSS3-Standardprogramm katapultiert die Teilnehmer in das CSS3-Zeitalter, in dem Webfonts und Farbverläufe fließen. Einen großer Praxisanteil, kleine Arbeitsgruppen und ein Buch als Bonus gibt es auch hier.

Das HTML5-Programm wird zur Zeit grundlegend aktualisiert, unter anderem kommen mittlerweile auch Indexed DB, getUserMedia und viele andere neuere Spielereien vor, die nicht im Buch stehen.

Ein neues Element für HTML5: <main>

Veröffentlicht am 2. Januar 2013

Wie sicher den Wenigsten entgangen ist, wird fleißig an einem neuen Element für HTML5 gearbeitet. Das <main>-Element soll for the identification of the main content area of a document genutzt werden und damit die bekannten HTML5-Elemente <section>, <header> und Konsorten ergänzen. Stand heute ist das Ganze eigentlich noch nichts weiter, als ein Vorschlag zur Erweiterung des bestehenden Standards, doch da weitgehend Konsens über die Einführung des neuen Elements besteht, kann man sich <main> durchaus schon genauer anschauen.

Wozu <main>?

Das neue Element bietet genau wie alle anderen neuen HTML5-Elemente zwei Dinge: zum einen ist es ein zusätzliches Sprachmittel für die Auszeichnung von Website-Teilbereichen, zum anderen hat es eingebaute ARIA-Funktionen, die wenn das neue Element korrekt benutzt wird, automatisch der Barrierefreiheit der Seite guttun. In Sachen Optik und Verhalten entspricht es genau wie <section> und Konsorten dem, was man vom guten alten <div> kennt.

Gedacht ist <main> für die Auszeichnung des jeweiligen Hauptinhalts einer Seite; im Falle eines Blogs wäre das zum Beispiel die Spalte mit allen Artikeln:

<!doctype html>
<meta charset="utf-8">
<title>Katzenbilder24.com</title>

<header>
  <h1>Katzenbilder-Blog</h1>
  <nav>
    <ul>
      <li><a href="/">Start</a></li>
      <li><a href="/about">Über</a></li>
    </ul>
  </nav>
</header>

<main>
  <article>
    <h2>Flauschiges Kätzchen</h2>
    <p>Text, Bild...</p>
  </article>
  <article>
    <h2>Pelziges Kätzchen</h2>
    <p>Text, Bild...</p>
  </article>
</main>

<aside>
  <section>
    <h2>Tagcloud</h2>
    <p>Tags, Tags, Tags</p>
  </section>
  <section>
    <h2>Blogroll</h2>
    <p>Links, Links, Links</p>
  </section>
</aside>

Anders als <section> hat <main> keinen Einfluss auf die Überschriftenstruktur (Outline) einer Webseite und es darf auch nicht in anderen Abschnitts-Elementen vorkommen – es soll den Hauptinhalt einer Seite markieren, nicht den Hauptinhalt eines Abschnitts der Seite. Ein korrekt verwendetes <main>-Element hat demnach keine <article>, <aside>, <footer>, <header> oder <nav>-Elemente als Vorfahren und ist das einzige Element seiner Art auf der Seite.

Als Bonus hat <main>, wie alle anderen neuen HTML5-Elemente auch, fest eingebaute ARIA-Eigenschaften. Das bedeutet im Endeffekt, dass man bei der korrekten Verwendung von <main> ohne zusätzlichen Aufwand eine zugänglichere Webseite erstellt, da das neue Element automatisch ein role="main" trägt. Dank <main> wird es in Zukunft ziemlich schwierig, diese Annotation zu vergessen.

Braucht man <main> überhaupt?

Einige haben argumentiert, dass man das neue Element gar nicht bräuchte, denn es wäre ja möglich, den Hauptinhalt einer Webseite einfach dadurch zu kennzeichnen, dass man ihn „den Rest“ sein lässt. Beispiel:

<!doctype html>
<meta charset="utf-8">
<title>Katzenbilder24.com</title>

<header>
  <h1>Katzenbilder-Blog</h1>
  <nav>
    <ul>
      <li><a href="/">Start</a></li>
      <li><a href="/about">Über</a></li>
    </ul>
  </nav>
</header>

<article>
  <h2>Flauschiges Kätzchen</h2>
  <p>Text, Bild...</p>
</article>
<article>
  <h2>Pelziges Kätzchen</h2>
  <p>Text, Bild...</p>
</article>

<aside>
  <section>
    <h2>Tagcloud</h2>
    <p>Tags, Tags, Tags</p>
  </section>
  <section>
    <h2>Blogroll</h2>
    <p>Links, Links, Links</p>
  </section>
</aside>

Auch ohne <main> ist klar, was hier der Hauptinhalt ist; alles, was nicht in <header> und <aside> steht, also die Ansammlung der Article-Elemente. Dank role-Attribut ist auch der Barrierefreiheit so viel Genüge getan, wie es mit dem neuen Element der Fall wäre. Es gibt aber vier gute Argumente, die für die Einführung des neuen Elements sprechen:

  • Ein Bereich, der der Hauptinhalt einer Webseite ist, kommt auf vergleichsweise vielen Webseiten vor. Vermutlich auf den meisten. Insofern ist es naheliegend, hierfür ein eigenes Element einzuführen, denn schließlich haben andere häufig auftretende Konstruktionen wie z.B. Navigationen ja auch ihre eigenen Elemente.
  • Aus eigener Erklärbär-Erfahrung kann ich berichten, dass HTML5-Neulinge, wenn man sie Markup schreiben lässt, fast immer den Hauptinhalt in ein Extra-Element Marke <section id="main"> kapseln. Es scheint so zu sein, dass es autorenfreundlich wäre, dafür ein passendes Werkzeug d.h. das neue Element bereitzustellen.
  • Es wäre zwar möglich, manuell role="main"-Attribute zu vergeben, aber es ist zu bezweifeln, dass das wirklich auf breiter Front passiert. Mit dem neuen Element kann das nicht mehr vergessen werden, was (korrekte Verwendung des Elements vorausgesetzt) ohne zusätzlichen Aufwand der Zugänglichkeit der Webseite guttäte – weniger Arbeit für den Autoren, mehr Spaß beim Benutzer.
  • Die HTML Design Principles sagen ganz klar: In case of conflict, consider users over authors over implementors over specifiers over theoretical purity

Bis auf die theorietreue Sparsamkeitsfraktion würden also alle Beteiligten von der Einführung des <main>-Elements profitieren. Bleibt also nur die Frage: wann kommt die Einführung?

Welche Browser unterstützen <main>?

Zur Zeit gibt es das neue (wirklich sehr neue) Element nur als Experimental-Implementierung in Preview-Versionen von Firefox und Chrome. Das ist allerdings nicht zwingend ein Problem, da die Funktionalität von <main> händisch nachgerüstet werden kann. Vorausgesetzt der Browser verarbeitet das Element prinzipiell richtig (was alle Browser außer IE 6, 7 und 8 machen sollten), so muss es nur richtig formatiert und mit den passenden ARIA-Attributen versehen werden. Heißt also: display:block im CSS vergeben und bei der Benutzung in HTML nicht das Attribut role="main" vergessen. Dies wird zwar, sobald alle Browser das neue Element nativ unterstützen, doppelt gemoppelt sein, aber das ist, wenn überhaupt, ein Problem, dessen Lösung man sicher guten Gewissens auf diesen fernen Zeitpunkt vertagen kann.

Wie immer gilt aber, dass in Sachen HTML5-Markup keine übermäßige Eile geboten ist. Alle „alten“ Webseiten werden auch in Zukunft ohne <main> ganz wunderbar funktionieren – nur wenn ein Redesign ansteht, lohnt es sich, über den Einsatz des neuen Elements nachzudenken.

HTML 5 wird 2014 Webstandard - Was bedeutet das, was ändert sich?

Veröffentlicht am 29. November 2012

Man liest, das W3C plane HTML 5.0 im vierten Quartal 2014 fertig, d.h. in einen stabilen Webstandard verwandelt zu haben. Features die sich nicht in diesen Zeitplan quetschen lassen, sollen nach HTML 5.1 verschoben werden, mit dem dann Ende 2016 zu rechnen ist. Das klingt erst mal recht unkompliziert, aber da allerorten mit dem Begriff „HTML5“ etwas unbedacht umgegangen wird (auch in dem W3C-Plandokument) ist etwas unklar, was konkret denn nun 2014 fertig sein soll. Und natürlich lohnt es sich zu fragen, welche Auswirkungen diese Erhebung zum Standard denn haben wird. Ich hatte das bereits in der letzten Folge von Working Draft aufgedröselt, aber der Vollständigkeit halber möchte ich hier nochmal aufschreiben, was es mit diesem Plan auf sich hat und was er für HTML5 zu bedeuten hat.

HTML5 oder HTML 5?

Man kann „HTML5“ entweder mit oder Leerzeichen vor der Fünf scheiben. Die Schreibweise ohne Leerzeichen ist im WHATWG-Lager usus, Freunde des W3C haben es lieber mit Leerzeichen. Die WHATWG ist, wir erinnern uns, jene Arbeitsgruppe der Browserhersteller, die ursprünglich die Entwicklung der ganzen schönen neuen Webtechnologien losgetreten hatten. Die HTML-Arbeitsgruppe des W3C befasst sich mit einem Teilaspekt der WHATWG-Spezifikationen – jenem, der sich vorrangig mit HTML5 im Sinne von HTML befasst. Von diesen beiden Arbeitsgruppen ist weiterhin der allgemeine Sprachgebrauch zu unterscheiden, der den Begriff HTML5 noch viel weiter fasst. Ein Bild sagt mehr als tausend Worte:

Grafik, die das Verhältnis von diversen Webtechnologie-Spezifikationen zueinander illustriert

Der große grüne Kreis ist die Spezifikation der WHATWG, und der große blaue Kreis innen ist die Spezifikation des W3C. Wenn man die Inhaltsverzeichnisse beider Spezifikationen vergleicht, wird der Unterschied klar: währen die WHATWG auch diverse JavaScript-APIs spezifiziert, enthält das W3C-Dokument fast nur HTML im Sinne von HTML. Das heißt aber nicht, dass das W3C sich nicht auch um die JS-Apis kümmern würde, nur ist es eben so, dass einiges, was bei der WHATWG Teil von HTML5 ist, beim W3C in einem eigenen Spezifikationsprozess bearbeitet wird (z.B. der Canvas 2D-Context bei WHATWG und W3C). Der große gelbe Kreis bildet den allgemeinen Sprachgebrauch ab, der unter HTML5 alles vereinigt, was es schönes neues im Browser gibt, von HTML-Tags bis hin zu clientseitigen Datenbanken. Das ist das, was Otto Normalverbraucher mit „HTML5“ meint.

Was wurde beschlossen (und wie schreibt man es)?

Das, was das W3C in seinem Plan für 2014 anpeilt, ist die Anfertigung eines Snapshots vom Dokument der W3C HTML-Arbeitsgruppe (großer blauer Kreis). Die Spezifikationen sollen bis Ende 2014 so weit stabilisiert werden, dass man es zur Recommendation, d.h. zu fertigen Standard erklären kann. Alle anderen Dokumente inklusive der HTML5-Spezifikationen der WHATWG sind davon nicht betroffen. Weil das W3C-Dokument sich vor allem um Parser und HTML-Tags und weniger um Browser-APIs dreht, würde dieser neue Webstandard dann auch tatsächlich eine neue Version von HTML darstellen. Dieser neue Standard hätte dann auch die Schreibweise „HTML 5“ verdient – hier wäre die 5 eine echte Versionsnummer und nicht wie bei „HTML5“ nur Teil eines Namens. Und wenn man schon wieder Versionsnummern hat, so spricht auch nichts mehr gegen Folgeversionen wie 5.1 und weiteres.

Es wäre natürlich praktisch, wenn sich die Welt darauf einigen könnte, die Schreibweise „HTML5“ für die Buzzword-Bedeutung der neuen Technologien zu reservieren und „HTML 5“ bzw. „HTML 5.0“ für die W3C-Spezifikationen zu verwenden (das W3C wirft beides in seinem Plan-Dokument wild durcheinander). So würde uns einerseits der liebgewonnene Oberbegriff erhalten bleiben, andererseits könnte man über die nächste Version einer Auszeichnungssprache sprechen (oder eher schreiben), ohne sich dem Verdacht auszusetzen, ein JavaScript-Supernerd oder gar ein überhypter Nichtsblicker zu sein. Ob es soweit kommt, wird die Zeit zeigen, aber ich werde dieses System auf jeden Fall in Zukunft verwenden.

Dokumente und Recommendations hin oder her: was ändert sich denn nun durch die Standardisierung einer neuen HTML-Version? Eigentlich nichts.

Was sind die Auswirkungen?

Webstandards sind praktisch immer deskriptiv und nicht normativ. Eine Technologie wird nicht zum Standard, indem das W3C sie aufschreibt und folgsame Browserhersteller sie implementieren, sondern es läuft fast immer umgekehrt. Die Programmierer von Browser A erfinden ein neues Feature, die Programmierer von Browser B implementieren etwas ähnliches, man einigt sich auf einen einheitlichen Kompromiss und das W3C schreibt das Endergebnis auf. Somit dürfte klar sein, dass in dem fertigen Standard nichts drin stehen wird, was neu ist, sondern er wird die dann bestehende Browser-Realität abbilden und für die Zukunft festschreiben.

Für Webentwickler gibt es also eigentlich nichts, was sich im Q4 2014 ändert. Falls auch dann jemand noch den Internet Explorer 8 unterstützen muss (Gott bewahre!), so wird er sich nichts davon kaufen können, dass es eine Recommendation für <section> gibt, denn dieses Feature wird der IE8 auch 2014 nicht unterstützen. Auch wird die Standardisierung von HTML 5.0 nicht das Ende des zur Zeit chaotischen Entwicklungsmodells oder des allgemein „unfertigen“ Eindrucks der Web-Plattform bedeuten. Zwar wird dann einiges in Browsern möglich sein, was heute nur in Chrome-Nightlies funktioniert, doch dafür werden sich die Browser-Programmierer bis dahin neue Features ausgedacht haben, über deren Nichtfunktionieren wir uns dann aufregen können.

Wenn also aus „HTML5“ demnächst „HTML 5.0“ wird und es mit dem Recommendation-Stempel versehen wird, heißt es also aus der Perspektive der Webentwickler mal wieder: Raider heißt jetzt Twix … sonst ändert sich nix.