Ce n'est pas bien de mêler code HTML, CSS et JavaScript !
Par Victor Brito, le lundi 24 novembre 2008, à 13h17 - Lien permanent
Bruno Bichet a publié hier sur son blog un billet expliquant pourquoi ce n'est pas une bonne pratique que de mélanger le code HTML, les CSS (à coup d'attributs style) et le JavaScript (à coups d'attributs d'événements de type onnom de l'événement). Il s'agit d'une traduction (Bruno Bichet parle de craduction
) d'un billet de Robert Nyman, en anglais, à ce sujet.
Dans l'ensemble, il n'y a rien à ajouter aux explications de Bruno Bichet, explications qui se doublent d'une démonstration de ce qu'il faut faire si l'on se soucie de bonnes pratiques de codage en CSS et en JavaScript : autrement dit, il faut séparer le contenu (et la structure, de préférence conforme au balisage sémantique, de ce contenu) de sa présentation et des comportements dynamiques qui s'y appliquent. N'oublions pas que c'est pour tendre à cet objectif de séparation que les feuilles de styles sont apparues (pour rappel, il y a bientôt douze ans !) et qu'on a mis au point le concept d'unobstrusive JavaScript (en bon français, le JavaScript non intrusif).
D'ailleurs, à propos de JavaScript, j'ai une remarque à faire concernant la gestion des événements et la résolution des conflits éventuels entre plusieurs gestionnaires d'événement. Il n'est pas nécessaire de recourir à une bibliothèque JavaScript pour faire cohabiter pacifiquement plusieurs gestionnaires d'événements : en effet, la spécification DOM niveau 2 événements du W3C a de quoi suffire, ainsi que la gestion des événements propre à Internet Explorer.
function fnAjaxNews ()
{
// Get news through Ajax
}
function fnGetNews ()
{
var oGetNews = document.getElementById ('get-news');
// For standards-compliant browsers
if (oGetNews.addEventListener) oGetNews.addEventListener ('click', fnAjaxNews, false);
// For Internet Explorer
else if (oGetNews.attachEvent) oGetNews.attachEvent ('onclick', fnAjaxNews);
// For browsers who do not understand DOM level 2, there is no event
else return;
}
// Let us load the function above
function fnLoad ()
{
// For standards-compliant browsers
if (window.addEventListener) window.addEventListener ('load', fnGetNews, false);
// For Internet Explorer
else if (window.attachEvent) window.attachEvent ('onload', fnGetNews);
// For browsers who do not understand DOM level 2, there is no event
// (which means these browsers will behave as though JavaScript were deactivated or not supported)
else return;
}
// Execute
fnLoad ();
Sans doute y a-t-il plus de code à pondre que si l'on utilisait une bibliothèque JavaScript ; mais, ce bout de code a l'avantage d'éviter les conflits (d'autres fichiers JavaScript pourront être appelés qui gèrent les événements de la sorte) et de ne pas servir de JavaScript (c'est un choix) aux navigateurs incapables d'implémenter l'une des deux méthodes d'ajout d'événement (que ce soit la méthode standard ou la méthode propriétaire d'IE) : pour ces derniers, il y aura donc une dégradation élégante, qui ne sera pas gênante, pourvu que le contenu soit parfaitement accessible sans JavaScript.


Commentaires
Salut Victor,
Merci de relayer cette craduction, vu le nombre de style en ligne ou d'événements onquelquechose qu'on peut rencontrer dans une journée d'intégration
Je compte ajouter ton script dans la liste des 21 scripts à posséder dans sa boite à outils.
Une chose qui m'a sûrement échappé (en gros, j'y comprend rien
) c'est comment tu charges plusieurs fonctions comme "fnGetNews ()" avec "fnLoad ()" ?
Si tu avais un exemple, ça serait super cool
Merci pour l'ajout, Bruno.
Pour répondre à ta question, je vois, pour ma part, deux cas de figure :
Le premier cas de figure ressemble à celui du code pondu sur le billet, où tu as une fonction A qui appelle une fonction B, que ce soit en l'exécutant (
B ();ouB (param1, param2…), par exemple) ou en utilisant un gestionnaire d'événements. La fonction permettant de charger le script au chargement du document n'aura besoin que d'appeler la fonction A (une fois le document chargé, lorsque les conditions seront réunies pour que la fonction A appelle la fonction B, la fonction B sera executée sans problème).Le second cas de figure oblige à appeler chaque fonction dans la fonction de chargement du script au chargement du document. Autrement dit, il faut autant de
window.addEventListener(et dewindow.attachEvent) qu'il y a de fonctions. Autrement dit :function fnLonelyFunction1 () { // An independent function } function fnLonelyFunction2 () { // Another independent function } // Let us load the functions above function fnLoad () { // For standards-compliant browsers if (window.addEventListener) { window.addEventListener ('load', fnLonelyFunction1, false); window.addEventListener ('load', fnLonelyFunction2, false); } // For Internet Explorer else if (window.attachEvent) { window.attachEvent ('onload', fnLonelyFunction1); window.attachEvent ('onload', fnLonelyFunction2); } // For browsers who do not understand DOM level 2, there is no event // (which means these browsers will behave as though JavaScript were deactivated or not supported) else return; } // Execute fnLoad ();Soit dit en passant, si l'on n'utilise pas la dernière condition de la fonction
fnLoad ()(else return;), il n'est alors pas nécessaire de créer ladite fonctionfnLoad ()et de l'exécuter. Autrement dit :// Another way to load the functions when document is on load // (directly, without creating any function) // For standards-compliant browsers if (window.addEventListener) { window.addEventListener ('load', fnLonelyFunction1, false); window.addEventListener ('load', fnLonelyFunction2, false); } // For Internet Explorer else if (window.attachEvent) { window.attachEvent ('onload', fnLonelyFunction1); window.attachEvent ('onload', fnLonelyFunction2); } // In this case, we totally ignore browsers who do not understand DOM level 2J'espère avoir été clair.
Ok, c'est plus clair pour moi comme ça, je pensais qu'il fallait passer par une boucle pour lister les fonctions à charger. Merci encore !
Bonjour,
je crois que j'ai un exemple qui pourrait parfaitement illustrer les propos de ce billet. Comment utiliser HTML + CSS + JavaScript sans mélanger tout ça dans la même page.
J'invite chacun à fouiller les codes de cette page : http://jem-web.info/tutoform/
Enjoy ! (comme on dit en latin :P)
Même s'il manque quelques éléments
labelpour rendre les cases à cocher parfaitement accessibles, merci d'avoir partagé cet autre exemple.Si uere Latine loquereris, diceres: .