<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Codecandies &#187; javascript</title>
	<atom:link href="http://codecandies.de/tag/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://codecandies.de</link>
	<description>Das Weblog von Nico Brünjes.</description>
	<lastBuildDate>Sat, 05 May 2012 07:17:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title><![CDATA[Verlinkt: A re-introduction to JavaScript]]></title>
		<link><![CDATA[https://developer.mozilla.org/en/JavaScript/A_re-introduction_to_JavaScript]]></link>
		<comments>http://codecandies.de/2012/02/14/a-re-introduction-to-javascript/#comments</comments>
		<pubDate>Tue, 14 Feb 2012 10:55:40 +0000</pubDate>
		<dc:creator>Nico Brünjes</dc:creator>
				<category><![CDATA[Bookmarks]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mozilla]]></category>

		<guid isPermaLink="false">http://codecandies.de/?p=4846</guid>
		<description><![CDATA[Why a re-introduction? Because JavaScript has a reasonable claim to being the world's most misunderstood programming language.<p><a href="http://codecandies.de/2012/02/14/a-re-introduction-to-javascript/" rel="bookmark" title="Permanent link to 'A re-introduction to JavaScript'" class="glyph">→</a></p>
]]></description>
			<content:encoded><![CDATA[<blockquote><p>Why a re-introduction? Because JavaScript has a reasonable claim to being the world&#8217;s most misunderstood programming language.</p>
</blockquote>
<p><a href="http://codecandies.de/2012/02/14/a-re-introduction-to-javascript/" rel="bookmark" title="Permanent link to 'A re-introduction to JavaScript'" class="glyph">→</a></p>
]]></content:encoded>
			<wfw:commentRss>http://codecandies.de/2012/02/14/a-re-introduction-to-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title><![CDATA[Verlinkt: Hidden Gems of HTML5: classList]]></title>
		<link><![CDATA[http://hacks.mozilla.org/2012/01/hidden-gems-of-html5-classlist/]]></link>
		<comments>http://codecandies.de/2012/01/30/hidden-gems-of-html5-classlist/#comments</comments>
		<pubDate>Mon, 30 Jan 2012 13:00:29 +0000</pubDate>
		<dc:creator>Nico Brünjes</dc:creator>
				<category><![CDATA[Bookmarks]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://codecandies.de/?p=4689</guid>
		<description><![CDATA[Mit HTML5 ist Schluss mit "element.className.search(/aClassName/);" und &#228;hnlichem Schlunz.<p><a href="http://codecandies.de/2012/01/30/hidden-gems-of-html5-classlist/" rel="bookmark" title="Permanent link to 'Hidden Gems of HTML5: classList'" class="glyph">→</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Mit HTML5 ist Schluss mit <code>element.className.search(/aClassName/);</code> und &#228;hnlichem Schlunz.</p>
<p><a href="http://codecandies.de/2012/01/30/hidden-gems-of-html5-classlist/" rel="bookmark" title="Permanent link to 'Hidden Gems of HTML5: classList'" class="glyph">→</a></p>
]]></content:encoded>
			<wfw:commentRss>http://codecandies.de/2012/01/30/hidden-gems-of-html5-classlist/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title><![CDATA[Verlinkt: The Why of Wat]]></title>
		<link><![CDATA[http://blog.caplin.com/2012/01/27/the-why-of-wat/]]></link>
		<comments>http://codecandies.de/2012/01/30/the-why-of-wat/#comments</comments>
		<pubDate>Mon, 30 Jan 2012 09:26:34 +0000</pubDate>
		<dc:creator>Nico Brünjes</dc:creator>
				<category><![CDATA[Bookmarks]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[programmierung]]></category>

		<guid isPermaLink="false">http://codecandies.de/?p=4683</guid>
		<description><![CDATA[Adam Iley ist so nett allen die &#252;ber WAT gelacht haben, zu erkl&#228;ren, was da so witzig war.<p><a href="http://codecandies.de/2012/01/30/the-why-of-wat/" rel="bookmark" title="Permanent link to 'The Why of Wat'" class="glyph">→</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Adam Iley ist so nett allen, die &#252;ber <a href="https://www.destroyallsoftware.com/talks/wat">WAT</a> gelacht haben, zu erkl&#228;ren, was da so witzig war. Davon wird JS (oder Ruby) nicht besser, aber man weiss, worauf man schauen muss…</p>
<p>Ebenso auf <a href="http://stackoverflow.com/questions/9032856/can-anyone-explain-these-bizarre-javascript-behaviours-mentioned-in-the-wat-ta/9033306#9033306">stackoverflow</a>.</p>
<p>Via <a href="https://twitter.com/#!/fwebdev/status/163896760236908544">fwebdev</a>.</p>
<p><a href="http://codecandies.de/2012/01/30/the-why-of-wat/" rel="bookmark" title="Permanent link to 'The Why of Wat'" class="glyph">→</a></p>
]]></content:encoded>
			<wfw:commentRss>http://codecandies.de/2012/01/30/the-why-of-wat/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title><![CDATA[Verlinkt: Building a jQuery Mobile Application]]></title>
		<link><![CDATA[http://miamicoder.com/2011/building-a-jquery-mobile-application-part-1/]]></link>
		<comments>http://codecandies.de/2012/01/23/building-a-jquery-mobile-application-part-1/#comments</comments>
		<pubDate>Mon, 23 Jan 2012 09:33:51 +0000</pubDate>
		<dc:creator>Nico Brünjes</dc:creator>
				<category><![CDATA[Bookmarks]]></category>
		<category><![CDATA[jasmine]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://codecandies.de/?p=4553</guid>
		<description><![CDATA[Vierteiliges extended Tutorial, mit allen Schikanen: mobile jQuery, Testing mit Jasmine, vom Mockup bis zur fertigen Webapp.<p><a href="http://codecandies.de/2012/01/23/building-a-jquery-mobile-application-part-1/" rel="bookmark" title="Permanent link to 'Building a jQuery Mobile Application'" class="glyph">→</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Vierteiliges <em>extended</em> Tutorial, mit allen Schikanen: mobile jQuery, Testing mit <a href="https://github.com/pivotal/jasmine/wiki">Jasmine</a>, vom Mockup bis zur fertigen Webapp. Via <a href="http://tthor.com/">tthor.com</a>.</p>
<p><a href="http://codecandies.de/2012/01/23/building-a-jquery-mobile-application-part-1/" rel="bookmark" title="Permanent link to 'Building a jQuery Mobile Application'" class="glyph">→</a></p>
]]></content:encoded>
			<wfw:commentRss>http://codecandies.de/2012/01/23/building-a-jquery-mobile-application-part-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title><![CDATA[Verlinkt: Bootstrap]]></title>
		<link><![CDATA[http://twitter.github.com/bootstrap/]]></link>
		<comments>http://codecandies.de/2012/01/23/bootstrap/#comments</comments>
		<pubDate>Mon, 23 Jan 2012 09:14:53 +0000</pubDate>
		<dc:creator>Nico Brünjes</dc:creator>
				<category><![CDATA[Bookmarks]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://codecandies.de/?p=4556</guid>
		<description><![CDATA[Bootstrap is a toolkit from Twitter designed to kickstart development of webapps and sites. It includes base CSS and HTML for typography, forms, buttons, tables, grids, navigation, and more.<p><a href="http://codecandies.de/2012/01/23/bootstrap/" rel="bookmark" title="Permanent link to 'Bootstrap'" class="glyph">→</a></p>
]]></description>
			<content:encoded><![CDATA[<blockquote><p>Bootstrap is a toolkit from Twitter designed to kickstart development of webapps and sites. It includes base CSS and HTML for typography, forms, buttons, tables, grids, navigation, and more.</p>
</blockquote>
<p>Via <a href="http://www.alistapart.com/articles/building-twitter-bootstrap/">ALA</a>.</p>
<p><a href="http://codecandies.de/2012/01/23/bootstrap/" rel="bookmark" title="Permanent link to 'Bootstrap'" class="glyph">→</a></p>
]]></content:encoded>
			<wfw:commentRss>http://codecandies.de/2012/01/23/bootstrap/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title><![CDATA[Verlinkt: The Four Horsemen of JavaScript]]></title>
		<link><![CDATA[http://www.lukew.com/ff/entry.asp?1482]]></link>
		<comments>http://codecandies.de/2012/01/18/the-four-horsemen-of-javascript/#comments</comments>
		<pubDate>Wed, 18 Jan 2012 10:29:32 +0000</pubDate>
		<dc:creator>Nico Brünjes</dc:creator>
				<category><![CDATA[Bookmarks]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[lukew]]></category>

		<guid isPermaLink="false">http://codecandies.de/?p=4517</guid>
		<description><![CDATA[Luke Wrobelski hat nicht nur einen Supertitel vergeben, sondern auch eine echte Erkenntnis gewonnen.<p><a href="http://codecandies.de/2012/01/18/the-four-horsemen-of-javascript/" rel="bookmark" title="Permanent link to 'The Four Horsemen of JavaScript'" class="glyph">→</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Luke Wrobelski hat nicht nur einen Supertitel vergeben, sondern auch eine echte Erkenntnis gewonnen:</p>
<blockquote><p>
  I&#8217;m not technical enough to understand the full implications of this but it strikes me as very interesting: JavaScript simultaneously running the client, server, data structure, and third party connections of software.
</p></blockquote>
<p><a href="http://codecandies.de/2012/01/18/the-four-horsemen-of-javascript/" rel="bookmark" title="Permanent link to 'The Four Horsemen of JavaScript'" class="glyph">→</a></p>
]]></content:encoded>
			<wfw:commentRss>http://codecandies.de/2012/01/18/the-four-horsemen-of-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title><![CDATA[Verlinkt: jQuery Plugin: Scrollorama]]></title>
		<link><![CDATA[http://johnpolacek.github.com/scrollorama/]]></link>
		<comments>http://codecandies.de/2012/01/09/jquery-plugin-scrollorama/#comments</comments>
		<pubDate>Mon, 09 Jan 2012 08:12:41 +0000</pubDate>
		<dc:creator>Nico Brünjes</dc:creator>
				<category><![CDATA[Bookmarks]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[webdesign]]></category>

		<guid isPermaLink="false">http://codecandies.de/?p=4369</guid>
		<description><![CDATA[John Polaceks effektreiches Plugin f&#252;r Scrollingseiten.<p><a href="http://codecandies.de/2012/01/09/jquery-plugin-scrollorama/" rel="bookmark" title="Permanent link to 'jQuery Plugin: Scrollorama'" class="glyph">→</a></p>
]]></description>
			<content:encoded><![CDATA[<p>John Polaceks effektreiches Plugin f&#252;r Scrollingseiten.</p>
<p><a href="http://codecandies.de/2012/01/09/jquery-plugin-scrollorama/" rel="bookmark" title="Permanent link to 'jQuery Plugin: Scrollorama'" class="glyph">→</a></p>
]]></content:encoded>
			<wfw:commentRss>http://codecandies.de/2012/01/09/jquery-plugin-scrollorama/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title><![CDATA[Verlinkt: Mustache, Hogan, Handlebars]]></title>
		<link><![CDATA[http://nimbupani.com/mustache.html]]></link>
		<comments>http://codecandies.de/2012/01/02/mustache-hogan-handlebars/#comments</comments>
		<pubDate>Mon, 02 Jan 2012 16:59:10 +0000</pubDate>
		<dc:creator>Nico Brünjes</dc:creator>
				<category><![CDATA[Bookmarks]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[links]]></category>

		<guid isPermaLink="false">http://codecandies.de/?p=4244</guid>
		<description><![CDATA[Divya Manian &#252;ber Templates mit moustache.js und Kollegen.<p><a href="http://codecandies.de/2012/01/02/mustache-hogan-handlebars/" rel="bookmark" title="Permanent link to 'Mustache, Hogan, Handlebars'" class="glyph">→</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Divya Manian &#252;ber Templates mit moustache.js und Kollegen.</p>
<p><a href="http://codecandies.de/2012/01/02/mustache-hogan-handlebars/" rel="bookmark" title="Permanent link to 'Mustache, Hogan, Handlebars'" class="glyph">→</a></p>
]]></content:encoded>
			<wfw:commentRss>http://codecandies.de/2012/01/02/mustache-hogan-handlebars/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Touchbedienung in der Webapp</title>
		<link>http://codecandies.de/2010/12/01/touchbedienung-in-der-webapp/</link>
		<comments>http://codecandies.de/2010/12/01/touchbedienung-in-der-webapp/#comments</comments>
		<pubDate>Wed, 01 Dec 2010 20:08:56 +0000</pubDate>
		<dc:creator>Nico Brünjes</dc:creator>
				<category><![CDATA[Postings]]></category>
		<category><![CDATA[ipad]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://codecandies.de/?p=3371</guid>
		<description><![CDATA[Die Touchbedienung ist einer der gro&#223;en Unterschied zwischen Tablet- und Desktopcomputer. Dieses Bedienkonzept, wie es der Nutzer inzwischen auch schon aus den sog. <em>nativen</em> Apps gelernt hat, so sinnvoll wie m&#246;glich umzusetzen und zu nutzen, sollte auf jeden Fall Teilaufgabe einer <em>HTML5-App</em> sein. Leider stehen der App im Browser nicht alle Schnitsstellen und F&#228;higkeiten zur Verf&#252;gung, die bei der Programmierung einer nativen App genutzt werden k&#246;nnen…]]></description>
			<content:encoded><![CDATA[<div class="foto"><img src="http://codecandies.de/wp-content/uploads/2010/12/bildergalerie.jpg" alt="Bildergalerie, iPad Version" title="Bildergalerie, iPad Version" width="620" height="420" class="alignnone size-full wp-image-3375" />
<p><a href="http://www.zeit.de/wissen/2010-11/fs-schnueffelratten-landminen">Bildergalerie bei ZEIT ONLINE</a>, Ansicht auf dem iPad</p>
</div>
<p>Die Touchbedienung ist einer der gro&#223;en Unterschied zwischen Tablet- und Desktopcomputer. Dieses Bedienkonzept, wie es der Nutzer inzwischen auch schon aus den sog. <em>nativen</em> Apps gelernt hat, so sinnvoll wie m&#246;glich umzusetzen und zu nutzen, sollte auf jeden Fall Teilaufgabe einer <em>HTML5-App</em> sein. Leider stehen der App im Browser nicht alle Schnitsstellen und F&#228;higkeiten zur Verf&#252;gung, die bei der Programmierung einer nativen App genutzt werden k&#246;nnen. Darauf kommt es aber allein auch nicht an, wie gesagt, es geht eben auch und vordringlich um das Bedienkonzepte.</p>
<p>Als <em>alten Hut</em> muss man zum Beispiel die Bedienung mit Kn&#246;pfen sehen, denn <em>Buttons</em> sind eben typischerweise Klickziele f&#252;r den Mauszeiger und weniger f&#252;r den Finger. Obwohl ein Button nat&#252;rlich auch in der Touchbedienung funktionieren kann; dann muss er aber gro&#223; und gut zu treffen sein, und auch noch erkennbar, wenn der Nutzer den Finger darauf legt. Trotzdem, ein Button zum Vor- und Zur&#252;ckbl&#228;ttern in einer Bildergalerie, ist nicht wirklich <em>tabletgem&#228;&#223;</em>.</p>
<p>Um es kurz zu machen: in einer <a href="http://www.zeit.de/wissen/2010-11/fs-schnueffelratten-landminen">Bildergalerie wie dieser hier</a> will der Nutzer <em>sliden</em> – mit dem Finger das Bild aus dem Viewport schieben – und nicht Kn&#246;pfe dr&#252;cken. In der Tabletversion haben wir das im Ansatz umgesetzt. Nutzt man die Seite mit dem iPad, kann man mit dem Finger von einem Bild zum n&#228;chsten navigieren. Da ich danach gefragt wurde, will ich kurz erkl&#228;ren wie das funktioniert (und danach auch noch dazu kommen, was noch verbessert werden muss).</p>
<p>Zun&#228;chst mal haben wir das Konzept der meisten Bildergalerien auf ZEIT ONLINE &#252;bernommen. Die bestehen zum Ladenzeitpunkt nur aus ihrem ersten Bild, die restlichen Bilder werden nachgeladen und versteckt horizontal rechts vom ersten Bild aufgereiht. Klickt man einen der Buttons wird der Container mit den Bildern einfach immer um Bildbreiter nach links oder rechts bewegt.</p>
<p>Die Bedienung durch die Buttons haben wir nur durch die Touchbedienung erweitert. Vielleicht sei kurz erw&#228;hnt wie Javascript einen solchen Touchevent sieht: es gibt die vier Events <code>touchstart</code>, <code>touchmove</code>, <code>touchend</code> und <code>touchcancel</code>. Die ersten drei laufen immer nacheinander ab, wobei touchmove solange wiederholt wird, wie man mit dem Finger &#252;ber die Touchoberfl&#228;che <em>slidet</em>. <code>touchcancel</code> tritt auf, wenn eine Touchaktion abgebrochen wird, bspw. wenn man mit dem Finger &#252;ber den Bildschirm hinaus geht. Die Events haben als Eigenschaften (man kennt das von Mouseevents) u.a. die Bildschirmkoordinaten, wo sie ausgel&#246;st wurden.</p>
<p>Damit l&#228;sst sich also leicht erkennen, ob zwischen <code>touchstart</code> und <code>touchend</code> eine Bewegung, also ein Swipe stattgefunden hat. Hier mein seht vereinfachtes, beispielhaftes jQuery-Plugin dazu (nur als Beispiel, nicht zur Implementation gedacht oder empfohlen):</p>
<pre class="brush: jscript; title: ; notranslate">
$.fn.addSomeTouch = function (options) {
	var xmoved = 0, xstart = 0;
	return this.each( function() {
		// touchstart event
		$( &quot;img&quot;, this ).bind( &quot;touchstart&quot;, function () {
			// jeder Finger ist ein Feld im Array
			// hier: 1-Finger-Geste
			if( event.touches.length == 1 ) {
				// Startpunkt merken
				xstart = event.touches[0].pageX;
			}
		});

		// touchmove event
		$( &quot;img&quot;, this ).bind( &quot;touchmove&quot;, function () {
			// Bewegungsentfernung messen
			xmoved = event.touches[0].pageX - xstart;
		});

		// touchend event
		$( &quot;img&quot;, this ).bind( &quot;touchend&quot;, function () {
			// Limit f&#252;r Verz&#246;gerung
			if( xmoved &gt;= 50 ) {
				alert( &quot;I was touched and will move left.&quot; );
			} else if( xmoved &lt;= -50 ) {
				alert( &quot;I was touched and will move right.&quot; );
			}
			// Reset
			xstart = 0;
			xmoved = 0;
		});

		$( &quot;img&quot;, this ).bind( &quot;touchcancel&quot; , function() {
			// bei Abbruch zur&#252;cksetzen
			xstart = 0;
			xmoved = 0;
		});

	});
};
</pre>
<p>Wie gesagt, das ist kein Code f&#252;r den Produktionseinsatz.</p>
<p>Und was stimmt jetzt nicht? Nun, im Moment setze ich die Fingerbewgung nur als Schalterersatz ein. D.h., die Reaktion ist dieselbe, als w&#252;rde man auf den Links- oder Rechtsknopf dr&#252;cken, die ehrlicherweise ja auch noch da sind. Da bleibt ja noch Raum f&#252;r die Weiterentwicklung, denn so richtig <em>responsiv</em> ist das ja noch nicht.</p>
<p>Und am Schluss noch ein sch&#246;ner Link dazu: bei <a href="http://www.sitepen.com/blog/2008/07/10/touching-and-gesturing-on-the-iphone">Touching and Gesturing on the iPhone</a>, gibt&#8217;s viele Grundlagen nachzulesen und das meiste gilt auch f&#252;r&#8217;s iPad.</p>
]]></content:encoded>
			<wfw:commentRss>http://codecandies.de/2010/12/01/touchbedienung-in-der-webapp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Javascript sch&#246;ner und schneller machen</title>
		<link>http://codecandies.de/2010/11/26/javascript-schoener-und-schneller-machen/</link>
		<comments>http://codecandies.de/2010/11/26/javascript-schoener-und-schneller-machen/#comments</comments>
		<pubDate>Fri, 26 Nov 2010 11:27:35 +0000</pubDate>
		<dc:creator>Nico Brünjes</dc:creator>
				<category><![CDATA[Postings]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://codecandies.de/?p=3361</guid>
		<description><![CDATA[Javascript ist, angesichts seiner <a href="http://en.wikipedia.org/wiki/JavaScript#History">etwas holprigen Entstehungsgeschichte</a> eine eigentlich recht elegante Scriptsprache. Es krankt jedoch daran, dass in Javascript im Grunde alles geht und alles gemacht wird und jedesmal anders. Beachtet man aber neben einem guten Stil in Javascript einige elementare Regeln, kann man seine Scripte dadurch auch noch merklich schneller und kompakter machen. Ein Acht-Punkte-Plan.]]></description>
			<content:encoded><![CDATA[<div class="foto"><img src="http://codecandies.de/wp-content/uploads/2010/11/aintbroke.jpg" alt="" title="Javascript sch&#246;ner und schneller machen" width="620" height="420" class="alignnone size-full wp-image-3366" /></div>
<p>Javascript ist, angesichts seiner <a href="http://en.wikipedia.org/wiki/JavaScript#History">etwas holprigen Entstehungsgeschichte</a> eine eigentlich recht elegante Scriptsprache. Es krankt jedoch daran, dass in Javascript im Grunde alles geht und alles gemacht wird und jedesmal anders. Will man mit Kollegen zusammen an einem Javascriptprojekt arbeiten, ist der eigene Dialekt ebenso hinderlich, wie mangelnde Sauberkeit beim Codeschreiben. Beachtet man aber neben einem guten Stil in Javascript einige elementare Regeln, kann man seine Scripte dadurch auch noch merklich schneller und kompakter machen.</p>
<h2>Coding Guidelines</h2>
<p>In Sachen Coding Guidelines gilt auf jeden Fall: jede Regel ist besser als keine Regel. In Javascript kann man viele b&#246;se Dinge schreiben, die kein Mensch versteht, die aber trotzdem hervorragend funktionieren. Die Sprache l&#228;sst einfach vieles zu, was trotzdem schlechter Stil ist. Vor kurzem haben sich die Entwickler von jQuery einen Styleguide verpasst, die <a href="http://docs.jquery.com/JQuery_Core_Style_Guidelines">JQuery Core Style Guidelines</a>, das ist schon eine wunderbare Grundlage. Einfach copy &amp; pasten.</p>
<p>Wichtig ist dabei auch, die Verwendung von <a href="http://jslint.com/">JS Lint</a> (<q>JSLint will hurt your feelings.</q>). Mit diesem Tool kann man die &#252;belsten Stylefehler vermeiden und die Einhaltung des Styleguides automatisiert &#252;berpr&#252;fen. <a href="http://www.jslint.com/lint.html">Die Einf&#252;hrung dazu</a> ist mehr als lesenswert. Besonders praktisch f&#252;r Nutzer von <a href="http://macromates.com/">Textmate</a> (<em>Lieblingseditor</em>) ist das <a href="http://andrewdupont.net/2006/10/01/javascript-tools-textmate-bundle/">JS Lint Bundle</a>.</p>
<h2>Codeverbesserung: erster Durchgang</h2>
<p>Sich aufzuraffen, seinen Code zu &#252;berarbeiten, ist nicht leicht. Aber: der Wille zur Verbesserung und das Wissen, dass der erste Aufschlag meist nicht optimal ist, trennt den Programmieren vom Scriptingguy, oder so. Hier ein paar schnelle und einfache Schritte, die Javascript schon deutlich verbessern. Federice Galassi hat dar&#252;ber eine <a href="http://www.slideshare.net/mobile/fgalassi/refactoring-to-unobtrusive-javascript">wunderbare Pr&#228;sentation</a> gemacht. Die Ma&#223;nahmen f&#252;hren aber nicht nur in Richtung <em>unobtrusiveness</em>, sondern sind auch geeignet, Javascript schneller und wartbarer zu machen. Kurz zusammengefasst:</p>
<ol>
<li>
<p>Entferne alles Inline-Javascript aus dem HTML-Code.</p>
<p>Also <code>&lt;script&gt; Code&hellip;&lt;/script&gt;</code> raus aus den Seiten und in eigene Dateien (besser eine eintige) packen. Diese dann mit <code>&lt;script src=&quot;datei.js&quot;&gt;&lt;/script&gt;</code> aufrufen. Und das am besten <strong>am Ende der Seite</strong>, direkt vor <code>&lt;/body&gt;</code>.</p>
</li>
<li>
<p>Alle Inlineevents aus dem HTML entfernen</p>
<p>Weg mit <code>&lt;a class=&quot;klick&quot; href=&quot;#&quot; onclick=&quot;foo();&quot;&gt;Klicken Sie hier&lt;/a&gt;</code>. Das kann besser machen. Mit jQuery beispielsweise: <code>$("a.klick" ).bind("click", function() { foo(); });</code>, jedenfalls aber in der externen Javascriptdatei.</p>
</li>
<li>
<p>Javascript-Pseudolinks entfernen</p>
<p>Mit Todesstrafe wird der uralte Javascript-Pseudolink bestraft! Sowas geht gar nicht: <code>&lt;a href=&quot;javascript:foo()&quot;&gt;Klicken Sie hier&lt;/a&gt;</code></p>
</li>
<li>
<p>CSS-Code aus dem Javascript entfernen.</p>
<p>Innerhalb des Javascriptes sollte kein CSS verwendet werden (Trennung von Pr&#228;sentation und Programmierlogik). D.h. sowohl Zuweisungen wie <code>$("a" ).css("background","#ff0000" );</code> oder auch <code>document.getElementById("id").style.color("#ff0000");</code>	und &#228;hnliches schreiben teilweise lange un&#252;berschaubare style-Attribute in den HTML-Code und produzieren DOM-Zugriffe. Stattdessen schreibt man die CSS-Anweisungen in eine CSS-Datei</p>
<pre class="brush: css; title: ; notranslate">
// bspw. base.css
a.rot {
	background: #ff0000;
}
</pre>
<p>und nutzt im Javascript</p>
<pre class="brush: jscript; title: ; notranslate">
$(&quot;a&quot;).addClass(&quot;rot&quot;); // Farbe an
$(&quot;a&quot;).removeClass(&quot;rot&quot;); // Farbe aus, oder gleich:
$(&quot;a&quot;).toggleClass(&quot;rot&quot;); // je nach dem
</pre>
<p><q>CSS bewegt sich wesentlich schneller und gewandter durch das DOM als Javascript.</q></p>
</li>
<li>
<p>Businesslogik aus dem Javascript entfernen (Client-Server-Anwendungen).</p>
<p>Bei Client-Server-Anwendungen kann es einen entscheidenen Geschwindigkeitsvorteil bedeuten, komplizierte Berechnungen nicht auf dem Client (also mit Javascript) sondern auf dem Server auszuf&#252;hren. Wenn man sich also schon Daten vom Server holt, dann sollte man vermeiden mit diesen Daten Berechnungen auf dem Client auszuf&#252;hren. Ein Beispiel:</p>
<pre class="brush: jscript; title: ; notranslate">
// Schlecht!
$.get(&quot;action.php&quot;, function ( data ) {
    if ( data ) {
        if ( data.kontostand &gt; data.dispokredit ) {
            alert(&quot;Konto &#252;berzogen&quot; );
        }
    }
});

// Besser!
$.get(&quot;action.php?dispoberechnung&quot;, {konto:&quot;123456&quot;}, function ( data ) {
    if ( data.dispo === false ) {
        alert(&quot;Konto &#252;berzogen&quot; );
    }
}
</pre>
</li>
<li>
<p>DOM-Operationen auf ein Minimum beschr&#228;nken!</p>
<p>Nicolas Zakas formuliert es in <a href="http://www.amazon.de/gp/product/059680279X?ie=UTF8&amp;tag=couchblogorg-21&amp;linkCode=as2&amp;camp=1638&amp;creative=19454&amp;creativeASIN=059680279X">High Performance JavaScript (Build Faster Web Application Interfaces)</a><img src="http://www.assoc-amazon.de/e/ir?t=couchblogorg-21&amp;l=as2&amp;o=3&amp;a=059680279X" width="1" height="1" border="0" alt="" style="display:inline !important;border:none !important; margin:0px !important;" /> so:</p>
<blockquote><p>An excellent analogy is to think of DOM as a piece of land and JavaScript (meaning ECMAScript) as another piece of land, both connected with a toll bridge (see John Hrvatin, Microsoft, MIX09,  http://videos.visitmix.com/MIX09/T53F ). Every time your ECMAScript needs access to the DOM, you have to cross this bridge and pay the performance toll fee. The more you work with the DOM, the more you pay. So the general recommendation is to cross that bridge as few times as possible and strive to stay in ECMAScript land.</p>
</blockquote>
<p>Daraus ergibt sich eine klare Anweisung: greife sowenig wie es eben geht auf das DOM zu.</p>
<p>Ein Domzugriff ist dann gegeben, wenn ein DOM-Element erschafft, ins DOM einh&#228;ngt, ein Element im DOM verschiebt, Attribute hinzuf&#252;gt und so weiter und so fort. Am allerschlimmsten sind die sogenannte HTML-Coolections und das iterieren hierauf.</p>
<pre class="brush: jscript; title: ; notranslate">
// ein ganz b&#246;ses Beispiel!
function innerHTMLLoop () {
    for ( var i = 0; i &lt; 15000; i++ ) {
        document.getElementById(&quot;meinLink&quot; ).innerHTML +=&quot;a&quot;;
    }
}
</pre>
<p>Hier erleben wir schlappen 15000 DOM-Aufrufe der &#252;belsten Art. Stattdessen vermeidet man solange wie m&#246;glich den Zugriff aufs DOM:</15000></p>
<pre class="brush: jscript; title: ; notranslate">
// dann besser so
function innerHTMLLoop2 () {
    var content =&quot;&quot;;
    for ( var i = 0; i &lt; 15000; i++ ) {
        content +=&quot;a&quot;;
    }
    document.getElementById(&quot;meinLink&quot; ).innerHTML += content;
}
</pre>
<p><strong>Goldene Regel: pro Funktion sollte es nur einen Zugriff auf den DOM geben.</strong> So kann es beispielsweise Sinn machen, sehr lange auf Strings mit HTML zu arbeiten und erst am Ende alles zusammen per  <code>$( var ).appendTo( 'body' );</code> ins DOM zu h&#228;ngen. Ausser in Chrome und Safari ist es sogar noch schneller <code>innerHTML</code> zu benutzen, in jQuery <code>$("#meinKram" ).html( var );</code>. Hier scheiden sich allerdings die Geister, weil innerHTML nicht standardkonform ist, wohl aber von jedem Browser unterst&#252;tzt wird.</p0>
	</li>
<li>
<p>Gro&#223;e HTML-Chunks ggf. durch Templates ersetzen.</p>
<p>Wegen der schon oft angesprochenen Trennung von Content und Pr&#228;sentationslogik ist zu &#252;berlegen, ob man f&#252;r gro&#223;e HTML-St&#252;cke die man in den Code einspeisen muss, vielleicht besser HTML-Templates verwendet, den Code also in externe Dateien auslagert und nachl&#228;dt (auf welche Weise auch immer). Als Vorstufe dazu und Kompromiss kann man auch bis mittelgro&#223;e Codeschnipsel im verborgenen Teilen des HTML-Dokuments unterbringen und sich dann per .clone() oder wieder .html() einlesen und wiederverwenden.</p>
<p>Die Verwendung eines Templatesystems setzt aber bspw. wieder ein eingenes Plugin voraus, Schnipsel im HTML verursachen beim Laden wieder DOM-Zugriffe. Hier muss man genau abwiegen, was der Performance hier zutr&#228;glich ist, sicherlich auch in Abh&#228;ngigkeit vom der Gr&#246;&#223;e des HTML-Codes der ben&#246;tigt wird.</p>
</li>
<li>
<p>Keine/wenig globalen Variablen nutzen!</p>
<p>Variablen die ausserhalb von Funktionen definiert werden, sind, auch wenn sie mit var geschrieben werden, globale Variablen, die im window-Namensraum gespeichert werden. Es besteht die Gefahr, dass diese an anderer Stelle ungewollt &#252;berschrieben werden, au&#223;erdem ist der Zugriff auf window langsam. Stattdessen speichert man Variablen aus dem Window-Namensraum in lokalen Variablen zwischen, auf die der Zugriff wesentlich schneller erfolgt.</p>
</li>
</ol>
<h2>Fortsetzung folgt</h2>
<p>Dieser 8-Punkte-Plan ist aber nur ein Einstieg. Wenn man ein Programm so optimiert hat, kann man praktisch direkt wieder von vorne anfangen und weitere Verbesserungen einbringen. Das wird dann das Thema eines weiteren Artikels hier.</p>
]]></content:encoded>
			<wfw:commentRss>http://codecandies.de/2010/11/26/javascript-schoener-und-schneller-machen/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Die iPad Webseite</title>
		<link>http://codecandies.de/2010/11/18/die-ipad-webseite/</link>
		<comments>http://codecandies.de/2010/11/18/die-ipad-webseite/#comments</comments>
		<pubDate>Thu, 18 Nov 2010 22:49:27 +0000</pubDate>
		<dc:creator>Nico Brünjes</dc:creator>
				<category><![CDATA[Postings]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[medien]]></category>
		<category><![CDATA[webdesign]]></category>

		<guid isPermaLink="false">http://codecandies.de/?p=3334</guid>
		<description><![CDATA[Liest man die g&#228;ngigen Webdesign-Sites findet man eine F&#252;lle von Tipps, wie man seine Website anpassen kann, damit sie auch auf dem iPad <em>funktioniert</em>. Der Tenor: mit <em class="typewriter">css media queries</em> ein paar zus&#228;tzliche Stylesheets f&#252;r das iPad liefern, im Scriptteil ein wenig die Touch- und Gestureevents einsetzen, Flashvideos raus, Buttons gr&#246;&#223;er: fertig! Das war nicht ganz das, was uns vorschwebte…]]></description>
			<content:encoded><![CDATA[<div class="foto"><img src="http://codecandies.de/wp-content/uploads/2010/11/zon-001.jpg" alt="" title="Screenshot © ZEIT ONLINE Wissen" width="620" height="420" class="alignnone size-full wp-image-3337" />
<p>Screenshot ZEIT ONLINE, Wissen Centerpage, iPad Version, Design: Information Architects</p>
</div>
<p>Liest man die g&#228;ngigen Webdesign-Sites findet man eine F&#252;lle von Tipps, wie man seine Website anpassen kann, damit sie auch auf dem iPad <em>funktioniert</em>. Der Tenor: mit <em class="typewriter">css media queries</em> ein paar zus&#228;tzliche Stylesheets f&#252;r das iPad liefern, im Scriptteil ein wenig die Touch- und Gestureevents einsetzen, Flashvideos raus, Buttons gr&#246;&#223;er: fertig! Das war nicht ganz das, was uns vorschwebte…</p>
<h2>Das mit den media queries ist so eine Sache</h2>
<p>Kurz gesagt: CSS media queries sind im Moment <a href="http://codecandies.de/2010/09/08/optimierungen-mit-css-media-queries/">eine schicke und elegante L&#246;sung</a>, wenn man seine bestehende Website mit ein paar Handgriffen an die Gegebenheiten verschiedener, zumeist kleinerer, Displays anpassen will. Ebenso taugen sie sicherlich dazu, eine Web-App zu bauen, die <strong>nur</strong> auf Tablets funktioniert und im Desktopbrowser leer oder ungestyled bleibt (aber wer will das schon?). F&#252;r eine gro&#223;e Contentwebsite, die zweigleisig unter der gleichen Adresse unterschiedliche Styles an Desktopbrowser und Tablets ausliefert, sind sie jedoch (zumindest im Moment) nicht zu gebrauchen.</p>
<p>Das liegt zun&#228;chst einmal daran, dass mit Mediaqueries eingeschr&#228;nkte Stylesheets zun&#228;chst mal <a href="http://www.quirksmode.org/blog/archives/2010/08/combining_media.html">allesamt heruntergeladen werden und dann entschieden wird, was angezeigt wird</a>. F&#252;r den mobilen Einsatz und auch f&#252;r den Tableteinsatz kommen sie damit kaum in Frage. Beim ersteren schon allein wegen der Downloadmengen, beim letzteren kommen wie die Erfahrung zeigt noch weitere Datenmengen an Javascript und z.B. gr&#246;&#223;eren Bildern hinzu. Ein Fass ohne Boden.</p>
<p>Die von mir zun&#228;chst favorisierte L&#246;sung f&#252;hrte aber dazu, dass nicht nur <a href="http://blog.rakeshpai.me/2010/10/practical-css3-media-queries-and-mobile.html">IEs kleiner Version 9 via <em>conditional comments</em> eigene Stylesheets zugeteilt bekommen mussten</a>, auch <a href="http://caniuse.com/#feat=css-media">Firefox 3.0 und kleiner k&#246;nnen mit den mediumabh&#228;ngigen Styles so gar nichts anfangen</a>.</p>
<div class="foto">
<p><a href="http://www.youtube.com/watch?v=h6QlUh4Pung&#038;fmt=18">http://www.youtube.com/watch?v=h6QlUh4Pung</a></p>
<p>Das offizielle Video zum Launch</p>
</div>
<h2>Ohne Javascript geht&#8217;s (derzeit) nicht</h2>
<p>Und auf tut sich die b&#246;se T&#252;r des <em>user agent switching</em>. Zwar gibt es eine <a href="http://code.google.com/p/css3-mediaqueries-js/">Javascript-Lib</a>, die <em>css media queries</em> gewissermassen emuliert, das ist aber ein weiterer gut 20kB gro&#223;er Download ist, ein Monster mithin, das zudem nur mit Queries innerhalb von CSS-Dateien, aber nicht innerhalb von <code>&lt;link /&gt;</code> zul&#228;sst.</p>
<p>Stehen zus&#228;tzlich Anforderungen im Raum, dass auch ein Schalter zur R&#252;ckkehr zur <em>klassischen Website</em> eingebaut werden soll, oder wenn man feststellt, dass eben Tablet nicht geleich Tablet ist, man also f&#252;r verschiedene Tablets noch kleinere Anpassungen vornehmen muss, dann ist man schnell dabei auf den <em>user agent</em> zu schauen. &lt;interlude&gt;Das vereinfacht &#252;brigens auch gewaltig die Entwicklung der Seite, da man sie w&#228;hrend des Bauens parallel zum iPad/iPad-Simulator auch im Firefox <em>previewen</em> kann. Das geht nat&#252;rlich nur mit <a href="http://chrispederick.com/work/user-agent-switcher/">User Agent Switcher</a>. Dann aber kann man den geliebten Firebug nutzen um wenigestens die Elemente auf der Seite und ihre Styles zu indentifizieren und auch das Scriptdebugging ein wenig zu unterst&#252;tzen. Dinge die es auf dem iPad nicht oder nur sehr rudiment&#228;r gibt.&lt;/interlude&gt;</p>
<p>Diese L&#246;sung ist allerdings noch nicht das Endstadium, allein weil wir nach und nach die Site f&#252;r weitere Tablets fit machen wollen. Im Laufe dieser Zeit werden wir auch das UA-switching wieder entfernen und durch bessere Methoden ersetzen.</p>
<div class="foto"><img src="http://codecandies.de/wp-content/uploads/2010/11/zon-002.jpg" alt="" title="Screenshot ZEIT ONLINE, Navigation, iPad Version, Design: Information Architects" width="620" height="400" class="alignnone size-full wp-image-3345" />
<p>Screenshot ZEIT ONLINE, Navigation, iPad Version, Design: Information Architects</p>
</div>
<h2>Der Spass an der Entwicklung</h2>
<p>Eins muss man gleich sagen: Entwicklung f&#252;r Tablet (speziell das iPad) macht einen Heidenspa&#223;. Zum einen ist die Touchbedienung faszinierend. Ich bin so einer, der ein mouse-over-Men&#252; entwickelt und sich dann stundenlang daran erfreuen kann, wie beim Hovern &#252;ber den Men&#252;punkt das Men&#252; animiert ausf&#228;hrt. Auf dem Tablet kann man solche L&#246;sung praktisch zum Anfassen programmieren (nat&#252;rlich ohne <code>:hover</code>). Ich habe das Men&#252; bestimmt mehrere tausend Mal ausprobiert. Oder die Bildergalerien (obwohl ich da noch nicht zufrieden bin). Die M&#246;glichkeiten des Webkit sind wirklich hervorragend und das geniesst man nat&#252;rlich. Obwohl es auch ein wenig zu verf&#252;hrerisch ist, wenn man in die H&#246;lle der Desktopbrowser zur&#252;ckkehrt und feststellt, dass es da draussen immer noch Internet Explorer gibt… ;)</p>
<h2>Kleinere Schlagl&#246;cher</h2>
<p>Ein paar Dinge waren allerdings echte Kopfn&#252;sse. Da ist zum Beispiel der Viewport-Tag. Schon bei diesem Blog hier habe ich Probleme damit gehabt. &#252;ber diesen einen Tag den Viewport und vor allem die Vergr&#246;&#223;erung so zu setzen, dass es f&#252;r iPad und iPhone gleicherma&#223;en funktioniert. Das Design der iPad-Seite erforderte ganz klar ein:</p>
<pre class="brush: xml; title: ; notranslate">&lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, minimum-scale=1.0, maximum-scale=1.0&quot;&gt;</pre>
<p>Das passt allerdings nicht zu unserer Art, das iPhone zu bedienen. iPhone-Nutzer werden beim Besuch gefragt, ob sie die <a href="http://mobilzeit.de">mobile Website</a> besuchen m&#246;chten, oder die <em>klassische Seite</em>. Mit dem obigen Meta-Tag kann man diese dann aber auf dem iPhone nicht mehr skalieren. F&#252;r das iPhone empfiehlt sich eher:</p>
<pre class="brush: xml; title: ; notranslate">&lt;meta name=&quot;viewport&quot; content=&quot;width=device-width&quot;&gt;</pre>
<p>Will man allerdings (f&#252;r das iPad) zwei Ansichten f&#252;r Portrait- und Landscapemodus pr&#228;sentieren (vs. vergr&#246;&#223;erte Portraitansicht im Landscapemodus), dann ist man auf das <code>minimum-scale=1.0, maximum-scale=1.0</code> festgelegt.</p>
<p>&#220;berraschenderweise kann man aber auch diesen Metatag per Javascript setzen! Es hat allerdings ein wenig gedauert, bis ich das einfach mal ausprobiert habe (h&#252;stel). Au&#223;erdem musste daf&#252;r ganz sch&#246;n an unserer Seitenstruktur geschraubt werden.</p>
<h2>Wie geht&#8217;s weiter?</h2>
<p>Zun&#228;chst mal kommen jetzt schnell weitere Tablets dazu, mit denen man die Seite betrachten kann. Es war leider schnell klar, dass man mit einem Schlag nicht alle Tablets bedienen kann. Mindestens an den Einstellungen des Viewports m&#252;ssen Anpassungen gemacht werden, wahrscheinlich auch etwas CSS und Script. Wobei, wir wollen jetzt auch nicht jedes Tablet das neu auf den Markt kommt kaufen (der Gadgetj&#228;ger in mir fragt nat&#252;rlich: »warum eigentlich nicht«). Man wird sehen, was sich am Tabletmarkt noch tut und was sich durchsetzt. Wir r&#228;umen zun&#228;chst mal dem Galaxy Tab von Samsung gute Chancen ein, und wenn <a href="http://www.zeit.de/digital/mobil/2010-11/rim-playbook-ipad?page=all">RIM mit einem Tablet kommt</a>, wird&#8217;s ja vielleicht auch nochmal interessant.</p>
<p>Abschlie&#223;end sei gesagt, dass die Sache nat&#252;rlich ein gutes St&#252;ck weit vom Design der <a href="http://www.informationarchitects.jp/en/">Information Architects</a> lebt, Oliver Reichenstein hat dazu <a href="http://www.informationarchitects.jp/en/news-on-ipad-the-obvious-way/">einen sch&#246;nen Artikel geschrieben</a>, der auch die – ich nenne es mal so – medienpolitischen Hintergr&#252;nde gut erfasst und viel von dem Geist beschreibt, der hinter dieser Webapp steckt.</p>
<p>Noch ein paar Artikel und Stimmen zum Thema: <a href="http://codecandies.de/2010/11/18/die-ipad-webseite/">iPadMag</a>, <a href="http://www.editorsweblog.org/multimedia/2010/11/die_zeit_launches_ipad-optimized_version.php">Editors Weblog</a>, <a href="http://www.ipadplanet.nl/12555/zeit-online-lanceert-website-geoptimaliseerd-voor-ipad/?awesm=tblt.nl_7pF#utm_content=twitter-publisher-main&#038;utm_medium=tblt.nl-twitter&#038;utm_source=direct-tblt.nl">iPad Planet NL</a>…</p>
]]></content:encoded>
			<wfw:commentRss>http://codecandies.de/2010/11/18/die-ipad-webseite/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title><![CDATA[Verlinkt: Media-Queries und Javascript]]></title>
		<link><![CDATA[http://www.quirksmode.org/blog/archives/2010/08/combining_media.html]]></link>
		<comments>http://codecandies.de/2010/08/05/media-queries-und-javascript/#comments</comments>
		<pubDate>Thu, 05 Aug 2010 21:10:25 +0000</pubDate>
		<dc:creator>Nico Brünjes</dc:creator>
				<category><![CDATA[Bookmarks]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://codecandies.de/?p=3287</guid>
		<description><![CDATA[PPK weist uns v&#246;llig treffend darauf hin, dass media queries allein noch nicht der Weisheit letzter Schlus sind und das…<p><a href="http://codecandies.de/2010/08/05/media-queries-und-javascript/" rel="bookmark" title="Permanent link to 'Media-Queries und Javascript'" class="glyph">→</a></p>
]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.quirksmode.org/blog/archives/2010/08/combining_media.html">PPK weist uns v&#246;llig treffend darauf hin</a>, dass <em>media queries</em> allein noch nicht der Weisheit letzter Schlus sind und das man mit Javascript kombinieren <em>m&#252;ssen wird</em>.</p>
<p><a href="http://codecandies.de/2010/08/05/media-queries-und-javascript/" rel="bookmark" title="Permanent link to 'Media-Queries und Javascript'" class="glyph">→</a></p>
]]></content:encoded>
			<wfw:commentRss>http://codecandies.de/2010/08/05/media-queries-und-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>10k Apart (by Microsoft)</title>
		<link>http://codecandies.de/2010/07/30/10k-apart-by-microsoft/</link>
		<comments>http://codecandies.de/2010/07/30/10k-apart-by-microsoft/#comments</comments>
		<pubDate>Fri, 30 Jul 2010 07:21:55 +0000</pubDate>
		<dc:creator>Nico Brünjes</dc:creator>
				<category><![CDATA[Postings]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[microsoft]]></category>

		<guid isPermaLink="false">http://codecandies.de/?p=3276</guid>
		<description><![CDATA[Hurra, ein Wettbewerb. Es hat sich l&#228;ngst rumgesprochen, unter dem Buzzword HTML5 hat die Entwicklung kleiner Applikationen im Web mit…]]></description>
			<content:encoded><![CDATA[<p>Hurra, <a href="http://10k.aneventapart.com/" title="10K Apart" hreflang="en">ein Wettbewerb</a>.</p>
<p>Es hat sich l&#228;ngst rumgesprochen, unter dem Buzzword <em>HTML5</em> hat die Entwicklung kleiner Applikationen im Web mit standardkonformen HTML, CSS3 und Javascript Einzug in die Welt der Webseiten gehalten. Eines Tages wird man wahrscheinlich doch noch davon sprechen k&#246;nnen, HTML5-Seiten <em>programmiert zu haben</em> (oh-oh!).</p>
<p>Dabei sind die Apps die man jetzt schon kennt oft schwergewichtige Unget&#252;me aus HTML und vor allem Javascript. Das muss nat&#252;rlich nicht so sein. Um all dem Rechnung zu tragen (und ein wenig Werbung zu betreiben) haben <a href="http://visitmix.com/" hreflang="en">MIX</a> (≅ Microsoft) und <a href="http://aneventapart.com/" hreflang="en">An Event Apart</a> einen Wettbewerb ausgerufen: gesucht werden kleine HTML5-Apps, kleiner als <em>10K</em>, wobei die Verwendung von jQuery, Prototype und Typekit als Webservices ausgenommen sind. Laufen sollen die Apps in der IE9 Preview, Firefox und einem Webkit Browser. Na, dann mal los…</p>
]]></content:encoded>
			<wfw:commentRss>http://codecandies.de/2010/07/30/10k-apart-by-microsoft/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Webkongress Erlangen 2010</title>
		<link>http://codecandies.de/2010/07/26/webkongress-erlangen-2010/</link>
		<comments>http://codecandies.de/2010/07/26/webkongress-erlangen-2010/#comments</comments>
		<pubDate>Mon, 26 Jul 2010 14:41:15 +0000</pubDate>
		<dc:creator>Nico Brünjes</dc:creator>
				<category><![CDATA[Postings]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[konferenzen]]></category>
		<category><![CDATA[webdesign]]></category>

		<guid isPermaLink="false">http://codecandies.de/?p=3240</guid>
		<description><![CDATA[Eine mittlere Premiere gibt es f&#252;r den 7. und 8. Oktober in diesem Jahr zu verk&#252;nden. Der Webkongress Erlangen findet…]]></description>
			<content:encoded><![CDATA[<p><a href="http://codecandies.de/wp-content/uploads/2010/07/logo-screen-02-200x64.jpg"><img src="http://codecandies.de/wp-content/uploads/2010/07/logo-screen-02-200x64.jpg" alt="" title="logo-screen-02-200x64" width="200" height="64" class="alignleft size-full wp-image-3243" /></a>Eine mittlere Premiere gibt es f&#252;r den 7. und 8. Oktober in diesem Jahr zu verk&#252;nden. Der <a href="http://www.webkongress.uni-erlangen.de/index.shtml">Webkongress Erlangen</a> findet zu diesem Termin zwar schon zum dritten Mal statt, ich werde dort aber zum erste Male zu h&#246;ren sein. Unter dem Titel »<a href="http://www.webkongress.uni-erlangen.de/vortraege/#WKE2010-54">Relaunching ZEIT ONLINE</a>« werde ich ein wenig &#252;ber den Relaunch von <a href="http://www.zeit.de">zeit.de</a> im September 2009, den Weg dorthin und den Erlebnissen seitdem berichten. Dabei geht es nat&#252;rlich in der Hauptsache um den Fachbereich Frontendentwicklung und -technologie, sowie meine immerwehrenden Freunde: Usabilty und Accessibilty.</p>
<p>Nun kommen nat&#252;rlich wegen mir alleine zu wenig Teilnehmer zu einem Kongress, deswegen sind weitere hochkar&#228;tige Webexperten geladen worden, bspw. <a href="http://grochtdreis.de/"> Jens Grochtdreis</a>, <a href="http://www.perun.net/">Vladimir Simovic</a> und <a href="http://alvar.a-blast.org/">Alvar Freude</a>. &#220;bergeordnetes Thema des Kongresses sind L&#246;sungen f&#252;r barrierefreie Webseiten, soll heissen es geht nicht mehr nur um die Technik und den Prozess, sondern vielmehr um Webangebote, die diese Techniken auch ein- und umsetzen.</p>
<p>Mehr gibt es auf <a href="http://www.webkongress.uni-erlangen.de/index.shtml">der Homepage des WKE 2010</a> nachzulesen. Man sieht sich.</p>
]]></content:encoded>
			<wfw:commentRss>http://codecandies.de/2010/07/26/webkongress-erlangen-2010/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title><![CDATA[Verlinkt: Javascript unpacker and beautifier]]></title>
		<link><![CDATA[http://jsbeautifier.org/]]></link>
		<comments>http://codecandies.de/2010/03/18/javascript-unpacker-and-beautifier/#comments</comments>
		<pubDate>Thu, 18 Mar 2010 08:53:05 +0000</pubDate>
		<dc:creator>Nico Brünjes</dc:creator>
				<category><![CDATA[Bookmarks]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[webservices]]></category>

		<guid isPermaLink="false">http://codecandies.de/?p=2968</guid>
		<description><![CDATA[This little beautifier will reformat and reindent bookmarklets, ugly javascript, unpack scripts packed by the popular Dean Edward&#8217;s packer, as…<p><a href="http://codecandies.de/2010/03/18/javascript-unpacker-and-beautifier/" rel="bookmark" title="Permanent link to 'Javascript unpacker and beautifier'" class="glyph">→</a></p>
]]></description>
			<content:encoded><![CDATA[<p><q>This little beautifier will reformat and reindent bookmarklets, ugly javascript, unpack scripts packed by the popular Dean Edward&#8217;s packer, as well as deobfuscate scripts processed by javascriptobfuscator.com.</q></p>
<p><a href="http://codecandies.de/2010/03/18/javascript-unpacker-and-beautifier/" rel="bookmark" title="Permanent link to 'Javascript unpacker and beautifier'" class="glyph">→</a></p>
]]></content:encoded>
			<wfw:commentRss>http://codecandies.de/2010/03/18/javascript-unpacker-and-beautifier/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JS-Library: Namespace und erste Funktionen</title>
		<link>http://codecandies.de/2010/02/15/js-library-namespace-und-erste-funktionen/</link>
		<comments>http://codecandies.de/2010/02/15/js-library-namespace-und-erste-funktionen/#comments</comments>
		<pubDate>Mon, 15 Feb 2010 15:40:28 +0000</pubDate>
		<dc:creator>Nico Brünjes</dc:creator>
				<category><![CDATA[Postings]]></category>
		<category><![CDATA[CCL]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://codecandies.de/?p=2784</guid>
		<description><![CDATA[Eigentlich habe ich ja schon seit Ewigkeiten vor, mir eine eigene, kleine Javascript-Bibliothek zusammenzustellen, in der ich die immer wiederkehrenden…]]></description>
			<content:encoded><![CDATA[<p>Eigentlich habe ich ja schon seit Ewigkeiten vor, mir eine eigene, kleine Javascript-Bibliothek zusammenzustellen, in der ich die immer wiederkehrenden Funktionen, die man in Javascript so benutzt, zusammengefasst sind. Allerdings: es mangelte bis dato an der n&#246;tigen Ernsthaftigkeit, so etwas tats&#228;chlich umzusetzen. Also dann jetzt: ich werde hier in Zukunft Funktionen etc. zusammentragen und zu meiner kleinen Library zusammenf&#252;gen. Dabei kann der geneigte Leser nat&#252;rlich nicht nur zu schauen, sondern es ist durchaus erw&#252;nscht, mir dabei reichlich auf die Finger zu hauen und Verbesserungen vorzuschlagen.</p>
<p>Zun&#228;chst mal hab ich mir Gedanken um den <em>Namespace</em> meines Projektes gemacht. Heutzutage schreibt man nat&#252;rlich keine Library, deren Funktionen fleissig in das window-Objekt geballert werden. Au&#223;erdem kann man dem Kind dann auch noch einen schlicken Namen geben.</p>
<p>Es gibt mehrere Methoden, einen Namespace zu kreieren, mir gef&#228;llt das <a href="http://www.dustindiaz.com/namespace-your-javascript/" title="Namespacing your JavaScript">Modell von Dustin Diaz</a> am besten, weil man dort die M&#246;glichkeit hat, Methoden und Variablen sowohl <em>public</em>, oder auch <em>private</em> zu machen. Nehmen wir an meine kleine JS-Library solle &#8220;CCL&#8221; heissen (als Abk&#252;rzung f&#252;r <em>Code Candies Library</em>), dann funktioniert der Aufbau des Namespace so:</p>
<pre class="brush: jscript; title: ; notranslate">var CCL = function() {
	var private_var;
	function private_method() {
		// do stuff here
	}
	return {
		method_1 : function() {
			// do stuff here
		},
		method_2 : function() {
			// do stuff here
		}
	};
}();</pre>
<p>OK, also haben wir jetzt einen Namespace, beginnen wir also, erste Funktionen hinzuzuf&#252;gen. Ich fummle gerade viel mit Cookies herum, also nutze ich regelm&#228;&#223;ig drei Funktionen: Cookie anlegen/schreiben, Cookie auslesen und Cookie l&#246;schen. Diese sind deutlich <a href="http://www.quirksmode.org/js/cookies.html">PPKs Cookie-Methoden</a> angelehnt.</p>
<pre class="brush: jscript; title: ; notranslate">var CCL = function() {
	return {
		cookieCreate: function (name,value,days, domain) {
			if (days) {
				var date = new Date();
				date.setTime(date.getTime()+(days*24*60*60*1000));
				var expires = &quot;; expires=&quot;+date.toGMTString();
			}
			else var expires = &quot;&quot;;
			domain = domain ? &quot; domain=&quot; + domain + &quot;;&quot; : &quot;&quot;;
			document.cookie = name+&quot;=&quot;+value+expires+&quot;; path=/;&quot; + domain;
		},
		cookieRead: function (name) {
			var nameEQ = name + &quot;=&quot;;
			var ca = document.cookie.split(';');
			for(var i=0;i &amp;lt; ca.length;i++) {
				var c = ca[i];
				while (c.charAt(0)==' ') c = c.substring(1,c.length);
				if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length,c.length);
			}
			return null;
		},
		cookieErase: function (name) {
			ZEIT.cookieCreate(name,&quot;&quot;,-1);
		}
	}
}();</pre>
<p>Eine Sache ist aber noch bl&#246;d: man m&#246;chte ja nicht wirlich solche Funktionsnamen: &#8220;cookieCreate&#8221;, jetzt ist das ja noch &#252;bersichtlich, aber wenn meine Library anw&#228;chst… da findet man sich schnell nicht mehr zurecht. Sch&#246;ner w&#228;re ein Namespace im Namespace. Und dann sollte man <em>Getter</em> und <em>Setter</em> ja auch  irgendwie als solche kennzeichnen. Das w&#252;rde dann so aussehen:</p>
<pre class="brush: jscript; title: ; notranslate">var CCL = function() {
    return {
        Cookie: {
            get: function (name) {
                var nameEQ = name + &quot;=&quot;;
                var ca = document.cookie.split(';');
                for(var i=0;i &lt; ca.length;i++) {
                    var c = ca[i];
                    while (c.charAt(0)==' ') c = c.substring(1,c.length);
                    if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length,c.length);
                }
                return null;
            },
            set: function (name, value, days, domain) {
                if (days) {
                    var date = new Date();
                    date.setTime(date.getTime()+(days*24*60*60*1000));
                    var expires = &quot;; expires=&quot;+date.toGMTString();
                }
                else var expires = &quot;&quot;;
                domain = domain ? &quot; domain=&quot; + domain + &quot;;&quot; : &quot;&quot;;
                document.cookie = name+&quot;=&quot;+value+expires+&quot;; path=/;&quot; + domain;
            },
            kill: function (name) {
                this.set(name,&quot;&quot;,-1);
            } // last item: no comma!
        }
    };
}();</pre>
<p>Hmmm… das bringt ja richtig Spass. Nun kann man sch&#246;n &#8220;draussen&#8221; die Funktionen nutzen. Ruft man ganz leicht auf:</p>
<pre class="brush: jscript; light: true; title: ; notranslate">CCL.Cookie.set('testcookie', 'test', 5); // ommitting domain results in the page domain</pre>
<p>Kann man <a href="http://projektkrematorium.de/codecandies/ccl/version1.html">auf der Demoseite</a> ausprobieren.</p>
]]></content:encoded>
			<wfw:commentRss>http://codecandies.de/2010/02/15/js-library-namespace-und-erste-funktionen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title><![CDATA[Verlinkt: ie-css3.js]]></title>
		<link><![CDATA[http://www.keithclark.co.uk/labs/ie-css3/]]></link>
		<comments>http://codecandies.de/2010/01/21/ie-css3-js/#comments</comments>
		<pubDate>Thu, 21 Jan 2010 19:50:12 +0000</pubDate>
		<dc:creator>Nico Brünjes</dc:creator>
				<category><![CDATA[Bookmarks]]></category>
		<category><![CDATA[browser]]></category>
		<category><![CDATA[ie]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://codecandies.de/?p=2717</guid>
		<description><![CDATA[ie-css3.js allows Internet Explorer to identify CSS3 pseudo selectors and render any style rules defined with them. Ich will das…<p><a href="http://codecandies.de/2010/01/21/ie-css3-js/" rel="bookmark" title="Permanent link to 'ie-css3.js'" class="glyph">→</a></p>
]]></description>
			<content:encoded><![CDATA[<p><q>ie-css3.js allows Internet Explorer to identify CSS3 pseudo selectors and render any style rules defined with them.</q> Ich will das nicht!!1!</p>
<p><a href="http://codecandies.de/2010/01/21/ie-css3-js/" rel="bookmark" title="Permanent link to 'ie-css3.js'" class="glyph">→</a></p>
]]></content:encoded>
			<wfw:commentRss>http://codecandies.de/2010/01/21/ie-css3-js/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Chroma Hash</title>
		<link>http://codecandies.de/2009/07/30/chroma-hash/</link>
		<comments>http://codecandies.de/2009/07/30/chroma-hash/#comments</comments>
		<pubDate>Thu, 30 Jul 2009 07:37:20 +0000</pubDate>
		<dc:creator>Nico Brünjes</dc:creator>
				<category><![CDATA[Postings]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://codecandies.de/2009/07/30/chroma-hash/</guid>
		<description><![CDATA[In bin mir ja bewusst, dass es strunzlangweilig ist, wenn ich w&#246;chentlich hier einen Link auf ein jQuery-Plugin setze und…]]></description>
			<content:encoded><![CDATA[<p>In bin mir ja bewusst, dass es strunzlangweilig ist, wenn ich w&#246;chentlich hier einen Link auf ein jQuery-Plugin setze und dabei regelm&#228;&#223;ig betonen muss, wie knarzgeil jQuery ist, was f&#252;r wundervolle Programmierideen damit schon verwirklicht wurden und: dass es immer noch besser wird.</p>
<p>Trotzdem. <a href="http://mattt.github.com/Chroma-Hash/">Chroma Hash</a> (via <a href="http://ajaxian.com/archives/chroma-hash-interesting-visualization-of-your-password">Ajaxian</a>) ist wieder so eine Programmier- <em>slash</em> Designidee, da muss man einfach frohlocken. Los geht&#8217;s. Folgende Problemstellung: beim Registrieren f&#252;r eine Website muss der User zweimal sein gew&#252;nschtes Passwort eingeben, wie &#252;blich verdeckt durch Sternchen/Bullets. Vertippt man sich, muss man nach dem Abschicken des Formulars nochmal beide Passw&#246;rter eingeben. Und so fort. Chroma Hash macht aus den Eingaben einen MD5-Hash (der sich nicht zur&#252;ckrechnen l&#228;sst) und daraus widerum kleine Farbbalken. Womit man sofort visuell erfassen kann (im Grunde schon beim Tippen), ob man in beide Felder das gleiche eingetragen hat.</p>
<p>Ja, das ist ein relatives kleines Usability-Gimmick, aber ein wirklich nettes. Einfach mal ausprobieren.</p>
]]></content:encoded>
			<wfw:commentRss>http://codecandies.de/2009/07/30/chroma-hash/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title><![CDATA[Verlinkt: JSON-P Memory Leak]]></title>
		<link><![CDATA[http://neil.fraser.name/news/2009/07/27/]]></link>
		<comments>http://codecandies.de/2009/07/29/json-p-memory-leak/#comments</comments>
		<pubDate>Wed, 29 Jul 2009 04:48:39 +0000</pubDate>
		<dc:creator>Nico Brünjes</dc:creator>
				<category><![CDATA[Bookmarks]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://codecandies.de/?p=2229</guid>
		<description><![CDATA[Mit der JSON-P-Methode sehr viele Script-Tags zu einem Dokument hinzuzuf&#252;gen, kann in ein mittelschweres Speicherproblem f&#252;hren… →<p><a href="http://codecandies.de/2009/07/29/json-p-memory-leak/" rel="bookmark" title="Permanent link to 'JSON-P Memory Leak'" class="glyph">→</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Mit der JSON-P-Methode sehr viele Script-Tags zu einem Dokument hinzuzuf&#252;gen, kann in ein mittelschweres Speicherproblem f&#252;hren…</p>
<p><a href="http://codecandies.de/2009/07/29/json-p-memory-leak/" rel="bookmark" title="Permanent link to 'JSON-P Memory Leak'" class="glyph">→</a></p>
]]></content:encoded>
			<wfw:commentRss>http://codecandies.de/2009/07/29/json-p-memory-leak/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title><![CDATA[Verlinkt: JSON Formatter]]></title>
		<link><![CDATA[http://jsonformatter.curiousconcept.com/]]></link>
		<comments>http://codecandies.de/2009/07/28/json-formatter/#comments</comments>
		<pubDate>Tue, 28 Jul 2009 20:00:59 +0000</pubDate>
		<dc:creator>Nico Brünjes</dc:creator>
				<category><![CDATA[Bookmarks]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://codecandies.de/?p=2227</guid>
		<description><![CDATA[The JSON Formatter was created to help with debugging. As data expressed as JSON is often written without line breaks…<p><a href="http://codecandies.de/2009/07/28/json-formatter/" rel="bookmark" title="Permanent link to 'JSON Formatter'" class="glyph">→</a></p>
]]></description>
			<content:encoded><![CDATA[<p><q>The JSON Formatter was created to help with debugging. As data expressed as JSON is often written without line breaks to save space, it became extremely difficult to actually read it. This tool hopes to solve the problem by formatting the JSON into data that is easily readable by human beings.</q></p>
<p><a href="http://codecandies.de/2009/07/28/json-formatter/" rel="bookmark" title="Permanent link to 'JSON Formatter'" class="glyph">→</a></p>
]]></content:encoded>
			<wfw:commentRss>http://codecandies.de/2009/07/28/json-formatter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

