Toutes les notes

Pour appliquer des styles différents lorsque JavaScript est activé, une bonne solution est d’ajouter une classe spécifique sur l’élément body.

Mais si les scripts ont été placés en fin de page pour des raisons de performances, il peut y avoir un temps d’attente (grossièrement, le temps de télécharger la page, puis le script, et enfin d’exécuter le script) qui laissera apparaître un « flash » avec les styles prévus pour la version sans JavaScript.

Le meilleur compromis que j’ai trouvé est de placer le script suivant juste après l’ouverture de l’élément body :

<body>
<script type="text/javascript">
    document.body.className+=" js";
</script>

Et d’une manière raccourcie à l’extrême (attention, c’est-pas-valide) :

<body>
<script>document.body.className+=" js"</script>

Connaissez-vous une meilleure solution ?

Tiens, je me demande s’il ne serait pas plus logique d’avoir cette fonctionnalité directement en CSS, à l’aide d’une nouvelle règle @script par exemple :

@script javascript {
    /* Styles spécifiques pour JavaScript */
}

9 commentaires

Poster un commentaire

Flux RSS des commentaires de cet article

Perso, j’utilise la classe sur l’élément html (le premier élément créé) avec :

document.documentElement.className+=" hasJS";

exemple

Le code pourrait être dans un fichier séparé.

Le 27 Jan. 2010 à 13h38 par Ombre

Je confirme le document.documentElement.

Il est toujours possible que le script soit exécuté alors que le noeud DOM d’une balise précédente n’est toujours pas présent dans l’arbre. Pourquoi pas avec la balise body.

Le documentElement représente la balise HTML, qui ne devrait pas avoir de classe, mais dans les faits ça fonctionne et on ne viole aucune spec (DOM nous autorise à faire ça, et on n’a pas cassé HTML vu que la classe n’a pas été mise en HTML)

Je vous propose par contre de ne pas utiliser +=  » js » parce que sur certains vieux navigateurs (dont je n’ai plus la version exacte) les attributs de classe commençant par un espace sont mal pris en compte.

Par contre @Ombre : surtout pas de ça dans un fichier séparé, ça tuerait une grosse partie de l’intérêt, et vu le poids de la ligne de script ça va très bien en inline dans le HTML

Le 27 Jan. 2010 à 19h50 par Eric

Je vois pas bien l’intéret d’un tel montage, pourquoi ne pas injecter les styles directement avec javascript en lazyloading.

Le 27 Jan. 2010 à 21h12 par truffo

Je vous propose par contre de ne pas utiliser += » js » parce que sur certains vieux navigateurs (dont je n’ai plus la version exacte) les attributs de classe commençant par un espace sont mal pris en compte.

Je pensais que l’espace (séparateur) était nécessaire au cas où l’attribut html posséderait déjà des classes.

Par contre @Ombre : surtout pas de ça dans un fichier séparé, ça tuerait une grosse partie de l’intérêt, et vu le poids de la ligne de script ça va très bien en inline dans le HTML

Merci pour l’info. ;-)

Le 29 Jan. 2010 à 12h13 par Ombre

Hum intéressant ce document.documentElement, jusqu’à présent je faisais :

document.getElementsByTagName('html')[0].className = 'js';

Merci !

Le 05 Fév. 2010 à 09h44 par Cyril

Publiez un commentaire en remplissant les champs ci-dessous.
Les champs marqués d'une astérisque (*) sont obligatoires.

Les commentaires peuvent utiliser HTML ; seuls ces éléments sont autorisés : <a href="" title=""> <abbr title=""> <blockquote cite=""> <cite> <code> <em> <q cite=""> <s> <strong> <pre>