<?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>Netsetters weblog &#187; JavaScript</title>
	<atom:link href="http://www.netsetters.nl/tag/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.netsetters.nl</link>
	<description>Programming, User Experience and IA</description>
	<lastBuildDate>Sat, 07 Aug 2010 12:56:33 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>HTML 5: databaseStorage</title>
		<link>http://www.netsetters.nl/2010/05/html-5-databasestorage/</link>
		<comments>http://www.netsetters.nl/2010/05/html-5-databasestorage/#comments</comments>
		<pubDate>Mon, 17 May 2010 22:02:08 +0000</pubDate>
		<dc:creator>Maurice Lourens</dc:creator>
				<category><![CDATA[data]]></category>
		<category><![CDATA[logic]]></category>
		<category><![CDATA[trends]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Internet Explorer]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Mozilla Firefox]]></category>
		<category><![CDATA[Opera]]></category>
		<category><![CDATA[SQLite]]></category>
		<category><![CDATA[WebKit]]></category>

		<guid isPermaLink="false">http://www.netsetters.nl/?p=313</guid>
		<description><![CDATA[Nu we toch lekker bezig zijn met HTML 5, wil ik in mijn derde artikel ingaan op de locale databaseStorage mogelijkheden. Deze methode kan complexere data opslaan en verweken aan de gebruikerskant.  Het is in principe een SQLite implementatie binnen de browser van de client. Omdat deze manier van opslag nog in draft is kan er nog veel gebeuren, daarom behandel ik de globale basis zoals hij nu bekend is.]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.netsetters.nl%2F2010%2F05%2Fhtml-5-databasestorage%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.netsetters.nl%2F2010%2F05%2Fhtml-5-databasestorage%2F&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<div class="zemanta-img" style="margin: 1em; display: block;">
<div>
<dl class="wp-caption alignright" style="width: 239px;">
<dt class="wp-caption-dt"><a href="http://www.flickr.com/photos/36983395@N00/513636061"><img title="HTML5 fist, after A List Apart" src="http://farm1.static.flickr.com/191/513636061_98d07f7966_m.jpg" alt="HTML5 fist, after A List Apart" /></a></dt>
<dd class="wp-caption-dd zemanta-img-attribution" style="font-size: 0.8em;">Image by <a href="http://www.flickr.com/photos/36983395@N00/513636061">justinsomnia</a> via Flickr</dd>
</dl>
</div>
</div>
<p>Nu we toch lekker bezig zijn met HTML 5, wil ik in mijn derde artikel ingaan op de locale databaseStorage mogelijkheden. Deze methode kan complexere data opslaan en verweken aan de gebruikerskant.  Het is in principe een <a class="zem_slink" title="SQLite" rel="homepage" href="http://sqlite.org/">SQLite</a> implementatie binnen de browser van de client. Omdat deze manier van opslag nog in draft is kan er nog veel gebeuren, daarom behandel ik de globale basis zoals hij nu bekend is.<br />
<span id="more-313"></span><br />
<h2>Andere HTML5 artikelen</h2>
<p>Heb je ze nog niet gelezen? dan raad ik je aan de twee eerdere artikelen over het <a title="netsetters html5 canvas element" href="http://www.netsetters.nl/2010/05/html5-het-canvas-element/" target="_self">canvas element</a> en  <a title="netsetters html5 local storage" href="http://www.netsetters.nl/2010/05/html5-offline-opslag-met-local-storage/" target="_self">local storage</a> te lezen op Netsetters blog.</p>
<h2>databaseStorage compatible browsers</h2>
<p>Op dit moment kunnen maar een beperkt aantal browsers met de locale database storage overweg. Google&#8217;s Chrome (&gt;3), Safari (&gt; 3.2), Opera (&gt;10.5). Bij de release van Firefox 4 in November zal ook de ondersteuning voor locale database toegang meekrijgen. En als we heel veel geluk hebben zou er een kleine kans bestaan dat de functionaliteit later aan versie 9 van Internet Explorer wordt toegevoegd.</p>
<h2>Niet compatible, waarom toch gebruiken?</h2>
<p>Het is nou eenmaal zo dat &#8216;maar&#8217; de helft van de browser deze manier van opslag ondersteund, net als met vele andere HTML5 specifieke eigenschappen. Ondanks deze magere ondersteuning kan er nu al winst worden gehaald uit de techniek. Op de Iphone en Android telefoons zijn deze technieken namelijk al geheel beschikbaar gezien deze met <a class="zem_slink" title="WebKit" rel="wikipedia" href="http://en.wikipedia.org/wiki/WebKit">Webkit</a> browsers werken (safari en chrome). De tweede reden is dat de nu inspringen de kennis straks vergroot, ook zal het gebruik van de techniek door ontwikkelaars de ondersteuning van HTML5 hoger op de prioriteitenlijst bij de browser-ontwikkelaars komen te staan. want als de consument echt eerlijk mocht kiezen tussen verschillende gratis browsers, dan gebruik je toch een browser die de nieuwe technieken ondersteund? Ook kan de combinatie van oude en nieuwe techniek al een voordeel hebben.</p>
<h2>De eerste stap van databaseStorage, een database aanmaken</h2>
<p>Met openDatabase() kunnen we een database openen of creëren. Deze JavaScript functie neemt 4 argumenten aan.</p>
<ul>
<li>De database naam</li>
<li>De database versie</li>
<li>De leesbare naam van de database</li>
<li>De grote van de database in bytes (ongeveer)</li>
</ul>
<p>Om een database te creëren en browsers die het niet kunnen af te vangen kunnen we de volgende code gebruiken:</p>
<pre class="brush: jscript;">
var db;
try {
    if (window.openDatabase) {
        db = openDatabase(&quot;DatabaseTest&quot;, &quot;1.0&quot;, &quot;HTML5 Database voorbeeld&quot;, 200000);
        if (!db)
            alert(&quot;Kan database niet openen: verkeerde versie of over het limiet heen&quot;);
    } else
        alert(&quot;Kan database niet aanmaken, uw browser ondersteund geen databaseStorage&quot;);
} catch(err) { }
</pre>
<h2>Query uitvoeren op locale database</h2>
<p>Om een query uit te voeren gebruiken we de transaction() methode, deze heeft 1 t/m 3 argumenten, namelijk:</p>
<ol>
<li>transaction callback</li>
<li>error callback</li>
<li>success callback</li>
</ol>
<p>De transactie bestaat uit een anonieme functie met executeSQL() methode. Deze heeft tot 4 argumenten, namelijk:</p>
<ol>
<li>SQL statement</li>
<li>Argumenten</li>
<li>SQL callback</li>
<li>Error Callback</li>
</ol>
<p>Schematisch gebeurd er dus het volgende:</p>
<pre class="brush: jscript;">
db.transaction(function(tx)
  {
    tx.executeSql('SELECT * FROM MyTable WHERE CategoryField = ?',
      [ selectedCategory ],
      function (tx, rs) { displayMyResult(rs); },
      function (tx, err) { displayMyError(err); } );
  });
</pre>
<p>Waar displayMyResult en displayMyError de succes en error functies zijn.</p>
<h2>Voorbeelden, een tabel aanmaken</h2>
<pre class="brush: jscript;">
db.transaction(function (tx)
        {
             tx.executeSql(&quot;CREATE TABLE WebKitStickyNotes (id REAL UNIQUE, note TEXT, timestamp REAL, left TEXT, top TEXT, zindex REAL)&quot;, [], function(result) {loadNotes();
})
});
</pre>
<h2>Een rij toevoegen</h2>
<pre class="brush: jscript;">
db.transaction(function (tx)
        {
            tx.executeSql(&quot;INSERT INTO Adressen (id, naam, adres, woonplaats) VALUES (?, ?, ?, ?)&quot;, [id, naam, adres, woonplaats]);
      });
</pre>
<h2>Een rij verwijderen</h2>
<p>De meest korte uitvoering, zonder error en succes handlers</p>
<pre class="brush: jscript;">
 db.transaction(function(tx)
        {
            tx.executeSql(&quot;DELETE FROM WebKitStickyNotes WHERE id = ?&quot;, [note.id]);
        });
</pre>
<h2>Een select uitvoeren</h2>
<p>Een select maken uit tabelnaam MyTable waar de categorie gelijk is aan selectedCategory</p>
<pre class="brush: jscript;">
db.transaction(function(tx)
  {
    tx.executeSql('SELECT * FROM MyTable WHERE CategoryField = ?',
      [ selectedCategory ],
      function (tx, rs) { displayMyResult(rs); },
      function (tx, err) { displayMyError(err); } );
  });
</pre>
<h2>Meer lezen</h2>
<p>Meer kan je vinden op de pagina van het W3C met de <a title="W3C offline web applications note" href="http://www.w3.org/TR/offline-webapps/" target="_blank">offline web applicaties notitie</a>.<br />
Ook een goede aanvullende uitleg is te vinden op de website van <a title="html5 local storage" href="http://creativepark.net/blog/entry/id/1191" target="_blank">creativepark</a></p>
<h6 class="zemanta-related-title" style="font-size: 1em;">Related articles by Zemanta</h6>
<ul class="zemanta-article-ul">
<li class="zemanta-article-ul-li"><a href="http://www.slideshare.net/bitlasoft/how-to-build-a-html5-websitesv1">How to build a html5 websites.v1</a> (slideshare.net)</li>
<li class="zemanta-article-ul-li"><a href="http://sixrevisions.com/web-development/five-things-ie9-is-actually-doing-right/">Five Things IE9 is (Actually) Doing Right</a> (sixrevisions.com)</li>
<li class="zemanta-article-ul-li"><a href="http://r.zemanta.com/?u=http%3A//www.infoworld.com/t/internet/google-official-reaffirms-html5-readiness-444%3Fsource%3Drss_infoworld_news&amp;a=17389746&amp;rid=9c89531e-b77e-468d-aa3c-31046f7f1056&amp;e=fc3ab1f2fffc1f0455c7e3ced364283c">Google official reaffirms HTML5 readiness</a> (infoworld.com)</li>
<li class="zemanta-article-ul-li"><a href="http://rethink.unspace.ca/2010/5/10/the-state-of-html5-local-data-storage">The State of HTML5 Local Data Storage</a> (rethink.unspace.ca)</li>
</ul>
<div class="zemanta-pixie" style="margin-top: 10px; height: 15px;"><a class="zemanta-pixie-a" title="Reblog this post [with Zemanta]" href="http://reblog.zemanta.com/zemified/9c89531e-b77e-468d-aa3c-31046f7f1056/"><img class="zemanta-pixie-img" style="border: none; float: right;" src="http://img.zemanta.com/reblog_e.png?x-id=9c89531e-b77e-468d-aa3c-31046f7f1056" alt="Reblog this post [with Zemanta]" /></a><span class="zem-script more-related pretty-attribution"><script src="http://static.zemanta.com/readside/loader.js" type="text/javascript"></script></span></div>
<img src="http://www.netsetters.nl/?ak_action=api_record_view&id=313&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.netsetters.nl/2010/05/html-5-databasestorage/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>HTML5: Offline opslag met local storage</title>
		<link>http://www.netsetters.nl/2010/05/html5-offline-opslag-met-local-storage/</link>
		<comments>http://www.netsetters.nl/2010/05/html5-offline-opslag-met-local-storage/#comments</comments>
		<pubDate>Fri, 14 May 2010 19:43:22 +0000</pubDate>
		<dc:creator>Maurice Lourens</dc:creator>
				<category><![CDATA[data]]></category>
		<category><![CDATA[trends]]></category>
		<category><![CDATA[Cascading Style Sheets]]></category>
		<category><![CDATA[Data Formats]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Internet Explorer]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Markup Languages]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://www.netsetters.nl/?p=307</guid>
		<description><![CDATA[Dit is het tweede artikel over HTML5. HTML5 heeft verschillende methoden om lokaal en offline elementen op te slaan. De meest simpele is localStorage. Hiermee kunnen simpele "sleutel"-"waarde" Paren worden opgeslagen zonder database, zonder plugins, zonder server.]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.netsetters.nl%2F2010%2F05%2Fhtml5-offline-opslag-met-local-storage%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.netsetters.nl%2F2010%2F05%2Fhtml5-offline-opslag-met-local-storage%2F&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<div class="zemanta-img" style="margin: 1em; display: block;">
<div>
<dl class="wp-caption alignright" style="width: 250px;">
<dt class="wp-caption-dt"><a href="http://www.flickr.com/photos/45745303@N00/4293394187"><img title="HTML5" src="http://farm3.static.flickr.com/2488/4293394187_c0793b58b0_m.jpg" alt="HTML5" width="240" height="185" /></a></dt>
<dd class="wp-caption-dd zemanta-img-attribution" style="font-size: 0.8em;">Image by <a href="http://www.flickr.com/photos/45745303@N00/4293394187">bioxid</a> via Flickr</dd>
</dl>
</div>
</div>
<p>Dit is het tweede artikel over HTML5. HTML5 heeft verschillende methoden om lokaal en offline elementen op te slaan. De meest simpele is localStorage. Hiermee kunnen simpele &#8220;sleutel&#8221;-&#8221;waarde&#8221; Paren worden opgeslagen zonder database, zonder plugins, zonder server.<span id="more-307"></span></p>
<h2>We kunnen niet altijd online zijn</h2>
<p>We kunnen al een groot deel van de dag continue online zijn. Door draadloze verbindingen als wifi,(3)G, UMTS etc kunnen we ten alle tijden met verschillende apparaten gebruik maken van het internet. Hierdoor wordt het aantrekkelijk om web-applicaties te gebruiken. Deze hoeven niet op een apparaat geïnstalleerd te worden en hebben alleen een browser nodig.  Toch kunnen we niet altijd aaneengesloten online zijn, dit was het grote struikelblok voor webapplicaties. In HTML5 zijn verschillende technieken beschikbaar om lokaal (tijdelijk) data op te slaan wanneer de verbinding er even niet is namelijk: <strong>sessionStorage</strong>, <strong>databaseStorage</strong> en <strong>localStorage</strong></p>
<h2>localStorage de simpele opslag</h2>
<p>Als je alleen één of meerdere waarden op wilt slaan is de localStorage methode voldoende. Hiermee kan er binnen een website een sleutel met waarde worden opgeslagen. Zolang de gebruiker op de website is, is deze informatie beschikbaar. Ook als de gebruiker later terugkomt op dezelfde site zal de informatie beschikbaar zijn. Een goede methode om instellingen op te slaan. een voorbeeld is bijvoorbeeld het wegschrijven van iemands gepersonaliseerde instellingen zoals kleur, de gebruikte lettergrote of naam.</p>
<h2>Waarde wegschrijven</h2>
<p>Een waarde wegschrijven in localStorage is eenvoudig, <a title="caniuse browser vergelijking" href="http://caniuse.com/#agents=All&amp;eras=past,now,near,far&amp;cats=Other&amp;statuses=rec,pr,cr,wd" target="_blank">mits je browser localStorage ondersteund</a>. Met 1 regel code binnen JavaScript staat er een waarde opgeslagen:</p>
<pre class="brush: xml;">localStorage.setItem(&quot;lettergrootte&quot;, &quot;12px&quot;);</pre>
<p>Op deze manier wordt er in de lokale opslag een waarde van 12px aan de sleutel &#8220;lettergrootte&#8221; gegeven. Dit moet natuurlijk wel binnen <script type="text/javascript"></script></p>
<h2>LocalStorage elementen ophalen.</h2>
<p>Ook het ophalen van een waarde om deze verder te gebruiken is te doen met 1 regel code.</p>
<pre class="brush: xml;">
var lettergrootte = localStorage.getItem(&quot;lettergrootte&quot;);
document.body.fontSize = lettergrootte;
</pre>
<p>Zo wijs je de variable lettergrootte in JavaScript de gezette 12px toe. Dit kan dan bijvoorbeeld zoals hierboven gebruikt worden om de lettergrootte van een pagina te zetten naar de wensen die eerder zijn ingevuld.</p>
<h2>Waarden verwijderen</h2>
<p>Natuurlijk kunnen er ook waarden uit de localStorage worden verwijderd.</p>
<pre class="brush: xml;">localStorage.remove('lettergrootte');</pre>
<p>om de sleutel en waarde van &#8220;lettergrootte te verwijderen. OM alle waarden van de website te verwijderen kan er gebruik gemaakt worden van;</p>
<pre class="brush: xml;">localStorage.clear();</pre>
<h2>Een volledig voorbeeld</h2>
<p><a title="localstorage example html5" href="http://people.w3.org/mike/localstorage.html" target="_blank"> Hier vind je een voorbeeld </a>waarbij waarden gezet, opgehaald en verwijderd kunnen worden. Als je naar de code kijkt zie je al snel dat de functies eenvoudig en begrijpelijk zijn;</p>
<pre class="brush: xml;">
 &lt;script&gt; 

     function doSetItem() {
       var name = document.forms.editor.name.value;
       var data = document.forms.editor.data.value;
       localStorage.setItem(name, data);
       doShowAll();
     }

     function doGetItem() {
       var name = document.forms.editor.name.value;
       document.forms.editor.data.value = localStorage.getItem(name);
       doShowAll();
     }

     function doRemoveItem() {
       var name = document.forms.editor.name.value;
       document.forms.editor.data.value = localStorage.removeItem(name);
       doShowAll();
     }

     function doClear() {
       localStorage.clear();
       doShowAll();
     }

     function doShowAll() {
       var key = &quot;&quot;;
       var pairs = &quot;&lt;tr&gt;&lt;th&gt;Name&lt;/th&gt;&lt;th&gt;Value&lt;/th&gt;&lt;/tr&gt;\n&quot;;
       var i=0;
       for (i=0; i&lt;=localStorage.length-1; i++) {
         key = localStorage.key(i);
         pairs += &quot;&lt;tr&gt;&lt;td&gt;&quot;+key+&quot;&lt;/td&gt;&lt;td&gt;&quot;+localStorage.getItem(key)+&quot;&lt;/td&gt;&lt;/tr&gt;\n&quot;;
       }
       if (pairs == &quot;&lt;tr&gt;&lt;th&gt;Name&lt;/th&gt;&lt;th&gt;Value&lt;/th&gt;&lt;/tr&gt;\n&quot;) {
         pairs += &quot;&lt;tr&gt;&lt;td&gt;&lt;i&gt;empty&lt;/i&gt;&lt;/td&gt;&lt;td&gt;&lt;i&gt;empty&lt;/i&gt;&lt;/td&gt;&lt;/tr&gt;\n&quot;;
       }
       document.getElementById('pairs').&lt;a class=&quot;zem_slink&quot; href=&quot;http://en.wikipedia.org/wiki/Internet_Explorer&quot; title=&quot;Internet Explorer&quot; rel=&quot;wikipedia&quot;&gt;innerHTML&lt;/a&gt; = pairs;
     }
   &lt;/script&gt;
</pre>
<div class="zemanta-pixie" style="margin-top: 10px; height: 15px;"><a class="zemanta-pixie-a" title="Reblog this post [with Zemanta]" href="http://reblog.zemanta.com/zemified/7448eb78-b1ac-4f5b-81c0-9e281e315cbd/"><img class="zemanta-pixie-img" style="border: none; float: right;" src="http://img.zemanta.com/reblog_e.png?x-id=7448eb78-b1ac-4f5b-81c0-9e281e315cbd" alt="Reblog this post [with Zemanta]" /></a><span class="zem-script more-related pretty-attribution"><script src="http://static.zemanta.com/readside/loader.js" type="text/javascript"></script></span></div>
<img src="http://www.netsetters.nl/?ak_action=api_record_view&id=307&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.netsetters.nl/2010/05/html5-offline-opslag-met-local-storage/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>HTML5: het Canvas element</title>
		<link>http://www.netsetters.nl/2010/05/html5-het-canvas-element/</link>
		<comments>http://www.netsetters.nl/2010/05/html5-het-canvas-element/#comments</comments>
		<pubDate>Thu, 13 May 2010 20:49:02 +0000</pubDate>
		<dc:creator>Maurice Lourens</dc:creator>
				<category><![CDATA[logic]]></category>
		<category><![CDATA[trends]]></category>
		<category><![CDATA[Canvas element]]></category>
		<category><![CDATA[Data Formats]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Safari]]></category>
		<category><![CDATA[Website]]></category>

		<guid isPermaLink="false">http://www.netsetters.nl/?p=274</guid>
		<description><![CDATA[Hoewel het allemaal nog ver weg lijkt heeft al een groot deel van de internet gebruikers de mogelijkheid tot het bekijken van websites in HTML5 en CSS3. Samen met JavaScript kunnen enorm veel toepassingen bedacht worden zonder dat er meer nodig is dan een browser. Vandaag beschrijf ik het Canvas element]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.netsetters.nl%2F2010%2F05%2Fhtml5-het-canvas-element%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.netsetters.nl%2F2010%2F05%2Fhtml5-het-canvas-element%2F&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<div class="zemanta-img" style="margin: 1em; display: block;">
<div>
<dl class="wp-caption alignright" style="width: 250px;">
<dt class="wp-caption-dt"><a href="http://www.flickr.com/photos/86127290@N00/4420925550"><img title="Sketching in HTML5" src="http://farm3.static.flickr.com/2751/4420925550_1b6f28f499_m.jpg" alt="Sketching in HTML5" width="240" height="159" /></a></dt>
<dd class="wp-caption-dd zemanta-img-attribution" style="font-size: 0.8em;">Image by <a href="http://www.flickr.com/photos/86127290@N00/4420925550">birdsigh</a> via Flickr</dd>
</dl>
</div>
</div>
<p>Hoewel het allemaal nog ver weg lijkt heeft al een groot deel van de internet gebruikers de mogelijkheid tot het bekijken van websites in <a class="zem_slink" title="HTML5" rel="wikipedia" href="http://en.wikipedia.org/wiki/HTML5">HTML5</a> en CSS3.  Samen met JavaScript kunnen enorm veel toepassingen bedacht worden zonder dat er meer nodig is dan een browser. Vandaag beschrijf ik het Canvas element<span id="more-274"></span></p>
<h2>Wat kan ik met de &lt;canvas&gt;?</h2>
<ul>
<li>Tekenen</li>
<li>Animeren</li>
<li>foto bewerking, positionering</li>
<li>interactie met beeld (i.c.m. javascript)</li>
</ul>
<h2>Welke browsers zijn compatibel met &lt;canvas&gt;?</h2>
<p>De meeste moderne browsers ondersteunen al de algemene canvas onderdelen, 3dcanvas is voor de meeste nog een stapje te ver, maar dit zal eind 2010 door de meeste browser worden ondersteund. Een complete lijst is te vinden op <a title="caniuse.com" href="http://caniuse.com/#agents=All&amp;eras=past,now,near,far&amp;cats=Canvas&amp;statuses=rec,pr,cr,wd,ietf" target="_blank">canoiuse.com browser vergelijking</a>. Er is dus geen reden om nu al niet te beginnen met HTLM5 en canvas.</p>
<h2>Beginnen met canvas, wat heb ik nodig.</h2>
<p>Om nu te experimenteren met canvas heb je niet veel nodig, een compatible browser (zie hierboven) en een text programma als Notepad voldoet al. Je hebt geen servers nodig omdat het lokaal draait en je hoeft niets te uploaden, plugins te installeren of software te kopen. Een gezonde kennis van (X)HTML is wel vereist.</p>
<h2>De &lt;canvas&gt; tag, beginnen</h2>
<p>De canvas tag &#8220;reserveert&#8221; een stuk in je html pagina om in te kunnen tekenen. IN onderstaand geval is deze 150 bij 150 px breed.</p>
<pre class="brush: xml;">&lt;canvas id=&quot;mijnCanvas&quot; width=&quot;150&quot; height=&quot;150&quot;&gt;&lt;/canvas&gt; </pre>
<p>Door een waarde tussen de open en sluit-tag te geven, laten we de gebruiker iets zien als deze een browser heeft die canvas niet ondersteund.</p>
<pre class="brush: xml;">
&lt;canvas id=&quot;mijnCanvas&quot; width=&quot;150&quot; height=&quot;150&quot;&gt;
 Uw browser ondersteund geen canvas
&lt;/canvas&gt;
</pre>
<h2>Interactie met het canvas door middel van <a class="zem_slink" title="JavaScript" rel="wikipedia" href="http://en.wikipedia.org/wiki/JavaScript">JavaScript</a></h2>
<p>Nu kunnen we gaan tekenen op het canvas. Eerst moeten we in JavaScript het canvas aanspreken en in een variabele stoppen. Daarna geven we aan dat het gaat om een 2d canvas. De JavaScript kunnen we als functie uitvoeren op het moment dat de body, en dus ook het <a class="zem_slink" title="Canvas element" rel="wikipedia" href="http://en.wikipedia.org/wiki/Canvas_element">canvas element</a>, geladen is.</p>
<pre class="brush: xml;">
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Canvas tutorial&lt;/title&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
function draw(){
var canvas = document.getElementById('mijnCanvas');
var ctx = canvas.getContext('2d');
}
&lt;/script&gt;
&lt;/head&gt;
&lt;body onload=&quot;draw();&quot;&gt;
&lt;canvas id=&quot;mijnCanvas&quot; width=&quot;150&quot; height=&quot;150&quot;&gt;
Uw browser ondersteund geen Canvas.
&lt;/canvas&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<h2>Rechthoeken tekenen</h2>
<p>Binnen JavaScript zijn er veel mogelijkheden om te tekenen binnen het canvas. Hieronder een voorbeeld dat gebruik maakt van:</p>
<ul>
<li><strong>fillstyle</strong>: deze geeft de inkleur instellingen mee, bijvoorbeeld de vulkleur in <a class="zem_slink" title="RGB color model" rel="wikipedia" href="http://en.wikipedia.org/wiki/RGB_color_model">RGB</a> plus de opacity  bijv. <em>ctx.fillStyle = &#8221;rgba(255,0,0,0.5)&#8221;; </em>Voor een rode half-doorzichtige vulstijl.<em><br />
</em></li>
<li><strong>fillrectangle</strong>: Dit maakt een rechthoek en vult deze met de huidige vulstijl. Meegegeven worden de coördinaten van startpunt (x,y) en de lengt in x en lengte in y, bijvoorbeeld <em>ctx.fillRect (30, 30, 50, 50);</em> voor een rechthoek die op 30 <a class="zem_slink" title="Pixel" rel="wikipedia" href="http://en.wikipedia.org/wiki/Pixel">pixels</a> van boven, 30 pixels van links begint en dan 5o pixels naar rechts en 50 pixels omlaag gaat.</li>
</ul>
<pre class="brush: xml;">
&lt;html&gt;
&lt;head&gt;
&lt;script type=&quot;application/javascript&quot;&gt;
function draw() {
var canvas = document.getElementById(&quot;canvas&quot;);
var ctx = canvas.getContext(&quot;2d&quot;);
ctx.fillStyle = &quot;rgba(200,0,0,0.5)&quot;;
ctx.fillRect (30, 30, 50, 50);
}
&lt;/script&gt;
&lt;/head&gt;
&lt;body onload=&quot;draw();&quot;&gt;
&lt;canvas id=&quot;canvas&quot; width=&quot;150&quot; height=&quot;150&quot;&gt;
Uw browser ondersteund geen canvas
&lt;/canvas&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<h2>Klaar voor het echte werk, tekenen op je canvas</h2>
<p>Zodra je deze basis onder de knie hebt kan je proberen meerdere vakken te maken om het grid te leren kennen. Daarna is het tijd om los te gaan tekenen. Door gebruik te maken van lijnen, line-stijlen, vul-stijlen etc kan iedere denkbare tekening gemaakt worden.  Omdat het in JavaScript wordt gegenereerd kan dit dus ook volledig dynamisch. Een mooie uitleg over de verschillende tekenvormen is te vinden op de <a title="Canvas, drawing shapes" href="https://developer.mozilla.org/en/Canvas_tutorial%3aDrawing_shapes" target="_blank">canvas tutorial van Mozilla</a>.</p>
<p>Een mooi voorbeeld vind ik de site van <a href="http://cartagen.org/">Cartagen</a>, die gebruikt de xml data van Openstreetmap om een gehele kaart in canvas te tekenen. Wegens het intensieve gebruik van canvas raad ik je aan deze site te openen met Chrome of <a class="zem_slink" title="Safari" rel="homepage" href="http://www.apple.com/safari">Safari</a>.</p>
<h2>Beeld manipulatie</h2>
<p>Ook afbeeldingen kunnen gemanipuleerd worden in de browser met canvas. Uitsneden maken, inzoomen, kleuren, etc. Lees er meer over op de website van <a title="canvas beeld manipulatie" href="https://developer.mozilla.org/en/Canvas_tutorial%3aUsing_images" target="_blank">Mozilla</a>.</p>
<h2>Andere voorbeelden van canvas</h2>
<p>Alleen te openen met compatible browsers:</p>
<ul>
<li>Bouw van <a title="wolfenstein 3D with Canvas html5" href="http://dev.opera.com/articles/view/3d-games-with-canvas-and-raycasting-part/" target="_blank">Wolfenstein in 3D</a> met 2D canvas en Javascript.</li>
<li>een wapperend en interactieve 3D vlag met <a title="jscloth" href="http://gyu.que.jp/jscloth/" target="_blank">jscloth</a></li>
<li>3d voorbeelden van <a title="K3D" href="http://www.kevs3d.co.uk/dev/canvask3d/k3d_test.html" target="_blank">Kevin Roast</a></li>
<li>Altijd al een website willen <a title="tekenen over een website" href="http://www.permadi.com/blog/2009/04/using-html-5-canvas-to-go-ahead-and-ruin-my-page/" target="_blank">vandaliseren</a>?</li>
<li><a title="canvas html5  cover flow" href="http://www.blarnee.com/projects/cflow/" target="_blank">Coverflow</a> met canvas</li>
</ul>
<h2>Waar gaat het heen?</h2>
<p>Het canvas element (en zeker ook het canvas 3D element) zal heel wat mogelijkheden geven. Nu al ondersteunen vele browsers en ook mobiele apparaten (Ipad, Iphone, Android smartphones) het canvas element. Dit kan het gemis van <a class="zem_slink" title="Adobe Flash" rel="homepage" href="http://www.adobe.com/products/flash/flashpro/">Flash</a> op deze apparaten vaak opvangen.  Toch blijft tekenen in canvas een enorme klus en zal het even duren voordat de browsers genoeg energie hebben gestoken in het versnellen van hun JavaScript rendering.</p>
<p style="text-align: center;"><object id="__sse1651377" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="383" height="319" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=standards-next-canvas-090628140453-phpapp01&amp;rel=0&amp;stripped_title=standardsnext-canvas-1651377" /><param name="name" value="__sse1651377" /><param name="allowfullscreen" value="true" /><embed id="__sse1651377" type="application/x-shockwave-flash" width="383" height="319" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=standards-next-canvas-090628140453-phpapp01&amp;rel=0&amp;stripped_title=standardsnext-canvas-1651377" name="__sse1651377" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<h6 class="zemanta-related-title" style="font-size: 1em;">Related articles by Zemanta</h6>
<ul class="zemanta-article-ul">
<li class="zemanta-article-ul-li"><a href="http://lovehateubuntu.blogspot.com/2010/05/faster-background-rendering-in-html5.html">Faster Background Rendering in HTML5 Canvas</a> (lovehateubuntu.blogspot.com)</li>
<li class="zemanta-article-ul-li"><a href="http://www.webmonkey.com/2010/05/where-on-the-web-is-html5/">Where on the Web Is HTML5?</a> (webmonkey.com)</li>
<li class="zemanta-article-ul-li"><a href="http://ajaxian.com/archives/rgraph-canvas-based-graphing-library">RGraph: Canvas based graphing library</a> (ajaxian.com)</li>
<li class="zemanta-article-ul-li"><a href="http://www.slideshare.net/dbalmer/rockstar-graphics-with-html5">Rockstar Graphics with HTML5</a> (slideshare.net)</li>
</ul>
<div class="zemanta-pixie" style="margin-top: 10px; height: 15px;"><a class="zemanta-pixie-a" title="Reblog this post [with Zemanta]" href="http://reblog.zemanta.com/zemified/530cc27f-fce6-441e-8028-89b02156835d/"><img class="zemanta-pixie-img" style="border: medium none; float: right;" src="http://img.zemanta.com/reblog_e.png?x-id=530cc27f-fce6-441e-8028-89b02156835d" alt="Reblog this post [with Zemanta]" /></a><span class="zem-script more-related pretty-attribution"><script src="http://static.zemanta.com/readside/loader.js" type="text/javascript"></script></span></div>
<img src="http://www.netsetters.nl/?ak_action=api_record_view&id=274&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.netsetters.nl/2010/05/html5-het-canvas-element/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Het bouwen van een mobiele website.</title>
		<link>http://www.netsetters.nl/2010/03/het-bouwen-van-een-mobiele-website/</link>
		<comments>http://www.netsetters.nl/2010/03/het-bouwen-van-een-mobiele-website/#comments</comments>
		<pubDate>Mon, 22 Mar 2010 17:09:27 +0000</pubDate>
		<dc:creator>Maurice Lourens</dc:creator>
				<category><![CDATA[data]]></category>
		<category><![CDATA[visualisation]]></category>
		<category><![CDATA[Event handler]]></category>
		<category><![CDATA[Handhelds]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[mobiele site]]></category>
		<category><![CDATA[Smartphones]]></category>
		<category><![CDATA[Tweakers.net]]></category>
		<category><![CDATA[User agent]]></category>
		<category><![CDATA[Website]]></category>
		<category><![CDATA[WURFL]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://www.netsetters.nl/?p=249</guid>
		<description><![CDATA[Net toen het me helemaal niet interessant leek om mobiele sites te bouwen kreeg ik een opdracht binnen hiervoor. Een klant wil dat hun site geoptimaliseerd is voor mobiel gebruik. Dat betekend lichter, rekening houden met beperkte ruimte, JavaScript verwijderen en plaatjes beter uitserveren.]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.netsetters.nl%2F2010%2F03%2Fhet-bouwen-van-een-mobiele-website%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.netsetters.nl%2F2010%2F03%2Fhet-bouwen-van-een-mobiele-website%2F&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<div class="zemanta-img" style="margin: 1em; display: block;">
<div>
<dl class="wp-caption alignright" style="width: 124px;">
<dt class="wp-caption-dt"><a href="http://en.wikipedia.org/wiki/Image:Wurfl_logo_main_114px.png"><img title="WURFL" src="http://upload.wikimedia.org/wikipedia/en/5/5d/Wurfl_logo_main_114px.png" alt="WURFL" width="114" height="146" /></a></dt>
<dd class="wp-caption-dd zemanta-img-attribution" style="font-size: 0.8em;">Image via <a href="http://en.wikipedia.org/wiki/Image:Wurfl_logo_main_114px.png">Wikipedia</a></dd>
</dl>
</div>
</div>
<p>Net toen het me helemaal niet interessant leek om mobiele sites te bouwen kreeg ik een opdracht binnen hiervoor. Een klant wil dat hun site geoptimaliseerd is voor mobiel gebruik. Dat betekend lichter, rekening houden met beperkte ruimte, <a class="zem_slink" title="JavaScript" rel="wikipedia" href="http://en.wikipedia.org/wiki/JavaScript">JavaScript</a> verwijderen en plaatjes beter uitserveren.<span id="more-249"></span></p>
<h3>Detectie van het platform en zijn mogelijkheden</h3>
<p>Om het wiel niet een tweede keer uit te vinden gebruiken wij <a href="http://wurfl.sourceforge.net/" target="_blank">WURFL</a>.  Dit is een grote verzameling van <a class="zem_slink" title="XML" rel="wikipedia" href="http://en.wikipedia.org/wiki/XML">XML</a> bestanden waarin alle mogelijkheden per telefoon zijn beschreven. Door de detectie van de <a class="zem_slink" title="User agent" rel="wikipedia" href="http://en.wikipedia.org/wiki/User_agent">user-agent</a> en dus de telefoon kan ik met behulp van WURFL alle gegevens er bij vinden zoals resolutie, JavaScipt ondersteuning, etc.</p>
<h3>Indelen van categorieën telefoons</h3>
<p>Met<a title="tweakers.net" href="http://www.tweakers.net" target="_blank"> tweakers.net</a> als voorbeeld hebben we apparaten onderverdeeld in verschillende classen. We hebben ook dezelfde classen gebruikt als Tweakers welke staan beschreven op de &#8216;<a title="tweakers device detect" href="http://tweakers.net/devicedetect" target="_blank">device detect</a>&#8216; pagina&#8217;. De onderscheid tussen de versie <strong>A</strong> tot en met <strong>F</strong> ligt hem vooral in resolutie en JavaScript support.</p>
<p><strong>Omgaan met resolutie</strong></p>
<p>Net nu we eindelijk er toch vanuit kunnen gaan dat een standaard beeldscherm minimaal 1024 breed is (de 800 x 600 resolutie-schermen zijn verwaarloosbaar) moete we dus weer rekening gaan houden met lagere resoluties. Het fijne is dat de modernere telefoons wel kunnen zoomen.In ons project gaan we er vanuit dat de meeste telefoons niet hoeven te zoomen. Maar niet alleen de resolutie-verschillen maken het erg, maar ook de verschillende verhoudingen.</p>
<p style="text-align: left;"><a href="http://www.netsetters.nl/wp-content/uploads/2010/03/1618image001.png"><img class="aligncenter size-medium wp-image-250" title="1618image001" src="http://www.netsetters.nl/wp-content/uploads/2010/03/1618image001-203x300.png" alt="" width="203" height="300" /></a></p>
<p style="text-align: left;">Om het ons niet te moeilijk te maken testen we met de meest voorkomende resoluties:</p>
<ul>
<li>128 x 160 pixels</li>
<li>176 x 220 pixels</li>
<li>240 x 320 pixels</li>
<li>320 x 480 pixels</li>
</ul>
<p>De meeste smartphones (waarbij IPhone een grote speler is) hebben de laatst genoemde resolutie, iets  wat ons heeft laten kiezen voor een breedte van 310px.</p>
<h3>Het I-phone zoom probleem</h3>
<p>De eerste mobiele versie was al vrij snel een feit, maar op de IPhone hadden we een gek probleem. De Iphone lijkt alles te schalen. Eerst dacht ik een fout te maken meteen en veel te breed element er in, maar naar een paar test werdt al vrij snel duidelijk dat Iphone (mijn zijn resolutie van 320px) maar al te graag 1024 wilt laten zien. Standaard toont hij dus altijd alles kleiner. Om dit op te lossen kan de volgende meta-tag worden gebruikt:</p>
<blockquote><p>&lt;meta name=&#8221;viewport&#8221; content=&#8221;width=device-width; initial-scale=1.0; maximum-scale=1.0;&#8221;&gt;</p></blockquote>
<p>Een enorm simpele oplossing dus. Hiermee vertel je de browser van de Iphone dat de initiele schaal 1 is (dus 100%) en dat de maximale schaal ook 1 is. Zo kan er wel niet meer ingezomd worden. Door de maximale schaal te vergroten kan er wel worden gezoomd (wat weer fijner is voor de mensen die het niet goed kunnen lezen).</p>
<h2>Roteren naar &#8220;landscape&#8221; en terug</h2>
<p>De volgende stap is om de website bij een landscape positie de bredere ruimte te laten gebruiken. Hiervoor kunnen we javascript gebruiken. Op het moemnt dat de orientatie veranderd moet er een actie komen die het geheel kleiner of juist groter maakt. Dit is te realiseren met de <a class="zem_slink" title="Event handler" rel="wikipedia" href="http://en.wikipedia.org/wiki/Event_handler">event-handler</a> &#8220;onorientationchange&#8221;:</p>
<blockquote><p>&lt;body onorientationchange=&#8221;updateOrientation();&#8221;&gt;</p></blockquote>
<h6 class="zemanta-related-title" style="font-size: 1em;">Related articles by Zemanta</h6>
<ul class="zemanta-article-ul">
<li class="zemanta-article-ul-li"><a href="http://www.lukew.com/ff/entry.asp?1028">MIX10: Designing and Developing for the Rich Mobile Web</a> (lukew.com)</li>
<li class="zemanta-article-ul-li"><a href="http://www.nofluffjuststuff.com/blog/matthias__wessendorf_/2010/03/mobile_development_with_apache_myfaces_trinidad">Mobile Development with Apache MyFaces Trinidad</a> (nofluffjuststuff.com)</li>
<li class="zemanta-article-ul-li"><a title="designing for the mobile web" href="http://articles.sitepoint.com/article/designing-for-mobile-web" target="_blank">Designing for the mobile web</a> (sitepoint.com)</li>
<li class="zemanta-article-ul-li"><a href="http://iphone.appstorm.net/roundups/developer/the-ipad-web-design-development-toolbox/">The iPad Web Design &amp; Development Toolbox</a> (iphone.appstorm.net)</li>
</ul>
<div class="zemanta-pixie" style="margin-top: 10px; height: 15px;"><a class="zemanta-pixie-a" title="Reblog this post [with Zemanta]" href="http://reblog.zemanta.com/zemified/34461736-f184-43d9-ad31-1af555557161/"><img class="zemanta-pixie-img" style="border: medium none; float: right;" src="http://img.zemanta.com/reblog_e.png?x-id=34461736-f184-43d9-ad31-1af555557161" alt="Reblog this post [with Zemanta]" /></a><span class="zem-script more-related pretty-attribution"><script src="http://static.zemanta.com/readside/loader.js" type="text/javascript"></script></span></div>
<img src="http://www.netsetters.nl/?ak_action=api_record_view&id=249&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.netsetters.nl/2010/03/het-bouwen-van-een-mobiele-website/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How JavaScript frameworks contribute to a consistent experience</title>
		<link>http://www.netsetters.nl/2009/10/how-javascript-frameworks-contribute-to-a-consistent-experience/</link>
		<comments>http://www.netsetters.nl/2009/10/how-javascript-frameworks-contribute-to-a-consistent-experience/#comments</comments>
		<pubDate>Thu, 01 Oct 2009 20:19:55 +0000</pubDate>
		<dc:creator>Maurice Lourens</dc:creator>
				<category><![CDATA[logic]]></category>
		<category><![CDATA[visualisation]]></category>
		<category><![CDATA[Ext]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JQuery]]></category>
		<category><![CDATA[Languages]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Scripts]]></category>
		<category><![CDATA[User interface]]></category>
		<category><![CDATA[Web application]]></category>

		<guid isPermaLink="false">http://www.netsetters.nl/?p=55</guid>
		<description><![CDATA[Why using a JavaScript framework for your rich web-application? Consistency, speed and... did I mention consistency?]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.netsetters.nl%2F2009%2F10%2Fhow-javascript-frameworks-contribute-to-a-consistent-experience%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.netsetters.nl%2F2009%2F10%2Fhow-javascript-frameworks-contribute-to-a-consistent-experience%2F&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<div class="zemanta-img" style="margin: 1em; display: block;">
<div>
<dl class="wp-caption alignright" style="width: 250px;">
<dt class="wp-caption-dt"><a href="http://www.flickr.com/photos/19451080@N00/2817382276"><img title="JQuery new site" src="http://farm4.static.flickr.com/3289/2817382276_4a4fd49075_m.jpg" alt="JQuery new site" width="240" height="185" /></a></dt>
<dd class="wp-caption-dd zemanta-img-attribution" style="font-size: 0.8em;">Image by <a href="http://www.flickr.com/photos/19451080@N00/2817382276">Phillie Casablanca</a> via Flickr</dd>
</dl>
</div>
</div>
<p><strong><a class="zem_slink freebase/guid/9202a8c04000641f8000000000015527" title="JavaScript" rel="wikipedia" href="http://en.wikipedia.org/wiki/JavaScript">JavaScript</a> Libraries started out as easy frameworks for web developers.  Why write code that’s already been written and, in most cases, better than home-made JavaScript? It also provides a consistent way of programming throughout a project and a fast way to build applications.</strong></p>
<p><a class="zem_slink freebase/guid/9202a8c04000641f8000000004643bb5" title="JQuery" rel="homepage" href="http://jquery.com/">JQuery</a> UI and <a class="zem_slink freebase/guid/9202a8c04000641f800000000566b41f" title="Ext (JavaScript library)" rel="homepage" href="http://extjs.com/">Ext</a> JS, Prototype,  YahooUI all grew to complete JavaScript platforms with familiar design elements that help programmers build an interface that people are used to.  JQuery even has an own themeroller where programmers can generate a whole css theme for their interface.</p>
<h3><strong>Building bridges</strong></h3>
<p>The new generation of JavaScript libraries are building a small (but hopeful) bridge between designers and developers. Designers can understand the concept, en have consistent elements to work with. Developers can integrate these elements easily within their projects.</p>
<h3><strong>Cross browser, cross <a class="zem_slink freebase/guid/9202a8c04000641f800000000002c5ef" title="Operating system" rel="wikipedia" href="http://en.wikipedia.org/wiki/Operating_system">OS</a></strong></h3>
<p>The acceptance of these libraries among developers and designers is a great step to a consistent experience of web applications. we all recognize widgets, sliders, tabs,  tree&#8217;s and we know how to operate them. Consistency is crucial when building rich web-applications. It does not depend on browser or OS, just the library used.</p>
<h3>Skepticism</h3>
<p>Of course there are some reasons why NOT to use a library. Programmers want to know what&#8217;s happening, mainly for debugging reasons, It can be a bit bloated when only using one or two functions and the biggest reason: You shouldn’t trust the code of others for your professional purposes. The latest versions of the various frameworks take away most of these worries with good debug option and even better performance.</p>
<h6 class="zemanta-related-title" style="font-size: 1em;">Related articles by Zemanta</h6>
<ul class="zemanta-article-ul">
<li class="zemanta-article-ul-li"><a href="http://www.noupe.com/jquery/jquery-tools.html">jQuery Tools: The missing UI library for the Web</a> (noupe.com)</li>
<li class="zemanta-article-ul-li"><a href="http://ajaxian.com/archives/prototype-161-speed-up-clean-up-and-team-up">Prototype 1.6.1; Speed up, clean up, and team up</a> (ajaxian.com)</li>
<li class="zemanta-article-ul-li"><a href="http://www.slideshare.net/ajaxexperience2009/colin-clark-accessible-u-is-with-j-query-and-infusion1">Colin Clark Accessible U Is With J Query And Infusion[1]</a> (slideshare.net)</li>
</ul>
<div class="zemanta-pixie" style="margin-top: 10px; height: 15px;"><a class="zemanta-pixie-a" title="Reblog this post [with Zemanta]" href="http://reblog.zemanta.com/zemified/05a2cb26-1b73-4b7c-97ac-6493aac67917/"><img class="zemanta-pixie-img" style="border: medium none; float: right;" src="http://img.zemanta.com/reblog_e.png?x-id=05a2cb26-1b73-4b7c-97ac-6493aac67917" alt="Reblog this post [with Zemanta]" /></a><span class="zem-script more-related more-info pretty-attribution"><script src="http://static.zemanta.com/readside/loader.js" type="text/javascript"></script></span></div>
<img src="http://www.netsetters.nl/?ak_action=api_record_view&id=55&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.netsetters.nl/2009/10/how-javascript-frameworks-contribute-to-a-consistent-experience/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
