Scriptorama.nl

Header image showing a keyboard, mouse, laptop and books on design patterns

Schone HTML met JavaScript

Steeds kom je vaker HTML in combinatie met Javascript tegen. Vaak wordt de HTML gemixed met Javascript, met soms rare constructies als gevolg.

JAVASCRIPT:
  1. <span onmouseover="notesBlock.hoverBegin(128699)">
  2. </span>     onmouseout="notesBlock.hoverEnd(128699, true)">
  3. <a class="trashcan" href="http://www.scriptorama.nl/#">
  4. </a>       onclick="if (confirm('Are you sure?')) {
  5. new Ajax.Updater('notes',
  6. '/page/2326/notes/destroy/128699', {

Dit is geen nette HTML en al helemaal niet semantisch. Met behulp van een Javascript library kunnen we dit tegengaan. In dit artikel zal ik Behaviour behandelen, ontwikkeld door Ben Nolan.

Laten we beginnen met een simpel voorbeeld waarbij we geen Javascript hebben. We hebben een lijst met allemaal links.

HTML:
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  2.  
  3.  
  4. <meta content="text/html; charset=windows-1250" http-equiv="content-type" />
  5.     <li><a href="http://www.scriptorama.nl/">Scriptorama</a></li>
  6.     <li><a href="http://www.live.com/">Windows Live</a></li>
  7. </ul>

Onze eisen gaan omhoog. Bij bepaalde events wil je een Javascript functie aanroepen, denk bijvoorbeeld aan een XMLHttpReqest call. Laten we event onclick nemen. Bij een klik willen we functie click() aanroepen. Deze functie hebben we in een aparte Javascript bestand staan en heeft alleen een alert().

JAVASCRIPT:
  1. // functies.js
  2. function click() {
  3. alert('Er is geklikt!');
  4. }

Onze nieuwe HTML bestand ziet er zo uit.

HTML:
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  2.  
  3.  
  4. <meta content="text/html; charset=windows-1250" http-equiv="content-type" />
  5. <script type="text/javascript" language="JavaScript" />
  6.     <li><a onclick="click()" href="http://www.scriptorama.nl/">Scriptorama</a></li>
  7.     <li><a onclick="click()" href="http://www.live.com/">Windows Live</a></li>
  8. </ul>

Bij het klikken op een link krijg je een alert. Dit voorbeeld laat slechts een simpele constructie zien met een event, maar het kan dus veel gecompliceerder zoals ik al eerder liet zien. Dit leidt tot vreselijke HTML die je liever niet aan je oma laat zien.

Schoonmaakbeurt met Behaviour

Met behulp van Behaviour kunnen we al deze Javascript constructies uit de HTML halen. Dit levert wel schone HTML en leidt tot betere semantische HTML. Laten we eerst de HTML opschonen.

HTML:
  1. <ul id="list">
  2.     <li><a href="http://www.scriptorama.nl/">Scriptorama</a></li>
  3.     <li><a href="http://www.live.com/">MSN Live</a></li>
  4. </ul>

De onclick event is weggehaald, we hebben de HTML weer in oude staat. Er is wel een aanpassing, we hebben een id gegeven aan de unordered list (<ul>). Nu willen we nog dat click() wordt aangeroepen bij een klik op een link. Om dit te bereiken hebben de hulp nodig van Behaviour. Onze nieuwe HTML:

HTML:
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  2.  
  3.  
  4. <meta content="text/html; charset=windows-1250" http-equiv="content-type" />
  5. <script type="text/javascript" language="JavaScript" />
  6. <script type="text/javascript" language="JavaScript" />
  7. <script type="text/javascript" language="JavaScript" />
  8. <ul id="list">
  9.     <li><a href="http://www.scriptorama.nl/">Scriptorama</a></li>
  10.     <li><a href="http://www.live.com/">Windows Live</a></li>
  11. </ul>

We hebben twee nieuwe Javascript bestanden erbij gehaald, behaviour.js en rules.js. Behaviour.js mag duidelijk zijn, maar wat is rules.js? Hieronder staat rules.js:

JAVASCRIPT:
  1. var myrules = {
  2. '#list li' : function(el){
  3. el.onclick = function(){
  4. click();
  5. }
  6. }
  7. };
  8. Behaviour.register(myrules);

Deze 'rules' gelden voor id "list" en bijbehorende list items (<li>). Bij een onclick event wordt de functie click() aangeroepen. Dankzij Behaviour worden er bij kliks op de links functie click() aangeroepen en dit allemaal zonder enig Javascript code in de HTML. Let wel op dat je de bestanden op de juiste volgorde binnenhaalt! Je kunt natuurlijk meerdere rules aanmaken en ook andere events gebruiken. Zie de Behaviour documentatie voor meer informatie.
Naast de eerder genoemde voordelen, heb je in feite ook je Javascript logica gescheiden van je HTML presentatie. Met andere woorden, een simpele template engine. Op Borkweb vind je een uitgebreide AJAX template engine, zeer net! Natuurlijk met Behaviour en iedereens favoriete Javascript library Prototype.

Reageer ook!

Goed punt, weg met de spaghetti ;) De scheiding structuur-gedrag is naar mijn mening net zo belangrijk als de scheiding structuur-presentatie. PPK schreef hier een goed artikel over: http://naarvoren.nl/artikel/structuur/.

Ik verbaas me erover dat veel RoR- en Prototype adepten die semantiek schijnbaar hoog in het vaandel hebben HTML/JavaScript spaghetti lijken te promoten. Zie bijvoorbeeld wat de RoR-JavaScript helpers aan code uitspugen...

Dit lijkt me niet erg nuttig. Misschien moeten er nog wat src= attributes bij?

Leave a comment
Line and paragraph breaks automatic, e-mail address never displayed, HTML allowed: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>