Dissocier le code javascript du code HTML avec Behaviour
Par NiKo le lundi 20 mars 2006, 22:32 - Dev - Lien permanent
Dans un de mes précédents billets sur les effets javascript, je vous ai présenté moult exemples mélangeant allègrement syntaxe HTML et code javascript, notamment evênementiel. Programmer de cette façon n'est pas forcément la meilleure dans la mesure où elle rend difficile la séparation de ces deux langages, et donc de la maintenance des applications les utilisant.
Suite à un commentaire sur le billet en question, la librairie Behaviour s'est rappellée à mon bon souvenir et avérée tout à fait indiquée pour palier à cet épineux problème. Son utilisation est très simple et utilise la syntaxe CSS pour cibler les élements DOM auxquels appliquer certains comportements [1].
Ainsi, après avoir inclus la librairie dans votre page et au lieu d'écrire quelque chose du genre :
<a id="monlien" href="#ancre" onclick="new Effect.ScrollTo('ancre', .7);return false">Test</a>
... nous allons (enfin !) pouvoir dissocier la partie HTML de la partie javascript. Ainsi nous obtenons, pour le code HTML :
<a id="monlien" href="#ancre">Test</a>
Et pour la partie javascript, dans un fichier séparé :
var rules = { 'a#monlien' : function (element) { element.onclick = function() { new Effect.ScrollTo ( 'ancre', {duration: .7} ); return false; } } } Behaviour.register(rules);
Vous noterez qu'on cible directement notre lien par son identifiant DOM, (#monlien) - comme on le ferait dans une simple feuille de style CSS - et qu'on lui assigne une fonction javascript incluant les instructions que nous placions auparavant au sein de l'attribut onclick de la balise.
Vous allez me dire, quel interêt de remplacer un code simple et peu volumineux par cet amas de code javascript ? Par exemple, imaginons que nous voulons utiliser l'effet javascript ScrollTo sur tous les liens hypertextes contenant une référence à une ancre nommée de notre page... Notre règle comportementale devient tout simplement :
var rules = { // Liens et scrollTo automatiques sur tous les liens pointant // vers une ancre dans la page courante 'a' : function (element) { var pos = element.href.indexOf('#'); if (pos) { var target = element.href.substring(pos + 1, element.href.length); if ($(target)) { element.onclick = function() { new Effect.ScrollTo ( target, {duration: .5} ); return false; } } } } }; Behaviour.register(rules);
Voila, vous venez d'appliquer un comportement à tout un ensemble d'éléments [2] (toutes les balises <a /> du document), et ce sans avoir à modifier une ligne de votre code HTML.
Il est bien évidemment possible de chaîner les déclarations de comportements, de la manière suivante :
var rules = { 'a' : function (element) { }, 'p' : function (element) { }, 'li' : function (element) { } }; Behaviour.register(rules);
Mine de rien, nous venons de mettre en place une sorte de feuille de comportements, dissociée de la sémantique de la page et de ses règles de mise en forme. Les perspectives sont énormes mais c'est surtout en maintenabilité que les gains seront les plus substentiels, un argument de poids face à nos chers clients férus d'inflation du périmètre fonctionnel (copyright Glagla 2006) ![]()




















Commentaires
1. Le lundi 20 mars 2006, 23:40 par Vincent {CiD}
2. Le mardi 21 mars 2006, 00:19 par Denis Hovart
3. Le mardi 21 mars 2006, 00:22 par NiKo
4. Le mardi 21 mars 2006, 00:23 par Denis Hovart
5. Le mardi 21 mars 2006, 07:31 par MonsieurN
6. Le mardi 21 mars 2006, 16:37 par Denis
7. Le mercredi 22 mars 2006, 10:18 par Thomas
8. Le mercredi 22 mars 2006, 10:23 par NiKo
9. Le mercredi 22 mars 2006, 13:38 par PiTiLeZarD
10. Le mercredi 22 mars 2006, 16:30 par Denis
11. Le dimanche 26 mars 2006, 22:36 par Amaury
12. Le lundi 27 mars 2006, 05:19 par lilaz
13. Le mercredi 19 avril 2006, 10:19 par biou
14. Le mercredi 19 avril 2006, 10:44 par NiKo
15. Le vendredi 5 mai 2006, 17:28 par Samad