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.
-
<span onmouseover="notesBlock.hoverBegin(128699)">
-
</span> onmouseout="notesBlock.hoverEnd(128699, true)">
-
<a class="trashcan" href="http://www.scriptorama.nl/#">
-
</a> onclick="if (confirm('Are you sure?')) {
-
new Ajax.Updater('notes',
-
'/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.
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().
-
// functies.js
-
function click() {
-
alert('Er is geklikt!');
-
}
Onze nieuwe HTML bestand ziet er zo uit.
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.
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:
-
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-
-
-
<meta content="text/html; charset=windows-1250" http-equiv="content-type" />
-
<script type="text/javascript" language="JavaScript" />
-
<script type="text/javascript" language="JavaScript" />
-
<script type="text/javascript" language="JavaScript" />
-
<ul id="list">
-
</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:
-
var myrules = {
-
'#list li' : function(el){
-
el.onclick = function(){
-
click();
-
}
-
}
-
};
-
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.
Volg Scriptorama via RSS!
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...
Door Michel
op 05.15.06 @ 1:49 pm | Permalink
Dit lijkt me niet erg nuttig. Misschien moeten er nog wat src= attributes bij?
Door Rijk van Haaften
op 05.22.08 @ 1:17 pm | Permalink
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>