<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
<channel>
<title>Peter Kröner • Webtechnologie • Weblog</title>
<link>http://feeds2.feedburner.com/kroener</link>
<description><![CDATA[Weblog von Peter Kröner, HTML5-Trainer, Webentwickler und Autor]]></description>
<language>de</language>
<ttl>120</ttl>

<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/kroener" /><feedburner:info uri="kroener" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
<title><![CDATA[Die Responsive Images Story]]></title>
<link>http://feedproxy.google.com/~r/kroener/~3/qsgasIncZhQ/</link>
<description><![CDATA[<p class="gastbeitrag"><strong>Responsive Images</strong> sind zur Zeit in aller Munde und verursachen viel Streit. Was steckt dahinter und wert streitet mit wem? Zeit für einen Überblick von jemandem, der mitten drin steckt und selbst an der Entwicklung von Entwürfen zum Thema beteiligt war. <em>Ein Gastbeitrag von <a href="http://anselm-hannemann.com/blog/">Anselm Hannemann</a>.</em>

<p>
Im Juli letzten Jahres kam die Diskussion um <em>responsive images</em> in Webseiten auf. Wir können zwar mittlerweile die tollsten Layouts für verschiedene Endgeräte optimieren, aber die inhaltlichen Bilder&#8230;</p></p>]]></description>
<pubDate>Di, 22 Mai 2012 15:02:41 -0600</pubDate>
<guid isPermaLink="false">http://www.peterkroener.de/die-responsive-images-story/</guid>
<dc:creator>Peter Kröner</dc:creator>
<content:encoded><![CDATA[<p class="gastbeitrag"><strong>Responsive Images</strong> sind zur Zeit in aller Munde und verursachen viel Streit. Was steckt dahinter und wert streitet mit wem? Zeit für einen Überblick von jemandem, der mitten drin steckt und selbst an der Entwicklung von Entwürfen zum Thema beteiligt war. <em>Ein Gastbeitrag von <a href="http://anselm-hannemann.com/blog/">Anselm Hannemann</a>.</em>

<p>
Im Juli letzten Jahres kam die Diskussion um <em>responsive images</em> in Webseiten auf. Wir können zwar mittlerweile die tollsten Layouts für verschiedene Endgeräte optimieren, aber die inhaltlichen Bilder (<code>&lt;img&gt;</code>-Elemente) bleiben dabei immer die gleichen. Und damit hat man natürlich einen großen Nachteil: Große Bilder für Desktopauflösungen werden auch bei Mobilgeräten in voller Dateigröße geladen. Andersherum kann für ein mobile optimiertes Bild kein qualitativ passendes Bild auf ein iPad3 mit HighRes-Display ausgegeben werden. Deshalb waren mehrere Leute der Meinung, dass Bilder ebenfalls responsiv werden müssen.

<h3>Historie und Initiativen</h3>

<p>
Die eine Fraktion der Interessierten wollte direkt ein streamendes Bildformat, was durchaus eine sehr gute und anstrebenswerte Lösung wäre. Allerdings werden damit Randbereiche wie andere Bildausschnitte nicht abgedeckt. Außerdem würde das neue Format wohl erst in frühestens zehn Jahren überall einsetzbar sein. Die andere Fraktion hingegen beschränkte sich auch deshalb auf HTML und CSS als Möglichkeiten. Zu dieser Fraktion gehörte auch ich und deshalb veröffentlichte ich in der Diskussion über das Problem und mögliche Lösungen auf der WHATWG-Mailingliste Ende Juli&nbsp;2011 folgenden Vorschlag:

<pre><code class="prettyprint language-html">&lt;img 
    src="http://cdn.url.com/img/myimage_xs.jpg" 
    media-xs="(min-device-width:320px and max-device-width:640px)" 
    media-xs-src="http://cdn.url.com/img/myimage_xs.jpg"  
    media-m="(min-device-width:640px and max-device-width:1024px)" 
    media-m-src="http://cdn.url.com/img/myimage_m.jpg"  
    media-xl="(min-device-width:1024px)" 
    media-xl-src="http://cdn.url.com/img/myimage_xsl.jpg" 
/&gt;</code></pre>

<p>
Dieser wäre prinzipiell mit alten Browsern kompatibel gewesen, da er auf dem bereits existenten <code>img</code>-Element basiert und gleichzeitig eine einfache Syntax für alternative Ressourcen enthält&nbsp;&ndash; diese würden über über ganz normale CSS3 @media-queries angesteuert.

<p>
Der große Nachteil bei dieser Lösung ist, dass das bisher bekannte <code>src</code>-Attribut nach aktueller Logik der Browser <em>immer</em> geladen werden würde. Im Zweifelsfall lädt der Browser also zunächst das in <code>src</code> referenzierte Bild (das immer das kleinste Format sein sollte) und zusätzlich das passende höher auflösende Bild. Es würden also zusätzliche HTTP-Requests und mehr Datenmengen anfallen, als eigentlich erforderlich. Dies könnte jedoch für moderne Browser aufgehoben werden, wenn die Browserhersteller bei der Implementierung berücksichtigen. Hier war zumindest von Browserseite schnell eine ablehndende Haltung vorhanden, da angeblich größerer Aufwand nötig sei.

<p>
Nach ein paar Antworten schlief die Diskussion in der WHATWG Mailing Liste jedoch schnell ein. Das schlimme daran war jedoch, dass viele damals der Meinung waren, dass solch eine Lösung <a href="http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2011-August/033029.html">nicht gebraucht werde</a>, da ja offenbar kein Bedarf für responsive images da sei. In diesem Zuge schrieb Ian Hickson <a href="http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2012-January/034490.html">selbst im Januar noch</a>

<blockquote lang="en">
<p>What’s the use case for doing it for images in &lt;img&gt; elements? Typically &lt;img&gt; elements are for content images, where you don’t usually want to adapt anything.
</blockquote>

<p>
Im Nachhinein ist diese Entwicklung insofern fatal, als dass einige dieser Leute nun im Mai 2012 einen First Draft für die WHATWG veröffentlicht haben. Als ich aber unterwarteterweise im Oktober 2011 wieder auf das Thema angesprochen wurde und auch mehrere Leute wieder anfingen über das Thema in Blogbeiträgen zu diskutieren, wendete sich zunächst das Blatt. Erneut kam das Thema auf die WHATWG-Mailingliste, wiederum jedoch nicht wirklich mit großer Resonanz.

<h3>Gründung der W3C Community Group "Responsive images" und das &lt;picture&gt;-Element</h3>

<p>
Plötzlich wurde im Februar 2012 dann vom W3C eine <a href="http://www.w3.org/community/respimg/">Community Group "Responsive images"</a> eingerichtet. Eine Community Group ist eine Plattform, auf der jeder, der mitmachen möchte, über spezifische Probleme mit HTML/CSS diskutieren kann. Damit war endlich ein Ort geschaffen, an dem sinnvoll über Vor- und Nachteile der diversen Code-Vorschläge und der zu eruierenden Funktionalitäten und Eigenschaften diskutiert werden konnte. Schnell wuchs die Gruppe auf über 70 Teilnehmer heran, rege Diskussionen wurden geführt, Lösungen vorgeschlagen und verworfen. Letztlich blieb nur noch ein Vorschlag übrig: <a href="http://www.w3.org/community/respimg/2012/03/15/polyfilling-picture-without-the-overhead/">das <code>&lt;picture&gt;</code>-Element</a>. Dabei handelt es sich um ein komplett neues Element, das kein Standard-Browserverhalten mitbringt, wie es das bisherige img-Tag macht, das aber eben mehrere Ressourcen beinhalten kann. Die dazugehörige Syntax sollte wie folgt aussehen:

<pre><code class="prettyprint language-html">&lt;picture alt="Alt tag describing the image represented"&gt;
    &lt;source src="photo.jpg" /&gt;
    &lt;source src="photo@2x.jpg" media="min-device-pixel-ratio:2" /&gt;
    &lt;img src="photo.jpg" /&gt;
&lt;/picture&gt;</code></pre>

<p>
Es handelt sich also um eine Liste an Bildern in <code>&lt;source&gt;</code>-Elementen, angereichtert und abgefragt nach Media Queries, plus ein mögliches Fallback-img-Tag am Ende für ältere Browser. Der Vorteil dieser Technik ist, dass Bilder nicht automatisch geladen werden und nur das angefordert wird, was wirklich nötig ist. Das funktioniert sogar bereits, denn Scott Jehl hat hierzu auf GitHub den sogenannten <a href="https://github.com/scottjehl/picturefill/">picturefill</a> entwickelt, einen Polyfill für das <code>&lt;picture&gt;</code>-Element. Sogar eine <a href="https://github.com/scottjehl/picturefill/tree/div-markup">eine Methode zum bereits heute standardkonformen Einsatz</a> gibt es. Diesen Vorteilen stehen aber auch einige ungelöste Probleme gegenüber.

<p>
Da wäre zum Beispiel die Frage der Ladezeit bei Geräten mit hoher Auflösung. Bloß weil ein iPad3 mit hochauflösendem Display ein Bild anfordert, ist ja noch lange nicht gesagt, dass dieses auch schnell geladen wird. Ist man beispielsweise per GPRS unterwegs, was zumindest in Deutschland dank knapp bemessener „Flatrates“ häufig der Fall ist, so möchte man vielleicht auch auf einem Highres-Bildschirm die kleine Variante des Bildes haben. Da stößt man nun mit den bisher zur Verfügung stehenden Media Query-Abfragen auf Probleme, denn eine Bandbreitenabfrage ist für einen Browser extrem schwierig durchzuführen. Auch die Syntax ist nicht unproblematisch; schließlich ist der ganze Spaß mit einigem Mehraufwand verbunden, wenn ich für jedes Bild mehrere Ressourcen angeben muss und für jede Ressource noch Media Queries festlegen muss.

<p>
Matthew Willcox beschäftigte sich deshalb intensiv in den letzten Wochen mit Möglichkeiten, die Media Query-Vergabe zu automatisieren. Am 13. Mai 2012 brachte er einen <a href="http://www.w3.org/community/respimg/2012/05/13/an-alternative-proposition-to-and-srcset-with-wider-scope/">umfassenden Lösungsansatz heraus</a>, der vorsieht, dass in <code>&lt;meta&gt;</code>-Tags eine Art Template festgelegt wird und mit (noch zu spezifizierenden) HTML-Variablen diese Template-Variablen in den Ressourcenlisten eingesetzt werden können. Auch wenn ich persönlich dem konkreten Vorschlag nicht ganz zustimme: ein Templateverhalten in <code>&lt;meta&gt;</code>-Tags festzulegen wäre eine Möglichkeit mit Variablen schnell und einfach HTML zu schreiben. Das wäre nicht nur für das <code>&lt;picture&gt;</code>-Element sehr praktisch sondern auch für viele andere Anwendungen. Willcox‘ Ansatz sieht im HTML folgendermaßen aus:

<pre><code class="prettyprint language-html">&lt;head&gt;
    &lt;meta name="case" data="breakpoint1" media="min-width:350px" /&gt;
    &lt;meta name="case" data="breakpoint2" media="min-width:1000px" /&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;img src="/content/images/{case}/photo.jpg" alt="" /&gt;
&lt;/body&gt;</code></pre>

<p>
Im CSS ist dazu noch folgendes Format vorgesehen: Statt

<pre><code class="prettyprint language-css">@media only screen and (min-width: 700px) { ... }</code></pre>

<p>
soll nun

<pre><code class="prettyprint language-css">@media (case: breakpoint1) { ... }</code></pre>

<p>
geschrieben werden können.

<h3>WHATWG Vorschlag: responsive images via srclist-Attribut</h3>

<p>
Zum Streitpunkt wurde das Thema responsive images, als die WHATWG am 15. Mai <a href="http://junkyard.damowmow.com/507">einen ganz eigenen Entwurf für responsive images</a> online stellte.  
Das kam sehr überraschend für die meisten &ndash; auch für mich, zumal man selbst auf den WHATWG-Mailinglisten vorab nicht allzuviel darüber lesen konnte. Ich war ehrlich gesagt etwas vor den Kopf geschlagen, als ich von diesem Entwurf hörte; hauptsächlich, weil die Syntax, die der Vorschlag verwendet, extrem unübersichtlich und HTML-untypisch ist:

<pre><code class="prettyprint language-html">&lt;img src="face-600-200@1.jpeg" alt=""
     set="face-600-200@1.jpeg 600w 200h 1x,
          face-600-200@2.jpeg 600w 200h 2x,
          face-icon.png       200w 200h"&gt;</code></pre>

Als Kurzsyntax:

<pre><code class="prettyprint language-html">&lt;img src="logo.png" alt="SampleCorp" set="logo-HD.png 2x"&gt;</code></pre>

<p>
Die Angabe <code>600w 200h</code> ist nicht, wie man vielleicht vermuten würde, eine Größenangabe des Bildes (so war es ja im <code>&lt;img&gt;</code>-Tag immer gewesen), sondern die Angabe der Viewportgröße. Das heißt, hier wird eine Art Mini-Media-Query angegeben. Für mich birgt allein das schon ein extrem großes Fehlerpotential für den normalen Webentwickler.  
Zudem gibt es eine auflösungbasierte Angabe <code>@1x</code> oder <code>@2x</code>, mit der die Auflösungen notiert werden. Bietet man <code>@1x</code> also mit 96ppi an, muss man <code>@2x</code> automatisch mit 192ppi bereitstellen. Auch hier entsteht eine weitere Fehlerquelle. Und es gilt am Ende immer noch das Prinzip: der Nutzer muss ausbaden, was der Entwickler falsch gemacht hat. Wird diese Syntax also genauso eingeführt muss man befürchten, dass Entwickler Fehler generieren, die dazu führen, dass ein User auf eine Smartphoneseite mit einem LowRes-Gerät geht und ein HighRes-Bild ausgeliefert bekommt oder ähnliche Szenarios. Das wäre fatal und sollte wenn irgendwie möglich vermieden werden.

<p>
Das Resultat dieser Aktion der WHATWG war vorhersehbar: die Web-Community <a href="https://twitter.com/#!/search/realtime/%23whatwg">stand</a> <a href="http://html5doctor.com/html5-adaptive-images-end-of-round-one/">innerhalb</a> <a href="http://www.alistapart.com/articles/responsive-images-and-web-standards-at-the-turning-point/">von</a> <a href="http://timkadlec.com/2012/05/wtfwg/">wenigen Stunden Kopf</a>, wobei das vielleicht größte Problem an dieser Geschichte die Kommunikationsweise der WHATWG war. Ich versuche nun mein Bestes, die hunderten von E-Mails, Blogposts und dazugehörigen Kommentare zu sortieren und einzuordnen.

<h3>Das Kommunikationsproblem, was passierte und wie es dazu kam</h3>

<p>
Mehrfach hatte ich mit einigen Community-Membern den Versuch unternommen Browser-Hersteller mit in die Community-Group einzubinden. Der Erfolg war mäßig, denn außer einem Opera-Mitarbeiter meldete sich überhaupt niemand zu Wort, weder von Apple (Safari) noch von Google (Chrome), Mozilla (Firefox) oder Microsoft (Internet Explorer). Und nun, nachdem die Community Group mehrere Monate verschiedene Lösungswege durchdacht und sogar praktisch getestet hatte, wird kommentarlos ein komplett eigener Entwurf angenommen! Dieser kam übrigens von Apple &ndash; Apple hatte bereits zur iPad3-Einführung eine etwas <a href="http://lists.w3.org/Archives/Public/www-style/2012Feb/1103.html">eigenwillige CSS4 Responsive Images-Lösung eingeführt</a>. 

<p>
Leider scheint man in der WHATWG nicht einmal von der Existenz der Community Group etwas mitbekommen zu haben. Das jedoch kann ich mir schwerlich vorstellen, hatten wir nicht nur WHATWG-Mitglieder direkt angesprochen, sondern auch diverse <a href="http://www.alistapart.com/articles/responsive-images-how-they-almost-worked-and-what-we-need/">Fachblogs</a> und <a href="http://www.netmagazine.com/features/state-responsive-images">-portale</a>, die darüber berichteten. Nebenher tauchte der Link zur Gruppe auch in den WHATWG-Mailinglisten auf. Dennoch wurde der Spezifikationsentwurf veröffentlicht und zunächst einmal gar nicht auf andere Vorschläge eingegangen. Das führte unweigerlich auch zu verbalen Auseinandersetzungen, die sicher vermeidbar gewesen wären.

<p>
Am 16. Mai hat sich zumindest Tab Atkins (Google) <a href="http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2012-May/035907.html">zu Wort gemeldet</a> und versuchte die Wogen zu glätten. Seltsamerweise hat jedoch kaum jemand auf die Argumente, die gegen diese Sourcelist-Version der WHATWG sprechen, geantwortet. Ich denke, hier wird das letzte Wort auch nicht gesprochen sein, es wird viele lange Diskussionen geben, wie es sie bereits vor knapp einem Monat zur Vendor-Prefix-Debatte gegeben hat. Nicht zuletzt hat das W3C angekündigt, die Problematik bei ihrem nächsten Treffen (wöchentlich) anszusprechen und sich ihrer anzunehmen.

<h3>Mein Zwischenfazit</h3>

<p>
Ich persönlich hoffe, dass es in Zukunft eine sinnvoll strukturierte, für jeden Entwickler anwendbare Syntax für responsive Bilder geben wird und nicht einmal mehr sich die Browserhersteller mit einer schnell umzusetzenden Lösung auf Kosten der Entwickler durchsetzen.   Das bedeutet aber auch, dass die Lösung noch ein wenig mehr Zeit einnehmen wird, bevor sie richtig eingesetzt werden kann. Doch gut Ding will bekanntlich Weile haben.<img src="http://vg09.met.vgwort.de/na/c9ba3e2f740645bc806ff522840fce95" width="1" height="1" alt="">

<div class="block gastbeitrag">
<h3>Über den Autor</h3>
<p><img src="http://cdn2.peterkroener.de/uploads/2012/anselm-hannemann-portrait.jpg" alt="Portraitfoto von Anselm Hannemann">Anselm Hannemann ist selbständiger Webentwickler, Digital Publishing-Experte und Vorkämpfer in Sachen Webstandards für Responsive Images.
<p><a href="http://anselm-hannemann.com/blog/">anselm-hannemann.com/blog/</a>
<br>
<a href="https://twitter.com/anselmhannemann">@anselmhannemann</a>
</div><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/kroener?a=qsgasIncZhQ:uorDlViTTus:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/kroener?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/kroener/~4/qsgasIncZhQ" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.peterkroener.de/die-responsive-images-story/</feedburner:origLink></item>
<item>
<title><![CDATA[Fragen zu HTML5 & Co beantwortet 5&nbsp;&ndash; Element-Auswahl, Xlink, ARIA und selektive CSS3-Selektoren]]></title>
<link>http://feedproxy.google.com/~r/kroener/~3/VZ9FHvojElQ/</link>
<description><![CDATA[<div class="artikelserie">
<p>
Dieser Artikel ist Teil einer <a href="artikel/fragen-zu-html5-beantwortet/">Serie</a>:
<ol>
<li><a href="fragen-zu-html5-beantwortet/">Fragen zu HTML5 & Co 1</a>
<li><a href="noch-mehr-fragen-zu-html5-beantwortet/">Fragen zu HTML5 & Co 2</a>
<li><a href="und-noch-mehr-fragen-zu-html5-beantwortet/">Fragen zu HTML5 & Co 3</a>
<li><a href="weitere-fragen-zu-html5-und-co-beantwortet/">Fragen zu HTML5 & Co 4</a>
<li><a href="fragen-zu-html5-und-co-beantwortet-5/">Fragen zu HTML5 & Co 5</a>
</ol>
</div>

<p>
Als Erklärbär für HTML5 und andere Webtechnologien bekomme&#8230;</p></li></li></li></li></li></p>]]></description>
<pubDate>Mo, 14 Mai 2012 10:29:00 -0600</pubDate>
<guid isPermaLink="false">http://www.peterkroener.de/fragen-zu-html5-und-co-beantwortet-5/</guid>
<dc:creator>Peter Kröner</dc:creator>
<content:encoded><![CDATA[<div class="artikelserie">
<p>
Dieser Artikel ist Teil einer <a href="artikel/fragen-zu-html5-beantwortet/">Serie</a>:
<ol>
<li><a href="fragen-zu-html5-beantwortet/">Fragen zu HTML5 &amp; Co 1</a>
<li><a href="noch-mehr-fragen-zu-html5-beantwortet/">Fragen zu HTML5 &amp; Co 2</a>
<li><a href="und-noch-mehr-fragen-zu-html5-beantwortet/">Fragen zu HTML5 &amp; Co 3</a>
<li><a href="weitere-fragen-zu-html5-und-co-beantwortet/">Fragen zu HTML5 &amp; Co 4</a>
<li><a href="fragen-zu-html5-und-co-beantwortet-5/">Fragen zu HTML5 &amp; Co 5</a>
</ol>
</div>

<p>
Als Erklärbär für HTML5 und andere Webtechnologien bekomme ich jede Woche neue Fragen rund um Webentwicklung gestellt. Da diese Fragen (und Antworten) viel zu schade sind, um sie in meinem E-Mail-Archiv verrotten zu lassen, hole ich sie im Rahmen der <a href="artikel/fragen-zu-html5-beantwortet/">Artikelserie „Fragen zu HTML5 und Co“</a> regelmäßig ans Tageslicht&nbsp;&ndash; denn dumme Fragen gibt es schließlich nicht!

<h3>Wann welches Element verwenden?</h3>
<blockquote>
<p>
Wann sollte man <code>&lt;mark&gt;</code> verwenden und wann <code>&lt;strong&gt;</code>, <code>&lt;em&gt;</code>, <code>&lt;b&gt;</code>, und <code>&lt;i&gt;</code>?
</blockquote>
<p>
Es stimmt, dass all diese Elemente auf den ersten Blick so ziemlich das gleiche zu machen scheinen und es nicht immer ganz einfach, das richtige Element zu wählen. Anhand von Beispielen bekommt man am besten ein Gefühl dafür, was wann richtig ist und die gute Nachricht an dieser Stelle ist: es gibt in den HTML5-Spezifikationen offizielle Beispiele, <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/text-level-semantics.html#the-em-element">hier für <code>&lt;em&gt;</code></a>. Eine der großen Errungenschaften von HTML5 ist nicht zuletzt die Qualität der Spezifikationen. Während man in den offiziellen Dokumenten zu HTML 4.01 nur <a href="http://www.w3.org/TR/html4/struct/text.html#h-9.2.1">sehr spärliche Erläuterungen und Beispiele findet</a> (wenn überhaupt) sind die HTML5-Specs voll mit Beispielen, Tutorials und erklärender Prosa.
<p>
Wenn man also ein Beispiel oder eine Erklärung sucht, kann der Blick in den offiziellen Standard durchaus lohnen. Wem die offiziellen Specs mit ihrem monströsen Umfang etwas zu abschreckend erscheinen, könnte mit den Web Developer Editions von W3C und WHATWG (ja, davon gibt es <a href="http://www.w3.org/TR/html5-author/">gleich</a> <a href="http://developers.whatwg.org/">zwei</a>, eine von jeder Arbeitsgruppe) glücklich werden.
<p>
Um aber die eigentliche Frage zu beantworten:
<ul>
<li><code>&lt;strong&gt;</code>: Wichtige Textpassagen, deren Wichtigkeit die Bedeutung des betroffenen Satzes nicht verändert.
<li><code>&lt;em&gt;</code>: Betonte Textpassagen, deren Betonung die Bedeutung des betroffenen Satzes verändert.
<li><code>&lt;b&gt;</code> und <code>&lt;i&gt;</code>: Textpassagen, die vom Rest abgesetzt, aber nicht auf- oder abgewertet werden sollen. Beispiele wären Produktnamen in einem Review oder Wörter aus anderen Sprachen. Dabei sollte man <code>&lt;b&gt;</code> verwenden, wenn die typografische Repräsentation der betroffenen Passage üblicherweise fetter Text wäre und <code>&lt;i&gt;</code>, wenn es kursiver Text wäre.
<li><code>&lt;mark&gt;</code>: Hervorhebung von Textpassagen, die in einem nicht aus ihrem Ursprungskontext heraus eine Hervorhebung verdient hätten, sondern die nur aufgrund eines speziellen Umstandes relevant sind&nbsp;&ndash; z.B. weil sie ein Keyword sind, nach dem der Nutzer gesucht hat.
</ul>



<h3>XLink und XHTML5</h3>
<blockquote>
<p>
Für XML-basierte Sprachen wie z.B. SVG gibt es doch die Sprache <a href="http://www.w3.org/TR/xlink11/">XLink</a>. Wäre es rein theoretisch auch möglich, sie in XHTML5 einzubinden?
</blockquote>
<p>
XLink kann man theoretisch schon in XHTML verwenden. Es ist schließlich alles nichts weiter als XML und die (X)HTML5-Spezifikationen <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/namespaces.html#namespaces">erlauben</a> die Verwendung des XLink-Namespaces auch ausdrücklich. Das Problem ist nur, dass es meiner Recherche nach so gut wie gar keine Browserunterstützung gibt. Einzig der Firefox scheint <a href="https://developer.mozilla.org/en/XLink">Teile</a> von XLink für SVG- und MathML-Dokumente zu implementieren.



<h3>&lt;nav&gt; und ARIA</h3>
<blockquote>
<p>
Macht es Sinn, das <code>&lt;nav&gt;</code>-Element und <a href="http://www.w3.org/TR/wai-aria/">WAI-ARIA</a> in Kombination zu verwenden, also z.B. als <code>&lt;nav role="navigation"&gt;</code>? Oder ist das doppelt gemoppelt? Das <code>&lt;nav&gt;</code> macht doch eigentlich schon deutlich, dass es sich um eine Navigation handelt&nbsp;&hellip;
</blockquote>
<p>
Das ist in der Tat zumindest laut Standard doppelt gemoppelt, denn diese ARIA-Role wird Nav-Elementen <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/elements.html#wai-aria">automatisch zugeteilt</a>. In der Realität sieht die Sache aber schwieriger aus. Wie man <a href="http://html5accessibility.com/">dieser Tabelle hier</a> entnehmen kann, haben die wenigsten Browser heutzutage diese ARIA-Mappings auch wirklich standardkonform implementiert.
<p>
Was tun? Rumprobieren und testen. Es mag zwar falsch sein, <code>&lt;nav&gt;</code> zu verwenden, aber wenn das der einzige Weg ist, die Navigation auch für Screenreader als solche auszuzueichnen (und ich weiß <em>nicht</em>, ob das der Fall ist&nbsp;&ndash; was machen Browser, die <code>&lt;nav&gt;</code> unterstützen, lesen die dann zwei mal „Navigation“ vor?), dann sollte man sich nicht aufhalten lassen. Regeln sind da, um (nach Kenntnisnahme und gründlichem Nachdenken) gebrochen zu werden.



<h3>Selektive Anwendung von CSS-Regeln auf Links</h3>
<blockquote>
<p>
Ich verwende Attributselektoren, um <a href="http://www.peterkroener.de/links-mit-target_blank-gesondert-markieren/">externe Links zu markieren</a>. Hierfür suche ich jetzt eine Erweiterung: Ich habe einen Share-Button von <a href="http://www.addthis.com/">Add this</a> integriert und in der Javascript-Box stören diese Markierungen. Wie kann der Code <code>a[target=_blank]{}</code> erweitert werden, so dass die Regel nicht für eine bestimmte Ziel-URL gilt?
</blockquote>
<p>
Hier gibt es zwei mögliche Lösungen und jeweils helfen die <a href="http://www.w3.org/TR/selectors/#attribute-substrings">Attributselektoren für Substrings</a>, die in CSS3 frisch eingeführt wurden. Zum einen kann man eine bestehende Markierung für alle Links, deren <code>href</code>-Attribut mit einer bestimmten URL beginnt, einfach zurücksetzen&nbsp;&hellip;
<pre class="prettyprint language-css">/* Externe Links markieren... */
a[target="_blank"]{
    background: yellow;
}

/* ... und die Markierung wieder zurücksetzen */
a[href^="http://www.facebook.com"]{
    background: none;
}
</pre>
<p>
&hellip; oder man greift zur <a href="http://www.w3.org/TR/selectors/#negation">Negations-Pseudoklasse</a> (<code>:not()</code>) und wendet die Markierung gar nicht erst auf Links mit der betreffenden URL an:
<pre class="prettyprint language-css">/* All-in-one-Lösung */
a[target="_blank"]:not([href^="http://twitter.com"]){
    background: yellow;
}
</pre>
<p>
Beide Lösungen führen <a href="http://dabblet.com/gist/2593328">zum gleichen Ergebnis</a>, allerdings funktioniert die <code>:not()</code>-Variante im Internet Explorer erst ab Version&nbsp;9.


<h3>Weitere Fragen?</h3>
<p>
Eure Fragen zu HTML5, JavaScript und anderen Webtechnologien beantworte ich gerne! Einfach <a href="kontakt/">eine E-Mail schreiben</a> oder <a href="http://www.formspring.me/sirpepe">Formspring bemühen</a> und ein bisschen Geduld haben&nbsp;&ndash; falls ich gerade unterwegs bin, kann es mit Antwort manchmal etwas dauern, doch früher oder später schreibe ich garantiert zurück.<img src="http://vg09.met.vgwort.de/na/c039aa1d3e1941909e1ac4cfeb743a54" width="1" height="1" alt=""><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/kroener?a=VZ9FHvojElQ:euka480Swh8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/kroener?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/kroener/~4/VZ9FHvojElQ" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.peterkroener.de/fragen-zu-html5-und-co-beantwortet-5/</feedburner:origLink></item>
<item>
<title><![CDATA[Trendfarbe Moppelkotze: Trip Report Ubuntu 12.04]]></title>
<link>http://feedproxy.google.com/~r/kroener/~3/p6S2LWiRAAA/</link>
<description><![CDATA[<p>
Das allhalbjährliche Update von Ubuntu ist bei mir sehr glatt gelaufen – alles fluppt und vieles ist sogar sehr viel besser als vorher. Die Performance der gesamten Oberfläche ist bei mir absolut durchs Dach gegangen und das Ganze fühlt sich an, wie eine frische Neuinstallation. Viel Neues gibt es nicht, wobei ich mir durchaus vorstellen könnte, mich an <a href="http://www.youtube.com/watch?v=w_WW-DHqR3c">das HUD</a> zu gewöhnen, wenn es schaffe, irgendwie dessen Existenz persistent in meinem Kopf zu verankern. Nur an ganz wenigen Ecken knirscht(e) das System beziehungsweise es ließ meine&#8230;</p>]]></description>
<pubDate>Mo, 30 Apr 2012 10:39:47 -0600</pubDate>
<guid isPermaLink="false">http://www.peterkroener.de/trip-report-ubuntu-12.04/</guid>
<dc:creator>Peter Kröner</dc:creator>
<content:encoded><![CDATA[<p>
Das allhalbjährliche Update von Ubuntu ist bei mir sehr glatt gelaufen&nbsp;&ndash; alles fluppt und vieles ist sogar sehr viel besser als vorher. Die Performance der gesamten Oberfläche ist bei mir absolut durchs Dach gegangen und das Ganze fühlt sich an, wie eine frische Neuinstallation. Viel Neues gibt es nicht, wobei ich mir durchaus vorstellen könnte, mich an <a href="http://www.youtube.com/watch?v=w_WW-DHqR3c">das HUD</a> zu gewöhnen, wenn es schaffe, irgendwie dessen Existenz persistent in meinem Kopf zu verankern. Nur an ganz wenigen Ecken knirscht(e) das System beziehungsweise es ließ meine Zähne knirschen.
<p>
Mein größtes Problem war der Unity-Launcher, den ich aus alter Gewohnheit im Autohide-Modus betreibe. Bei Multi-Monitor-Setups wird, selbst wenn auf einem Monitor <em>kein</em> Launcher ist, die Maus an der entsprechenden Bildkante eingefangen. Resultat: man kann nicht mehr ohne weiteres die Maus von einem Monitor auf den nächsten schieben, da sie unterhalb einer gewissen Bewegungsgeschwindigkeit am Rand hängen bleibt. Sehr ekelhaft, aber auch leicht zu reparieren: den <a href="http://wiki.ubuntuusers.de/Compiz_CCSM">CompizConfig Configuration Manager</a> installieren (<code>sudo apt-get install compizconfig-settings-manager</code>) und im Unity-Plugin unter „Experimental“ folgende Einstellungen vornehmen:
<ul>
<li>Launcher Reveal Pressure: 1
<li>Launcher Reveal Edge Responsiveness: 8
<li>Launcher Capture Mouse: deaktivieren
</ul>
<p>
Mit diesen Einstellungen verhält sich der Launcher bei Multi-Monitor-Setups wieder genau wie vor den Update.
<p>
Was ich noch nicht gelöst habe, ist die Hintergrundfarbe vom Dash und vor allem von den Notifications. In 12.04 wird diese ja automatisch aus dem Wallpaper errechnet, was bei mir leider im Farbton „Moppelkotze“ resultiert:
<figure>
<img width="640" height="450" src="http://cdn2.peterkroener.de/uploads/2012/senf.jpg" alt="Ungünstig gefärbte Notification Bubbles in Ubuntu 12.04">
</figure>
<p>
Die diversen Konfigurations-Tools, die vorgeben dies ändern zu können (Ubuntu Tweak, Unity-Plugin im CCSM) scheinen alle keinen Effekt zu haben. Weiß jemand von euch vielleicht wie oder ob man das hinkriegt? Denn bis auf diesen Schönheitsfehler finde ich nicht viel zu meckern: alles läuft und das nach nur minimalem Gefrickel sogar besser als vorher. Gefällt mir!<img src="http://vg09.met.vgwort.de/na/6ae1e0f29fbd488eb70eda69fc61db5d" width="1" height="1" alt=""><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/kroener?a=p6S2LWiRAAA:S1C8Cdkv40I:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/kroener?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/kroener/~4/p6S2LWiRAAA" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.peterkroener.de/trip-report-ubuntu-12.04/</feedburner:origLink></item>
<item>
<title><![CDATA[Weitere Fragen zu HTML5 und Co beantwortet]]></title>
<link>http://feedproxy.google.com/~r/kroener/~3/4brb2j0rwqo/</link>
<description><![CDATA[<div class="artikelserie">
<p>
Dieser Artikel ist Teil einer <a href="artikel/fragen-zu-html5-beantwortet/">Serie</a>:
<ol>
<li><a href="fragen-zu-html5-beantwortet/">Fragen zu HTML5 & Co 1</a>
<li><a href="noch-mehr-fragen-zu-html5-beantwortet/">Fragen zu HTML5 & Co 2</a>
<li><a href="und-noch-mehr-fragen-zu-html5-beantwortet/">Fragen zu HTML5 & Co 3</a>
<li><a href="weitere-fragen-zu-html5-und-co-beantwortet/">Fragen zu HTML5 & Co 4</a>
<li><a href="fragen-zu-html5-und-co-beantwortet-5/">Fragen zu HTML5 & Co 5</a>
</ol>
</div>

<p>
In den letzten Wochen und Monaten habe ich wie gewohnt via E-Mail,&#8230;</p></li></li></li></li></li></p>]]></description>
<pubDate>Mo, 16 Apr 2012 11:27:00 -0600</pubDate>
<guid isPermaLink="false">http://www.peterkroener.de/weitere-fragen-zu-html5-und-co-beantwortet/</guid>
<dc:creator>Peter Kröner</dc:creator>
<content:encoded><![CDATA[<div class="artikelserie">
<p>
Dieser Artikel ist Teil einer <a href="artikel/fragen-zu-html5-beantwortet/">Serie</a>:
<ol>
<li><a href="fragen-zu-html5-beantwortet/">Fragen zu HTML5 &amp; Co 1</a>
<li><a href="noch-mehr-fragen-zu-html5-beantwortet/">Fragen zu HTML5 &amp; Co 2</a>
<li><a href="und-noch-mehr-fragen-zu-html5-beantwortet/">Fragen zu HTML5 &amp; Co 3</a>
<li><a href="weitere-fragen-zu-html5-und-co-beantwortet/">Fragen zu HTML5 &amp; Co 4</a>
<li><a href="fragen-zu-html5-und-co-beantwortet-5/">Fragen zu HTML5 &amp; Co 5</a>
</ol>
</div>

<p>
In den letzten Wochen und Monaten habe ich wie gewohnt via E-Mail, Twitter, Formspring und andere Kanäle Fragen zu HTML5 gestellt bekommen und beantwortet. Da wie immer gilt, dass es keine dummen Fragen, aber sehr viel öffentliches Interesse gibt, präsentiere ich hiermit einen weitereren Teil <a href="artikel/fragen-zu-html5-beantwortet/">der allseits beliebten Serie „Fragen zu HTML5 und Co“</a> mit den neuesten Fragen und Antworten rund um unser liebstes Hype-Thema und den diversen dazugehörigen Webtechnologien.

<h3>Section-Elemente in Header-Elementen?</h3>
<blockquote>
<p>
Ein Section-Element kann ja ein Header- oder ein Footer-Element beinhalten. Geht es aber auch anders herum? Im konkreten Fall geht es um ein Header-Element mit einem Warenkorb- und Kundenbewertungsbereich. Wäre es semantisch korrekt dafür ein Section-Element zu verwenden?
</blockquote>
<p>
Erlaubt es eine solche Konstruktion auf jeden Fall&nbsp;&ndash; ob sie auch <em>semantisch</em> korrekt ist, hängt vom betroffenen Inhalt ab, aber ich denke im genannten Fall passt es. Generell gilt: Header- und Footer-Elemente dürfen jedweden <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/elements.html#flow-content">Flow-Content</a> enthalten, der selbst kein Header- oder Footer-Element ist. Flow-Content umfasst dabei so ziemlich alles, was es für Content bestimmten HTML-Elementen so gibt.

<h3>Wie baut man große JavaScript-Apps?</h3>
<blockquote>
<p>
Da ich viel mit Actionscript gearbeitet habe, habe ich immer noch nicht den Sprung zu JS gewagt, da ich immer noch das Gefühl habe, das JS mehr dieses Prototyping-Dingsda macht statt mit Klassen zu arbeiten. In AS und PHP zB. habe ich meine Klasse mit Constructor und den Methoden und Eigenschaften und kann das ganze schön in eine Datei packen und KlasseA nennen.
<p>
Wie sieht denn ein allgemeiner Workflow in JS aus? Ich sehe immer nur irgendwelche Codschnipsel, aber ich habe noch nicht wirklich begriffen, wie man komplexere Programme in JS wirklich umsetzen kann (z.B. nach MVC), also dass man die einzelnen Funktions- und Logikeinheiten sinnvoll organisiert.
</blockquote>
<p>
Das „Prototyping-Dingsda“ in JS (prototypische Vererbung) ist eigentlich simpler und mächtiger als Veerbung via Klassen. Objekte erben direkt von anderen Objekten und die Zwischenkonstruktion „Klasse“ fällt einfach weg. Und das beste: Klassensysteme kann man via Prototypen implementieren. Wenn du also unbedingt möchtest, kannst du problemlos Klassen in JavaScript bekommen. Links:
<ul>
<li><a href="http://ejohn.org/blog/simple-javascript-inheritance/">http://ejohn.org/blog/simple-javascript-inheritance/</a>
<li><a href="http://dustindiaz.com/klass">http://dustindiaz.com/klass</a>
<li><a href="http://mootools.net/docs/core/Class/Class">http://mootools.net/docs/core/Class/Class</a>
<li><a href="http://code.google.com/p/base2/">http://code.google.com/p/base2/</a>
</ul>
<p>
Was App-Struktur angeht, kommt es drauf an, was du genau in JS machen möchtest. Serverseitige Umgebungen wie Node bieten z.B. ein
Modulsystem. Ansonsten gibt es auch für den Browser viele fertige Lösungen aus der Dose. <a href="http://net.tutsplus.com/tutorials/javascript-ajax/next-generation-javascript-with-amd-and-requirejs-new-on-premium/">Diesen Artikel über RequireJS in Zusammenarbeit mit AMD (asynchronous module definition)</a> würde ich mal exemplarisch durchlesen. Was MVCeske Konstruktionen angeht, gibt es auch mehrere Lösungen. Unter anderem diese hier sind empfehlenswert:
<ul>
<li><a href="http://documentcloud.github.com/backbone/">Backbone</a>
<li><a href="http://knockoutjs.com/">Knockout.js</a>
<li><a href="http://javascriptmvc.com/">JavaScript MVC</a>
</ul>
<p>
Für große Apps allgemein würde ich mir mal <a href="http://addyosmani.com/scalable-javascript-videos/">diese drei kurzen Talks</a> reinziehen, die alle Themen rund um große JavaScript-Apps streifen.

<h3>Webcam-Chat mit HTML5?</h3>
<blockquote>
<p>
Ich suche eine Möglichkeit, mit HTML5 Webcam-Chats zwischen bis zu vier Personen zu verwirklichen. Ich habe dabei die jQuery Webcam-API entdeckt, aber es erscheint mir, als ob es hier lediglich um die Möglichkeit geht die Webcam anzusprechen und es nicht möglich ist das Bild auch irgendwie an andere zu übertragen. Ist es nicht möglich, Webcam-Daten zu kopieren und vor allem an andere übertragen?
</blockquote>
<p>
Was Webcam-Chats angeht, habe ich eine gute Nachricht und eine schlechte Nachricht. Die Gute ist, dass Webcam-Chat (inklusive Sound, d.h. Skype-klonen) tatsächlich bei den klugen Köpfen rund um HTML5 eine Rolle spielt. Es wird aktiv daran gearbeitet und das Ganze läuft unter dem Titel <a href="http://www.webrtc.org/">WebRTC</a>. Die schlechte Nachricht ist, dass WebRTC noch eine in einer sehr frühen Phase steckt und noch nicht ernsthaft benutzbar ist&nbsp;&ndash; außer in Chrome-Nightlies läuft die API noch nirgendwo und ich möchte wetten, dass die ganze Technologie noch einige größere Änderungen vor sich hat. Da hilft, fürchte ich, erst mal nur Geduld.


<h3>Warum kein new Array() in JavaScript?</h3>
<blockquote>
<p>
<a href="http://www.peterkroener.de/stoyan-stefanov-javascript-patterns-review/">In diesem Artikel</a> und dem besprochenen Buch heißt es <q>Finger weg von new Array()</q>. Wieso?
</blockquote>
<p>
Neue Arrays macht man in JavaScript am einfachsten (weil am kürzesten) mit dem Literal <code class="prettyprint language-javascript">[]</code>. Es gibt keinen Grund, sich mit <code class="prettyprint language-javascript">new Array()</code> einen Wolf zu tippen, denn das bringt gegenüber <code class="prettyprint language-javascript">[]</code> keine Vorteile. Im Gegenteil: <code class="prettyprint language-javascript">new Array()</code> macht, je nachdem wie viele Argumente man ihm mitgibt, sehr unterschiedliche und teils verwirrende Dinge:
<pre class="prettyprint language-javascript">
var a = new Array(3);     // Leeres Array mit length = 3
var b = new Array(3, 14); // Array [3, 14]
var c = new Array(3.14);  // RangeError: Invalid array length</pre>
<p>
All den Stress hat man mit <code class="prettyprint language-javascript">[]</code> nicht&nbsp;&ndash; da kommt einfach ein Array mit genau den Elementen heraus, die man hineingesteckt hat.

<h3>Weitere Fragen?</h3>
<p>
Eure Fragen zu HTML5, JavaScript und anderen Webtechnologien beantworte ich gerne! Einfach <a href="kontakt/">eine E-Mail schreiben</a> oder <a href="http://www.formspring.me/sirpepe">Formspring bemühen</a> und ein bisschen Geduld haben&nbsp;&ndash; falls ich gerade unterwegs bin, kann es mit Antwort manchmal etwas dauern, doch früher oder später schreibe ich garantiert zurück.<img src="http://vg09.met.vgwort.de/na/4cbbbb3194fa43c5a52f44967449f346" width="1" height="1" alt=""><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/kroener?a=4brb2j0rwqo:YQJD-5PGcj4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/kroener?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/kroener/~4/4brb2j0rwqo" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.peterkroener.de/weitere-fragen-zu-html5-und-co-beantwortet/</feedburner:origLink></item>
<item>
<title><![CDATA[Die Karte des HTML5-Universums]]></title>
<link>http://feedproxy.google.com/~r/kroener/~3/5G59xO9GV4U/</link>
<description><![CDATA[<p>
Ich habe glaube ich noch keinen einzigen Talk über HTML5 gehalten, in dem ich nicht auf diese Karte des HTML5-Universums zurückgegriffen habe:

<figure>
<a class="imagelink" href="http://cdn2.peterkroener.de/uploads/2012/graph_w.png"><img width="640" height="520" src="http://cdn2.peterkroener.de/uploads/2012/graph_w-klein.png" alt="Die Karte des HTML5-Universums"></a>
</figure>

<p>
Man kann unter Zuhilfenahme dieses Bildchens sehr anschaulich und vor allem zeiteffektiv ein paar wichtige Dinge über HTML5 erklären. Zum Beispiel sieht man sehr schön

<ul>
<li>das Verhältnis der beiden&#8230;</li></ul></p></img></p>]]></description>
<pubDate>Di, 10 Apr 2012 12:11:00 -0600</pubDate>
<guid isPermaLink="false">http://www.peterkroener.de/die-karte-des-html5-universums/</guid>
<dc:creator>Peter Kröner</dc:creator>
<content:encoded><![CDATA[<p>
Ich habe glaube ich noch keinen einzigen Talk über HTML5 gehalten, in dem ich nicht auf diese Karte des HTML5-Universums zurückgegriffen habe:

<figure>
<a class="imagelink" href="http://cdn2.peterkroener.de/uploads/2012/graph_w.png"><img width="640" height="520" src="http://cdn2.peterkroener.de/uploads/2012/graph_w-klein.png" alt="Die Karte des HTML5-Universums"></a>
</figure>

<p>
Man kann unter Zuhilfenahme dieses Bildchens sehr anschaulich und vor allem zeiteffektiv ein paar wichtige Dinge über HTML5 erklären. Zum Beispiel sieht man sehr schön

<ul>
<li>das Verhältnis der beiden HTML5-Spezifikationen nebst den jeweiligen Web Developer Editions zueinander sowie zum Alltagsbegriff „HTML5“ (alles Teilmengen voneinander),
<li>dass neben W3C (blaue Kreise) und WHATWG (grün) noch viele weitere Parteien das Web aufmischen (orange) und dass HTML5 nicht alles ist, was das Web Neues zu bieten hat,
<li>den schieren Umfang des ganzen neuen Zeugs (jeder Kreis repräsentiert ein eigenes, unter Umständen sehr umfangreiches Spezifikationsdokument),
<li>dass es richtig komplizierte Sonderfälle in diesem ganzen Web-Zirkus gibt (die eingestellte Web SQL Database, die aus einer API und einem Protokoll bestehenden Web Sockets),
<li>und dass jQuery und Node.js wirklich nichts mit HTML5 zu tun haben und das auch bei CSS3 eine eher problematische Einordnung ist.
</ul>

<p>
Da ich mindestens zwei mal pro Monat eine E-Mail bekomme, in der gefragt wird, wo man denn diese Grafik herkriegen kann und ob man sie in Slides/Büchern/Abschlussarbeiten verwenden darf, steht das gute Stück ab jetzt offiziell unter einer <a href="http://creativecommons.org/licenses/by/3.0/de/">Creative Commons Namensnennung 3.0 Deutschland Lizenz</a> und hat ein <a href="https://github.com/SirPepe/SpecGraph">ein Github-Repository</a> für Bugreports und Weiterentwicklung. Es gibt (mit Inkscape gebaute) SVGs sowie PNGs und jeweils eine Variante mit weißem und eine mit schwarzem Hintergrund. Macht damit was ihr wollt!<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/kroener?a=5G59xO9GV4U:7HHZtvceyyw:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/kroener?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/kroener/~4/5G59xO9GV4U" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.peterkroener.de/die-karte-des-html5-universums/</feedburner:origLink></item>
<item>
<title><![CDATA[Termine für April und Mai 2012]]></title>
<link>http://feedproxy.google.com/~r/kroener/~3/N0WNgdRMID8/</link>
<description><![CDATA[<p>
Im April und Mai 2012 gibt es für interessierte Webtechnologie-Padawane nur zwei (öffentliche) Möglichkeiten, sich vom Webtechnologie-Erklärbären mit frischem Wissen rund um die neueste Neuheiten in den Browsern dieser Welt ausrüsten zu lassen. Allerdings sind die beiden Termine ganz gut kombinierbar, da sie direkt nacheinander am gleichen Ort stattfinden:

<ul>

<li><strong>7. - 9. Mai 2012 in München</strong>: <a href="http://www.opensourceschool.de/kurse/muenchen/schulung/html5/">HTML5-Schulung bei der Open Source School.</a> Mein drei­tä­gi­ges HTML5-Standardprogramm stattet die Teilnehmer&#8230;</li></ul></p>]]></description>
<pubDate>Mi, 04 Apr 2012 13:18:50 -0600</pubDate>
<guid isPermaLink="false">http://www.peterkroener.de/termine-fuer-april-und-mai-2012/</guid>
<dc:creator>Peter Kröner</dc:creator>
<content:encoded><![CDATA[<p>
Im April und Mai 2012 gibt es für interessierte Webtechnologie-Padawane nur zwei (öffentliche) Möglichkeiten, sich vom Webtechnologie-Erklärbären mit frischem Wissen rund um die neueste Neuheiten in den Browsern dieser Welt ausrüsten zu lassen. Allerdings sind die beiden Termine ganz gut kombinierbar, da sie direkt nacheinander am gleichen Ort stattfinden:

<ul>

<li><strong>7. - 9. Mai 2012 in München</strong>: <a href="http://www.opensourceschool.de/kurse/muenchen/schulung/html5/">HTML5-Schulung bei der Open Source School.</a> Mein 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-Frameworks. Die Themen sind im Einzelnen:
<ul>
<li>Hintergründe und Entstehungsgeschichte
<li>Geolocation und Gerätesensorik
<li>HTML5-Schnelleinstieg
<li>Semantisches HTML5
<li>HTML5-Formulare
<li>Offline-Webanwendungen
<li>Multimedia im Browser
<li>Web Workers
<li>Die File-API
<li>Polyfills
<li>Das Canvas-Element
</ul>
Geboten wird ein großer Praxisanteil, kleine Arbeitsgruppen und ein Buch gibt es obendrein. 

<li><strong>10. -11. Mai 2012 in München</strong>: <a href="http://www.opensourceschool.de/kurse/muenchen/schulung/css3/">CSS3-Schulung bei der Open Source School.</a> Mein zweitä­gi­ges CSS3-Standardprogramm katapultiert die Teilnehmer in das CSS3-Zeitalter, in dem Webfonts und Farbverläufe fließen. Das gesamte Programm:
<ul>
<li>Hintergründe und Entstehungsgeschichte
<li>CSS3-Selektoren
<li>Farben und Farbverläufe
<li>Boxen und Rahmen
<li>CSS3-Layout
<li>Transformationen
<li>Transitionen und Animationen
<li>Schrifteinbettung und -gestaltung
<li>Media-Queries
</ul>
Ein großer Praxisanteil, kleine Arbeitsgruppen und ein Buch als Bonus gibt es auch hier. 

</ul><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/kroener?a=N0WNgdRMID8:vg8KL68bZZw:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/kroener?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/kroener/~4/N0WNgdRMID8" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.peterkroener.de/termine-fuer-april-und-mai-2012/</feedburner:origLink></item>
<item>
<title><![CDATA[ECMAScript 6: Block Scope und Konstanten]]></title>
<link>http://feedproxy.google.com/~r/kroener/~3/H_UML1wvqd4/</link>
<description><![CDATA[<div class="artikelserie">
<p>
Dieser Artikel ist Teil einer <a href="arikel/ecmascript-6/">Serie</a>:
<ol>
<li><a href="ecmascript-harmony-die-naechste-ausbaustufe-von-javascript/">ES6 im Überblick</a>
<li><a href="ecmascript-6-block-scope-und-konstanten/">Block Scope und Konstanten</a>
</ol>
</div>

<p>
Anders als im ECMAScript 5 rüstet ES6 nicht nur hier und da ein paar Funktionen nach, sondern bietet für viele Neuerungen neue Syntax und Konzepte, wobei einschränkend gesagt werden muss, dass viele der „Neuheiten“ so neu gar nicht sind. Das Meiste ist irgendwo geklaut: aus proprietären Browser-Erweiterungen,&#8230;</p></li></li></p>]]></description>
<pubDate>Mo, 02 Apr 2012 10:57:00 -0600</pubDate>
<guid isPermaLink="false">http://www.peterkroener.de/ecmascript-6-block-scope-und-konstanten/</guid>
<dc:creator>Peter Kröner</dc:creator>
<content:encoded><![CDATA[<div class="artikelserie">
<p>
Dieser Artikel ist Teil einer <a href="arikel/ecmascript-6/">Serie</a>:
<ol>
<li><a href="ecmascript-harmony-die-naechste-ausbaustufe-von-javascript/">ES6 im Überblick</a>
<li><a href="ecmascript-6-block-scope-und-konstanten/">Block Scope und Konstanten</a>
</ol>
</div>

<p>
Anders als im ECMAScript&nbsp;5 rüstet ES6 nicht nur hier und da ein paar Funktionen nach, sondern bietet für viele Neuerungen neue Syntax und Konzepte, wobei einschränkend gesagt werden muss, dass viele der „Neuheiten“ so neu gar nicht sind. Das Meiste ist irgendwo geklaut: aus proprietären Browser-Erweiterungen, aus CoffeeScript, anderen Programmiersprachen oder gar aus dem gescheiterten ES4-Standard. In diese Kategorie der nicht ganz so neuen Neuheiten fallen auch die neuen blockgebundenen Variablen (<code class="prettyprint language-javascript">let</code>) und Konstanten (<code class="prettyprint language-javascript">const</code>), um die es in diesem Artikel geht. Die neuen Features funktionieren zur Zeit in allem, was auf neuere V8-Engines aufsetzt, also Chrome und Node, wobei es nicht mehr lange dauern dürfte, bis auch andere JS-Implementierungen nachrüsten. Wenn es endlich so weit ist, haben die JavaScript-Programmierer dieser Welt zwei Probleme mit Variablen weniger.

<h3>Zwei Probleme mit Variablen</h3>

<p>
Problem Nummer 1 ist, dass in ECMAScript&nbsp;5 und älter der Geltungsbereich von Variablen die <em>Funktion</em> ist, in der sie deklariert wurden. Wenn man den folgenden Schnipsel ausführt&nbsp;&hellip;

<pre><code class="prettyprint language-javascript">function foobar(foo){
    if(foo){
        var bar = 42;
    }
};</code></pre>

<p>
&hellip; wird der Code interprtiert, als hätte man das folgende geschrieben:

<pre><code class="prettyprint language-javascript">function foobar(foo){
    var bar;
    if(foo){
        bar = 42;
    }
};</code></pre>

<p>
Dieses Verhalten bringt es mit sich, dass man, wenn man Variablen innerhalb von Blöcken deklariert, damit auch die Umwelt außerhalb der Blöcke verunreinigt:

<pre><code class="prettyprint language-javascript">function foobar(foo){
    if(foo){
        var bar = 42;
    }
    // "bar" ist hier auch noch 42
};</code></pre>

<p>
Das mag zwar in vielen Fällen wie dem obrigen nicht groß stören, in anderen hingegen schon:

<pre><code class="prettyprint language-javascript">var bar = { 'hallo': 1337 };

function foobar(foo){
    if(bar[foo]){
        return bar[foo];
    }
    else {
        var bar = 42 * 666;
        return bar;
    }
};

var x = foobar('hallo'); // Na, wer weiß was hier passiert?</code></pre>

<p>
Selbst wenn dieses Verhalten nicht oft zu Problemen führt, so ist es doch weder ist es sonderlich intuitiv, noch wird es wirklich <em>gebraucht</em>. Im Gegenzug ist es recht mühsam, in ECMAScript&nbsp;5 und älter Variablen auf Blöcke zu beschränken, denn außer sofort ausgeführten Funktionen hilft hier nichts:

<pre><code class="prettyprint language-javascript">function foobar(foo){
    whatever();
    if(foo){
        (function(){
            var bar = 42;
        })();
    }
    // "bar" ist hier undefined
};</code></pre>

<p>
Das funktioniert zwar, ist aber der Code-Eleganz nicht besonders zuträglich und für alle mit eher mittlguten JavaScript-Kenntnissen unnötig verwirrend. 

<p>
Das zweite Problem ist, dass es in ECMAScript&nbsp;5 und älter eben nur Variablen und keine Konstanten gibt. Es existieren zwar Konventionen, gemäß derer man Variablen durch Allcaps-Namen als „Konstanten“ kennzeichnet, doch das allein hält im Zweifelsfall niemanden davon ab, die „Konstante“ zu überschreiben:

<pre><code class="prettyprint language-javascript">var KONSTANTE = 42;

KONSTANTE = 1337; // Funktioniert!</code></pre>

<p>
Die einzige in ES5 denkbare Lösung besteht darin, mittels <a href="http://www.peterkroener.de/ecmascript-5-die-nachste-version-von-javascript-teil-3-property-descriptors-getters-und-setters/">Property Descriptor</a> die gewünschte Konstante als nicht-überschreibbare Eigenschaft auf einem Objekt anzulegen:

<pre><code class="prettyprint language-javascript">Object.defineProperty(window, 'KONSTANTE', {
    writable: false,
    enumerable: true,
    configurable: false,
    value: 42
});

KONSTANTE = 1337; // TypeError: Cannot assign to read only property 'KONSTANTE'</code></pre>

<p>
Auch hier gilt: das funktioniert zwar, aber als ersthafte Lösung kann man dieses Konvolut wohl niemandem verkaufen. ECMAScript&nbsp;6 schafft nun die Probleme rund um Konstranten und <code>var</code> aus der Welt, indem mit <code>let</code> und <code>const</code> zwei Alternativ-Formen von Variablen eingeführt werden.

<h3>Lösung 1: <code>let</code> statt <code>var</code></h3>

<p>
Verwendet man zur Deklaration einer neuen Variable das Schlüsselwort <code>let</code> statt <code>var</code>, so erhält man eine an den <em>Block</em> gebundene Variable, die jenseits ihrer Schleife oder Kontrollstruktur nicht sichtbar ist. Damit bleiben zum Beispiel die Zähler einer For-Schleife ausschließlich innerhalb der Schleife gültig:

<pre><code class="prettyprint language-javascript">for(let i = 0; i < 4; i++){
}
console.log(i); // ReferenceError: i is not defined</code></pre>

<p>
Hierfür braucht es nicht zwingend echte Kontrollstrukturen oder Schleifen, auch bei leeren Blöcken funktioniert <code>let</code>:

<pre><code class="prettyprint language-javascript">{
    let i = 42;
}
console.log(i); // ReferenceError: i is not defined</code></pre>

<p>
Aus der Blockbindung folgt, dass <code>let</code>-Deklarationen nur in einem Block, in Funktionscode oder auf Programmebene vorkommen dürfen:

<pre><code class="prettyprint language-javascript">if(true) var i = 42;    // Klappt
if(true) let i = 42;    // SyntaxError: Illegal let declaration in unprotected statement context
if(true){ let i = 42; } // Klappt</code></pre>

<p>
Ansonsten verhält sich <code>let</code> ziemlich genau wie <code>var</code> und unterliegt auch den gleichen Einschränkungen&nbsp;&ndash; auch <code class="language-javascript prettyprint">let window = 42</code> kann in einem Browser das Window-Objekt nicht überschreiben. Insgesamt ist <code>let</code> also nichts weiter als ein repariertes <code>var</code>, dass im JavaScript-Code der Zukunft ersteres in den meisten Fällen anstelle von <code>var</code> ersetzt werden dürfte.

<h3>Lösung 2: <code>const</code> statt <code>var</code></h3>
<p>
Mit <code>const</code> lassen sich echte Konstanten anlegen, die auch wirklich nicht überschrieben werden können:

<pre><code class="prettyprint language-javascript">const KONSTANTE = 42;
KONSTANTE = 1337; // TypeError: Cannot assign to read only property 'KONSTANTE'</code></pre>

<p>
Genau wie <code>let</code>-Variablen sind auch <code>const</code>-Konstanten an ihren Block gebunden:

<pre><code class="prettyprint language-javascript">if(true){
    const KONSTANTE = 42;
}
console.log(KONSTANTE); // ReferenceError: KONSTANTE is not defined</code></pre>

<p>
Anders als Variablen (egal ob <code>let</code> oder <code>var</code>) müssen Konstanzen logischerweise auch immer mit einem Wert initialisiert werden:

<pre><code class="prettyprint language-javascript">var foo;   // Kein Problem
let bar;   // Kein Problem
const BAZ; // SyntaxError: Unexpected token ;</code></pre>

<p>
Auch wenn JavaScript nun echte Konstanten kennt, ist es sinnvoll, auch bei deren Verwendung weiterhin den Bezeichner komplett groß zu schreiben&nbsp;&ndash; so ist immer klar, wann man es mit einer Variablen oder einer Konstanten zu tun hat.

<h3>Der Status</h3>

<p>
Über <code>let</code> und <code>const</code> besteht in der ES6-Arbeitsgruppe weitgehend Konsens und die noch offenen Fragen (nachzulesen auf den <a href="http://wiki.ecmascript.org/doku.php?id=harmony:let">entsprechenden</a> <a href="http://wiki.ecmascript.org/doku.php?id=harmony:const">Wiki-Seiten</a>) betreffen allesamt Sonderfälle. Aufhalten lassen werden sich diese Features nicht mehr. Und so zeigt die <a href="http://kangax.github.com/es5-compat-table/es6/">allmächtige Kompatibilitätstabelle</a> schon recht viel grün, doch echte Unterstützung für <code>let</code> und <code>const</code> findet sich zur Zeit nur in den V8-Engines von Chrome ab Version 18 und Node.js. Ab Firefox Version 2.0 sowie einigen anderen Browsern existieren auch Implementierungen von <code>let</code> und <code>const</code>, die jedoch <em>nicht</em> mit dem ES6-Standard kompatibel sind und die man daher weiträumig umfahren sollte.<img src="http://vg09.met.vgwort.de/na/d4e9898c335e43d7bc00368fcdbf8613" width="1" height="1" alt=""><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/kroener?a=H_UML1wvqd4:l-mz-Og4qcg:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/kroener?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/kroener/~4/H_UML1wvqd4" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.peterkroener.de/ecmascript-6-block-scope-und-konstanten/</feedburner:origLink></item>
<item>
<title><![CDATA[Und noch mehr Fragen zu HTML5 beantwortet]]></title>
<link>http://feedproxy.google.com/~r/kroener/~3/1bX4AbJrjWY/</link>
<description><![CDATA[<div class="artikelserie">
<p>
Dieser Artikel ist Teil einer <a href="artikel/fragen-zu-html5-beantwortet/">Serie</a>:
<ol>
<li><a href="fragen-zu-html5-beantwortet/">Fragen zu HTML5 & Co 1</a>
<li><a href="noch-mehr-fragen-zu-html5-beantwortet/">Fragen zu HTML5 & Co 2</a>
<li><a href="und-noch-mehr-fragen-zu-html5-beantwortet/">Fragen zu HTML5 & Co 3</a>
<li><a href="weitere-fragen-zu-html5-und-co-beantwortet/">Fragen zu HTML5 & Co 4</a>
<li><a href="fragen-zu-html5-und-co-beantwortet-5/">Fragen zu HTML5 & Co 5</a>
</ol>
</div>

<p>
Auch wenn das Weblog den Großteil der letzen Monate stillgelegt&#8230;</p></li></li></li></li></li></p>]]></description>
<pubDate>Mo, 19 Mär 2012 15:23:14 -0600</pubDate>
<guid isPermaLink="false">http://www.peterkroener.de/und-noch-mehr-fragen-zu-html5-beantwortet/</guid>
<dc:creator>Peter Kröner</dc:creator>
<content:encoded><![CDATA[<div class="artikelserie">
<p>
Dieser Artikel ist Teil einer <a href="artikel/fragen-zu-html5-beantwortet/">Serie</a>:
<ol>
<li><a href="fragen-zu-html5-beantwortet/">Fragen zu HTML5 &amp; Co 1</a>
<li><a href="noch-mehr-fragen-zu-html5-beantwortet/">Fragen zu HTML5 &amp; Co 2</a>
<li><a href="und-noch-mehr-fragen-zu-html5-beantwortet/">Fragen zu HTML5 &amp; Co 3</a>
<li><a href="weitere-fragen-zu-html5-und-co-beantwortet/">Fragen zu HTML5 &amp; Co 4</a>
<li><a href="fragen-zu-html5-und-co-beantwortet-5/">Fragen zu HTML5 &amp; Co 5</a>
</ol>
</div>

<p>
Auch wenn das Weblog den Großteil der letzen Monate stillgelegt war, habe ich natürlich wieder per E-Mail, Twitter, Formspring und andere Kanäle so manche Frage zu HTML5 beantwortet. Diesmal war sogar eine Frage zu JavaScript dabei, um die ich mich natürlich auch gerne kümmere&nbsp;&ndash; auch in Sachen CSS, DOM und amderem Webkrempel kann man mich jederzeit löchern!
Und weil einige der zuletzt eingegangenen Fragen wieder erheblich zu schade für fortwährende Geheimhaltung waren, werden sie hiermit als ein weiterer Teil der beliebten Serie „Fragen zu HTML5“ befreit.

<h3>HTML-Validierung</h3>
<blockquote>
<p>
Nach der Umstellung des doctypes schlägt die Validierung unserer Seiten mit dem W3C-Validator an vielen Stellen fehl - einige davon konnte ich fixen, aber bei den Meta-Tags bin ich nicht ganz sicher, was ich tun soll. Beispiele:
<p>
Bad value DC.Subject for attribute name on XHTML element meta: Keyword dc.subject is not registered.<br><code class="prettyprint">&lt;meta name="DC.Subject" content="" /&gt;</code>
<p>
Bad value DC.Date for attribute name on XHTML element meta: Keyword dc.date is not registered.<br><code class="prettyprint">&lt;meta name="DC.Date" content="2011-12-19T14:15:48" /&gt;</code>
<p>
Die entsprechenden Meta-tags rauszuwerfen ist keine Option, da die SEO-Abteilung sie behalten möchte. Was tun? Sie bei der WHATWG selber definieren bzw. ändern wie in
<a href="http://wiki.whatwg.org/wiki/MetaExtensions">wiki.whatwg.org/wiki/MetaExtensions</a> beschrieben?
</blockquote>
<p>
Ich würde zu aller erst mal die Option „einfach ignorieren“ in den Raum stellen. Das, was der Validator hier bemängelt, sind allein ungültige bzw. unbekannte Attribut-Angaben, aber so lange nicht die <em>Struktur</em> des HTML kaputt ist, wird das keinerlei negative Folgen für Browser und 99,99% der anderen Endgeräte haben. Was der Browser nicht kennt, ignoriert er einfach. Und wenn die SEO-Abteilung der Meinung ist, diese Meta-Tags wären wichtig, spricht nichts dagegen, sie einfach drin zu lassen. Das macht am wenigsten Arbeit und hat trotzdem keine großen Nachteile.
<p>
Unabhängig davon ist der Validator in Sachen HTML5-Syntax auch nicht die letzte Instanz und er hinkt oft etwas hinter dem Standard her. Gerade was kleinere Features angeht (wie z.B. welche Attribute erlaubt sind oder wann man &amp;-Zeichen escapen muss und wann nicht), gibt er oft falsche Auskunft. Das einzige was also wirklich zählt, ist was im Browser funktioniert und was im Standard steht.

<h3>Infos zu Browserunterstützung</h3>
<blockquote>
<p>
Auf den WHATWG-Seiten kann ich herausfinden, welcher Tag in den aktuellen Versionen von Safari, Chrome, Firefox und IE unterstützt wird. In Ihrem Buch, z.B. auf Seite 92, 182-13, geben Sie aber die Browser-Versionen exakt an, z.B. Firefox 3.6. Wie kommen Sie zu diesen detaillierten Angaben im Vergleich zur Spezifikation? Haben Sie dies selbst ausprobiert oder steht dies auf einer Website?
</blockquote>
<p>
Ich habe das seinerzeit selbst durchgetestet und aus diversen Quellen zusammengetragen. Mittlerweile gibt es mit <a href="http://caniuse.com/">caniuse.com</a> aber eine hervorragende
Webseite, die detaillierte Kompatibilitätstabellen zu allem Möglichen sammelt&nbsp;&ndash; HTML5, CSS3 und vielem mehr.

<h3>Zahlen parsen mit JavaScript</h3>
<blockquote>
<p>
Kannst du mit sagen wieso <code>parseInt('08')</code> 0 ist und <code>parseInt('02')</code> 2?
</blockquote>
<p>
Das ist einer der vielen „Bad Parts“ in JavaScript. Die Funktion <code>parseInt()</code> macht zwar die Strings zu Zahlen, aber Zahlen mit führender Null werden von Browsern als <a href="http://t.co/PRd1oa47">Oktalzahl</a> behandelt. Das ist im Standard so gar nicht vorgesehen und damit ein Browserbug, der zum Glück vom <a href="http://www.peterkroener.de/ecmascript-5-die-nachste-version-von-javascript-teil-2-der-strict-mode/">Strict Mode in ES5</a> abgestellt wird.


<h3>Update-Aufforderungen</h3>
<blockquote>
<p>
Was hältst du von Browser-Update-Aufforderungen in IE auf Seiten, die IE &lt; 8 nicht unterstützen?
</blockquote>
<p>
Eine Web<em>seite</em> (nicht Webapp) kann man <em>immer</em> in eine für alte Browser komumierbare Form bringen, zur Not, indem man alten IEs einfach alle Styles entzieht. Eine Update-Aufforderung bei gleichzeitig nicht mehr funktionierender Seite fände ich an dieser Stelle einfach nur faul. Wer sich die Mühe macht, eine Update-Aufforderung zu bauen, der kann auch schnell einen auf die Basics reduzierten IE6-Stylesheet anlegen.
<p>
Bei Web<em>applikationen</em> ist das etwas anderes. Wenn bestimmte HTML5-Features zwingend gebraucht werden, ist es OK, entsprechende Systemanforderungen zu formulieren. Wenn das alle anderen Programme auf dieser Welt dürfen, warum nicht auch die Webapps?

<h3>Formularvalidierung steuern</h3>
<blockquote>
<p>
Gibt es bei der HTML5 Formularvalidierung eigentlich auch die Möglichkeit, dass man bei dem Kick auf einen bestimmten Submit-Button nicht validiert? Also quasi ein novalidate-Attribute für einen Button bzw. Input-Submit.
<p>
Bei Formularen mit mehreren Seiten (z.B. Bestellvorgang) möchte ich einen Zurück-Button verwenden, bei welchem allerdings nicht zwangsläufig das ganze Formular ausgefüllt sein muss.
Dennoch sollen bereits ausgefüllte Felder übermittelt werden, was einen normalen Link bzw. die history ausschließt. Hast du eine Idee?
</blockquote>
<p>
Eine solche Möglichkeit existiert, funktioniert aber nur in wenigen Browsern. Es gibt das <code>novalidate</code>-Attribut für Formulare, mit dem man die Validierung für das gesamte Formular deaktivieren kann und es gibt das <code>formnovalidate</code>-Attribut für Submitbuttons. Wenn man dieses für die speziellen Submits verwendet (also für die, die keine Validierung auslösen sollen) findet die Prüfung nur beim normalen, finalen Submit sattt und nicht mehr bei den Zwischenschritten. Alle weiteren Details verraten <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#attr-fs-formnovalidate">die Spezifikationen</a>.

<h3>Webfonts und Canvas</h3>
<blockquote>
<p>
Gibt es eine Einschränkung für das Verwenden von Schriftarten in Canvas-Elementen? Ich würde gerne Googles Webfonts verwenden&nbsp;&hellip;
</blockquote>
<p>
Eine Einschränkung gibt es an sich nicht. Das Problem mit Webfonts und Canvas ist nur, dass die Webfonts vollständig geladen sein müssen, bevor man sie auf der Canvas verwenden kann. Und soweit ich weiß, gibt es <em>keine</em> native Möglichkeit in allen Browsern zuverlässig den Zeitpunkt abzupassen, ab dem die (normal via <code>@font-face</code> in CSS eingebetteten) Webfonts da sind. Die Verwendung von <a href="https://github.com/Pomax/Font.js">Font.js</a> oder <a href="https://developers.google.com/webfonts/docs/webfont_loader">Googles WebFont Loader</a> könnte Abhilfe schaffen.

<h3>Weitere Fragen?</h3>
<p>
Eure Fragen zu HTML5, CSS und anderen Webthemen beantworte ich gerne! Einfach <a href="kontakt/">eine E-Mail schreiben</a> oder <a href="http://www.formspring.me/sirpepe">Formspring bemühen</a> und ein bisschen Geduld haben&nbsp;&ndash; falls ich gerade unterwegs bin, kann es mit Antwort manchmal etwas dauern, doch früher oder später schreibe ich garantiert zurück.<img src="http://vg09.met.vgwort.de/na/4d1b09869b12456abe592f380e971f83" width="1" height="1" alt=""><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/kroener?a=1bX4AbJrjWY:d0hWC4MpQmw:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/kroener?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/kroener/~4/1bX4AbJrjWY" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.peterkroener.de/und-noch-mehr-fragen-zu-html5-beantwortet/</feedburner:origLink></item>
<item>
<title><![CDATA[ECMAScript 6: Die nächste Ausbaustufe von JavaScript]]></title>
<link>http://feedproxy.google.com/~r/kroener/~3/EAkh-1BxgNg/</link>
<description><![CDATA[<div class="artikelserie">
<p>
Dieser Artikel ist Teil einer <a href="arikel/ecmascript-6/">Serie</a>:
<ol>
<li><a href="ecmascript-harmony-die-naechste-ausbaustufe-von-javascript/">ES6 im Überblick</a>
<li><a href="ecmascript-6-block-scope-und-konstanten/">Block Scope und Konstanten</a>
</ol>
</div>

<p>
ECMAScript 5 darf man spätestens seit dem Erscheinen des Internet Explorer 9 getrost als die aktuelle, tatsächlich benutzbare Version von JavaScript bezeichnen. Alle neueren Versionen der verbreiteten Browser sowie auch Node.js <a href="http://kangax.github.com/es5-compat-table/">unterstützen&#8230;</a></p></li></li></p>]]></description>
<pubDate>Di, 06 Mär 2012 15:24:00 -0600</pubDate>
<guid isPermaLink="false">http://www.peterkroener.de/ecmascript-harmony-die-naechste-ausbaustufe-von-javascript/</guid>
<dc:creator>Peter Kröner</dc:creator>
<content:encoded><![CDATA[<div class="artikelserie">
<p>
Dieser Artikel ist Teil einer <a href="arikel/ecmascript-6/">Serie</a>:
<ol>
<li><a href="ecmascript-harmony-die-naechste-ausbaustufe-von-javascript/">ES6 im Überblick</a>
<li><a href="ecmascript-6-block-scope-und-konstanten/">Block Scope und Konstanten</a>
</ol>
</div>

<p>
ECMAScript&nbsp;5 darf man spätestens seit dem Erscheinen des Internet Explorer&nbsp;9 getrost als die aktuelle, tatsächlich benutzbare Version von JavaScript bezeichnen. Alle neueren Versionen der verbreiteten Browser sowie auch Node.js <a href="http://kangax.github.com/es5-compat-table/">unterstützen den neuen Standard</a> so weit, dass sich Entwickler nur noch von <em>ganz</em> alten Browser-Fossilien aufgehalten fühlen dürfen. Damit wird es also höchste Eisenbahn, sich mit der nächsten Java-Script-Version, ECMAScript&nbsp;6 (auch Harmony genannt) zu befassen. Dieser Artikel ist der Auftakt zu einer Serie, die der Reihe nach der einzelnen ES6-Features unter die Lupe nimmt, sobald sie in mindestens einem Browser vernünftig implementiert sind. Dieser Beitrag betrachtet zunächst nur das Drumherum; richtig technisch wird es erst im nächsten Teil.

<h3>Geschichtlicher Überblick</h3>
<p>
Wie in der <a href="http://www.peterkroener.de/artikel/ecmascript-5/">Artikelserie zu ECMAScript&nbsp;5 beschrieben</a>, handelt es sich bei ES5 um ein ein eher vorsichtiges Update, bei dem die Wahrung der Abwärtskompatibilität über allem steht. Dies ging naturgemäß so manchen Entwickler nicht weit genug und so wurde gefordert, man möge doch bitte die große Axt herausholen und JavaScript von Grund auf reformieren. Das ist allerdings nicht ganz so einfach wie es sich anhört. Schon Version&nbsp;4 von ECMAScript sollte <a href="https://spreadsheets.google.com/pub?key=pFIHldY_CkszsFxMkQOReAQ&gid=2">mit allerlei neuen Features</a> aufwarten, doch zwischen den verschiedenen Interessengruppen kam es nicht zur Einigung. Nach Meinung Einiger uferte das Updatepaket aus und man konnte sich nicht darüber verständigen, wie weit und wie schnell man die Entwicklung vorantreiben sollte.
<p>
Als klar wurde, dass es sehr Unterschiedliche Auffassungen über die Zukunft von ECMAScript gab, schwiegen sich die an der Arbeitsgruppe beteiligten Partien zunächst ein Jahr lang gegenseitig an. Da sich aber auch dieser Zustand nicht als besonders vielversprechend heraussetellte, <a href="http://ajaxian.com/archives/ecmascript-harmony-coming-together-after-oslo">einigte man sich schließlich</a> darauf, die Entwicklung der Sprache in kleineren Schritten voranzutreiben. Zunächst wurde mit ECMAScript&nbsp;5 die Sprache vor allem ausgemistet. Die wenigen neuen Features waren entweder schon praxiserprobt (z.B. <code>Function.prototype.bind</code>) oder wurden mit viel Mühe so konzipiert, dass sie unter keinen Umständen mit bestehenden Scripts im Web kollidieren konnten (z.B. Strict Mode, Objekterweiterungen).
<p>
Mit ES5 wurde ein Fundament gelegt, aus das zukünftige Versionen der Sprache aufsetzen konnten, was mit ES6 nun langsam Realität wird. Zwar kommt die Anzahl der Neuerungen für die sechste Version der Sprache nicht an das heran, was mit ES4 geplant war, aber für Web-Verhältnisse kann sich der Umfang des Gebotenen durchaus sehen lassen.

<h3>Ein Rüstprogramm für JavaScript</h3>
<p>
ES6 ist ein vergleichsweise großes Rüstprogramm für JavaScript. Das Standardisierungskomitee um Brendan Eich war teilweise durchaus willens, auch radikalere Umbauten vorzunehmen und so zum Beispiel <a href="http://wiki.ecmascript.org/doku.php?id=strawman:paren_free">Köpfe von Kontrollstrukturen ohne Klammern zuzulassen:</a>
<pre><code class="prettyprint">if foo > 42 {
    bar++;
}</code></pre>
<p>
Obwohl diese eine Änderung aller Voraussicht nach nun nicht den Weg in den Standard finden wird, demonstriert sie doch sehr schön die Geisteshaltung, mit der an das Projekt ES6 herangegangen wurde: JavaScript sollte gründlich um- und aufgebaut werden! Letztlich sind es wesentlich mehr Aus- als Umbauten geworden; bestehende Scripts samt und sonders nicht mehr lauffähig zu halten, war dann doch etwas viel verlangt. Die komplette Liste der Features, die sich (ziemlich sehr) sicher im neuen Standard wiederfinden werden gibt es im <a href="http://wiki.ecmascript.org/doku.php?id=harmony:proposals">ECMAScript-Wiki</a>. Einige Highlights:
<ul>
<li>Features, die man für selbstverständlich halten würden, die aber bisher immer gefehlt haben (z.B <a href="http://wiki.ecmascript.org/doku.php?id=harmony:const">Konstanten</a> und <a href="http://wiki.ecmascript.org/doku.php?id=harmony:parameter_default_values">Vorgabewerte für Funktionsargumente</a>)
<li>Zusätzliche Datenstrukturen wie <a href="http://wiki.ecmascript.org/doku.php?id=harmony:simple_maps_and_sets">Maps und Sets</a>
<li>Zahlreiche aus Python und ähnlichen Sprachen gemopste Features (z.B. <a href="http://wiki.ecmascript.org/doku.php?id=harmony:generators">Generatoren</a> und <a href="http://wiki.ecmascript.org/doku.php?id=harmony:iterators">Iteratoren</a>)
<li><a href="http://wiki.ecmascript.org/doku.php?id=harmony:modules">Ein Modulsystem</a>, <a href="http://wiki.ecmascript.org/doku.php?id=harmony:direct_proxies">Proxies</a>, <a href="http://wiki.ecmascript.org/doku.php?id=harmony:binary_data">Binärdatentypen</a> und weitere Neuerungen
<li>Ein <a href="http://wiki.ecmascript.org/doku.php?id=harmony:classes">Klassensystem</a>
<li>Sowie auch eine Handvoll Bugfixes (<del>z.B. gibt <code>typeof null</code> in ES6 sinnvollerweise auch <a href="http://wiki.ecmascript.org/doku.php?id=harmony:typeof_null">tatsächlich</a> <code>'null'</code> anstelle von <code>'object'</code> zurück</del>)
</ul>
<p>
Wie immer bei Webstandards müssen wir natürlich auch das, was auf dem Papier steht, mit dem vergleichen, was in der Realität existiert. Dort ist zwar noch nicht viel von dem neuen Standard angekommen, doch das was schon da ist, kann sich in aller Regel sehen lassen.

<h3>Status und Unterstützung</h3>
<p>
ECMAScript&nbsp;6 selbst ist Stand Anfang 2012 noch kein fertiger Standard, aber die meisten Teile der Spezifikationen sind schon recht stabil. Anders als bei anderen Webstandards funktioniert JavaScript wirklich fast genau so, wie man es von einem Standard erwartet: erst kommt das Papier, dann folgen die Implementierungen. So gibt es verglichen mit den ebenfalls unfertigen Standards HTML5 und CSS3 bisher nur punktuelle Browserunterstützung.
<p>
In <a href="http://tools.google.com/dlpage/chromesxs">Chrome Canary</a>, einem experimentelle Chrome-Build, findet man (Stand Anfang 2012) von allen Browsern die meisten ES6-Features. Um in den Genuss von ES6 zu kommen, muss man unter <code>about:flags</code> den Punkt „Enable Experimental JavaScript“ aktivieren:
<figure><a class="imagelink" href="http://cdn2.peterkroener.de/uploads/2012/chromeES6flags.png"><img src="http://cdn2.peterkroener.de/uploads/2012/chromeES6flags-klein.png" alt="Der ES6-Aktivierungs-Dialog in Chrome"></a></figure>
<p>
Danach stehen in allen Scripts, die im <a href="ecmascript-5-die-nachste-version-von-javascript-teil-2-der-strict-mode/">Strict Mode</a> ausgeführt werden, die in Chrome Canary vorhandenen ES6-Features zur Verfügung. Auch in anderen V8-basierten Umgebungen kommt man in den Genuss der Features von Chrome&nbsp;&ndash; in Node.js lassen sich verschiedene ES6-Aspekte per Startparameter aktivieren (z.B. <code>--harmony_weakmaps</code> für Weak Maps).
<p>
Manche JS-Engines stellen die Neuheiten auch ohne zusätzliche Arbeit bereit, so zum Beispiel <a href="https://developer.mozilla.org/en/JavaScript/ECMAScript_6_support_in_Mozilla">der Firefox</a>. Es ist realistischerweise davon auszugehen, dass ich all diese Details zur Aktivierung von ES6 im Wochentakt ändern werden, doch vom Experimentieren mit den neuen Features muss das nicht abhalten&nbsp;&ndash; denn diese selbst sind schließlich weitgehend stabil.
<p>
Problematisch ist allein die fehlende Dokumentation. Neben dem Standard selbst gibt zur Zeit so gute wie gar keine Quellen, aus denen man Infos über ES6 beziehen könnte (z.B. Browser-Sourcecode und dazugehörige Unit Tests), aber genau dafür ist schließlich diese Artikelserie da.


<h3>Wie geht es weiter?</h3>
<p>
Dieser Artikel ist der Auftakt zu einer Serie, die die neuen Features von ES6 genauer beleuchtet. Zur Vorbereitung empfehle ich, die <a href="http://www.peterkroener.de/artikel/ecmascript-5/">Artikelserie zu ES5</a> zu lesen&nbsp;&ndash; es ist schließlich immer sinnvoll, den ersten Schritt vor dem Zweiten zu tun. Die Serie wird nach und nach neue Teile erhalten wenn immer mehr ES6-Features in den Browsern verfügbar werden, wobei als erstes Thema voraussichtlich Block Scope und Konstanten auf der Agenda stehen&nbsp;&ndash; irgendwann in den nächsten Tagen.<img src="http://vg09.met.vgwort.de/na/eeb9bd55e6904a03b84a1fb7bffa039a" alt=""><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/kroener?a=EAkh-1BxgNg:AK9VXvC6afA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/kroener?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/kroener/~4/EAkh-1BxgNg" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.peterkroener.de/ecmascript-harmony-die-naechste-ausbaustufe-von-javascript/</feedburner:origLink></item>
<item>
<title><![CDATA[Webapp-URLs mit der HTML5 History API]]></title>
<link>http://feedproxy.google.com/~r/kroener/~3/TLykH5GPI9Y/</link>
<description><![CDATA[<p>
Vor langer Zeit schrieb ich einen Artikel namens <a href="http://www.peterkroener.de/href-ist-niemals/">href ist niemals #</a>. In diesem wandte ich mich gegen die damals grassierende Unsitte, Links zu bauen, die außer einem Onlick-Handler nur das Attribut <code>href="#"</code> tragen. Das ist aus gleich zwei Gründen suboptimal: zum einen sollten Ressourcen im Web immer durch eine URL identifizierbar sind und zum anderen fehlt #-Links ein Alternativ-Dokument für Besucher ohne JavaScript. Nun hat sich aber seit dem Aussterben der Dinosaurier einiges getan und heute kann es unter Umständen durchaus&#8230;</p>]]></description>
<pubDate>Di, 14 Feb 2012 11:46:02 -0600</pubDate>
<guid isPermaLink="false">http://www.peterkroener.de/webapp-urls-mit-der-html5-history-api/</guid>
<dc:creator>Peter Kröner</dc:creator>
<content:encoded><![CDATA[<p>
Vor langer Zeit schrieb ich einen Artikel namens <a href="http://www.peterkroener.de/href-ist-niemals/">href ist niemals #</a>. In diesem wandte ich mich gegen die damals grassierende Unsitte, Links zu bauen, die außer einem Onlick-Handler nur das Attribut <code>href="#"</code> tragen. Das ist aus gleich zwei Gründen suboptimal: zum einen sollten Ressourcen im Web immer durch eine URL identifizierbar sind und zum anderen fehlt #-Links ein Alternativ-Dokument für Besucher ohne JavaScript. Nun hat sich aber seit dem Aussterben der Dinosaurier einiges getan und heute kann es unter Umständen durchaus sinnvoll sein, Webapps zu schreiben, die JS zwingend voraussetzen&nbsp;&ndash; der HTML5-Revolution sei dank! In diesem Zusammenhang erreichte mich die Frage, was man denn nun für JavaScript-Links anstelle von # als URL verwenden sollte. Wie bringt man einer JS-App URLs bei? Mit der HTML5 History API ist das kein (großes) Problem.

<h3>Ziel und Ausgangslage</h3>

<p>
Das Ziel ist im diesem Beispiel, eine Webapp zu bauen, die drei durch JavaScript definierte Zustände hat: entweder steht in einem <code>&lt;p&gt;</code>-Element der Text „Foo“ oder „Bar“ oder das Element ist leer. Mittels Links soll zwischen den Zuständen hin- und hergeschaltet werden können. Üblicherweise würde man diese Webapp, die allein aus der Datei <code>index.html</code> besteht, in etwa wie folgt bauen:

<pre><code class="language-html prettyprint">&lt;!doctype html&gt;
&lt;title&gt;FooBar Beta 2.0&lt;/title&gt;

&lt;p&gt;
    &lt;a onclick="foo()" href="#"&gt;Foo-Zustand&lt;/a&gt;
    &lt;a onclick="bar()" href="#"&gt;Bar-Zustand&lt;/a&gt;
&lt;/p&gt;

&lt;p id="content"&gt;&lt;/p&gt;

&lt;script&gt;
    var content = document.getElementById('content');
    var foo = function(){
        content.innerHTML = 'Foo';
        return false;
    };
    var bar = function(){
        content.innerHTML = 'Bar';
        return false;
    };
&lt;/script&gt;</code></pre>

<p>
<a href="http://files.peterkroener.de/test/history/01/">Die Links lassen sich nun zwar anklicken</a> um zwischen „Foo“ und „Bar“ hin- und her zu schalten, aber es fehlen eben die URLs für die beiden Zustände und auch der Zurück-Button des Browsers macht nicht das, was er soll. Das wollen wir ändern.

<h3>URLs für die Zustände</h3>

<p>
Wenn wir unsere beiden Links mit echten URLs ausstatten&nbsp;&hellip;

<pre><code class="language-html prettyprint">&lt;p&gt;
    &lt;a onclick="foo()" href="foo"&gt;Foo-Zustand&lt;/a&gt;
    &lt;a onclick="bar()" href="bar"&gt;Bar-Zustand&lt;/a&gt;
&lt;/p&gt;</code></pre>

<p>
&hellip; ändert sich zunächst nichts, denn wenn die Links angeklickt werden, werden nur die Onclick-Handler aktiv. Die URLs selbst funktionieren nicht, denn unter diesen Adressen sind natürlich keine HTML-Seiten zu finden. Und das soll auch so bleiben; <code>foo</code> und <code>bar</code> sollen schließlich beide keine eigenen Dokumente sein, sondern unterschiedliche Zustände für <code>index.html</code> repräsentieren. Also leiten wir einfach die URLs für die beiden Zustände auf unsere App-Datei um: 

<pre>RewriteEngine on
RewriteRule foo$ index.html [L]
RewriteRule bar$ index.html [L]</pre>

<p>
Nun führen alle URLs auf unsere Webapp. Um die App die beiden Zustände repräsentieren zu lassen, müssen wir nur noch die jeweilige URL auslesen und den entsprechenden Inhalt anzeigen:

<pre><code class="language-javascript prettyprint">// Beim laden der Seite die URL parsen und den richtigen Inhalt anzeigen
window.addEventListener('load', function(){
    // Letzte drei Zeichen der URL sind entweder "foo" oder "bar"
    var zustand = window.location.href.substr(-3);
    // Je nach URL mit Foo- oder Bar-Zustand starten
    if(zustand === 'foo'){
        foo();
    }
    else if(zustand === 'bar'){
        bar();
    }
}, false);</code></pre>

<p>
Wenn wir nun noch die onlick-Handler aus den Links entfernen&nbsp;&hellip;

<pre><code class="language-html prettyprint">&lt;p&gt;
    &lt;a href="foo"&gt;Foo-Zustand&lt;/a&gt;
    &lt;a href="bar"&gt;Bar-Zustand&lt;/a&gt;
&lt;/p&gt;</code></pre>

<p>
&hellip; <a href="http://files.peterkroener.de/test/history/02/">funktioniert die App inklusive URLs!</a> Das ist allerdings auch kein Wunder, denn im Prinzip haben wir die App einfach de-ajaxifiziert. Jeder Klick auf die Links lädt jetzt die Seite neu, die dann wiederum die URL ausliest und per JavaScript den richtigen Content lädt. Wie re-ajaxifizieren wir nun die App so, dass sie sowohl URLs benutzt als auch nicht ständig neu lädt? Hier kommt die History API ins Spiel.

<h3>Das History-Script</h3>

<p>
Die meisten werden wissen, dass man die Browser-History per JavaScript ansprechen kann um zum Beispiel mit <code>window.history.back()</code> die Funktionalität eines Zurück-Buttons nachzubilden. Seit einiger Zeit erlauben moderne Browser nicht nur das Auslesen der History, sondern auch deren Manipulation. Wie immer <a href="https://developer.mozilla.org/en/DOM/Manipulating_the_browser_history">bietet MDN einen detaillierten und gleichzeitig verbraucherfreundlichen Überblick</a>, aber ganz kurz gesagt bietet die History-API folgende neuen Features:

<ul>
<li>mit <code>window.history.pushState()</code> kann man einen neuen Eintrag in der Browser-History anlegen. Der Funktion übergibt man ein Status-Objekt, einen Titel und eine URL, die den neuen Status repräsentiert
<li><code>window.history.replaceState()</code> ersetzt den aktuellen History-Eintrag, statt einen neuen anzulegen
<li>Das auf <code>window</code> feuernde <code>popstate</code>-Event teilt mit, wenn der aktuelle History-Eintrag wechselt, also wenn zum Beispiel der Nutzer auf den Zurück-Button klickt und damit einen Schritt in der History zurück geht.
</ul>

<p>
Wenn wir nun möchten, dass unsere Links beim Anklicken nicht nur den Zustand ändern, sondern auch neue History-Einträge anlegen, ist das mit <code>window.history.pushState()</code> ein Kinderspiel:

<pre><code class="language-javascript prettyprint">// Beim Link-Klick den richtigen Inhalt anzeigen und die History anpassen
document.querySelector('a[href=foo]').addEventListener('click', function(evt){
    evt.preventDefault(); // Dies verhindert den "normalen" Aufruf der Link-URL
    history.pushState(null, '', 'foo'); // Neuer History-Eintrag "foo"
    foo();
});
document.querySelector('a[href=bar]').addEventListener('click', function(evt){
    evt.preventDefault(); // Dies verhindert den "normalen" Aufruf der Link-URL
    history.pushState(null, '', 'bar'); // Neuer History-Eintrag "bar"
    bar();
});</code></pre>

<p>
Die ersten beiden Argumente von <code>window.history.pushState()</code> sind ein Status-Objekt und der Titel für den Histroy-Eintrag. Beides brauchen wir in unserem Fall nicht; der Titel ist sowieso recht nutzlos und das Status-Objekt, das normalerweise den Zustand der App mit einen History-Eintrag verknüpfen würde (ändert sich der aktuelle History-Eintrag, dann ändert sich auch das Status-Objekt entsprechend) brauchen wir auch nicht. Unser App-Status ist komplett aus der URL abzulesen, also übergeben wir der Funktion nur die jeweiligen URLs <code>foo</code> und <code>bar</code>. Da wir ja schon den Code zum Parsen dieser URL im <code>load</code>-Event haben, brauchen wir diesen nur so umzubauen, dass er auch auf das <code>popstate</code>-Event reagiert.

<pre><code class="language-javascript prettyprint">// Wenn sich die History ändert oder die Seite neu lädt, den
// richtigen Zustand herstellen
var changeState = function(){
    // Letzte drei Zeichen der URL sollten entweder "foo" oder "bar" sein
    var zustand = window.location.href.substr(-3);
    // Je nach URL mit Foo-, Bar- oder Leer-Zustand starten
    if(zustand === 'foo'){
        foo();
    }
    else if(zustand === 'bar'){
        bar();
    }
    else {
        content.innerHTML = '';
    }
};
window.addEventListener('load', changeState, false);
window.addEventListener('popstate', changeState, false);</code></pre>

<p>
Der Statuswechsel wird nun nicht nur beim Laden der Seite ausgeführt, sondern auch, wenn sich der Nutzer durch die History bewegt. Es ist beim Umbau einzig darauf zu achten, dass der Zustand neben „Foo“ und „Bar“ nun ja auch via Zurück-Button wieder auf „Leer“ gesetzt werden kann, ansonsten bleibt alles beim Alten. <a href="http://files.peterkroener.de/test/history/03/">Fertig ist die reine JS-App mit echten URLs und voller History-Funktionalität!</a><img src="http://vg09.met.vgwort.de/na/91d8f92a46854ee1925f3cc807fcf8b8" width="1" height="1" alt="">

<h3>Browser, Tools und Links</h3>

<p>
Die History API wird von allen vernünftigen aktuellen Browsern unterstützt und <a href="http://msdn.microsoft.com/library/hh673546.aspx#history">ab Version 10 auch vom Internet Explorer</a>, doch die einzelnen Implementierungen unterscheiden sich auf recht lästige Art und Weise. So feuern Beispielsweise einige Browser das <code>popstate</code>-Event beim Laden der Seite oder wenn sich der Hash ändert, andere nicht. Um sich all diese Probleme vom Leib zu halten und für ältere Browsern keine Extrawürste braten zu müssen, empfiehlt sich der Einsatz von <a href="https://github.com/balupton/history.js">History.js</a>. Hiermit erhält man eine gemeinsame History-API für alle Browser, die sich genau wie das Original verhält, sämtliche Macken repariert und die auch mit allen gängigen JavaScript-Frameworks klarkommt. Weitere Links, die von Interesse sein könnten:

<ul>
<li>Spezifikationen von <a href="http://www.w3.org/TR/html5/history.html#the-history-interface">W3C</a> und <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/history.html#the-history-interface">WHATWG</a>
<li><a href="https://github.com/balupton/history.js/wiki/The-State-of-the-HTML5-History-API">Liste der Unterschiede zwischen den diversen Browsern</a>
<li><a href="http://medialize.github.com/URI.js/">URI.js</a> ist das Werkzeug der Wahl zum Parsen von URLs
<li><a href="https://github.com/balupton/history.js">History.js</a> vereinheitlicht die verschiedenen Browser
</ul><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/kroener?a=TLykH5GPI9Y:pbHAcps6Ego:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/kroener?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/kroener/~4/TLykH5GPI9Y" height="1" width="1"/>]]></content:encoded>
<feedburner:origLink>http://www.peterkroener.de/webapp-urls-mit-der-html5-history-api/</feedburner:origLink></item>
</channel>
</rss>

