2004-04-27

Mini astuce Javascript

Flyer de la Moon Control (Détail)Le 7 mai, il y a une teuf psytrance à Poitiers qui me semble bien alléchante. Organisée par Moon Spirits, avec de bons artistes invités, pleins d'amis (dont un pour qui ça sera l'anniversaire) et une durée de deux jours. Bref ça risque d'être un moment mémorable. Sur un forum auquel je participe et dont le sujet est la psytrance, un sujet a été posté à propos de cet événement. Des gens ont commencé à écrire un décompte dans leurs messages : J-12, J-11 etc.

Pour faciliter le décompte, j'ai fait une petite page utilisant du javascript. Bien sûr c'est du xhtml et je la délivre en application/xhtml+xml. Seulement voilà, mélanger xhtml et javascript dans le même fichier ce n'est pas très recommandé. En effet, le javascript utilise des symboles qui peuvent causer des erreurs d'analyse xml. Exemple :

for(i = 0; i < nCount; ++i)
{
	// Fait des trucs...
}

Ici, le symbole < fait mal. C'est un caractère réservé du xml. Une première solution pour éviter l'erreur est d'utiliser une entité :

for(i = 0; i &lt; nCount; ++i)
{
	// Fait des trucs...
}

Malheureusement, ça ne fonctionne pas avec tous les navigateurs (enfin, ça ne fonctionne pas avec IE en tout cas). De plus, cela nuit à la lisibilité.

Une autre solution consiste à indiquer à l'analyseur xml de ne pas faire l'analyse du code javascript. Ça se fait en englobant le code entre <![CDATA[ et ]]>. Oui je sais la notation est barbare mais c'est comme ça :) L'analyseur xml va comprendre que tout ce qui suit sont des caractères bruts (Character DATA), jusqu'à trouver la séquence ]]>. Après réflexion, ce n'est pas plus mal d'avoir une notation compliquée, ça réduit les chances de trouver par hasard une séquence de fin dans le code, ce qui porterait à confusion avec la vrai fin du bloc CDATA.

Bon alors cette solution est très bien pour un analyseur xml bien fait, malheureusement sous certains navigateurs ça ne fonctionne pas bien (qui a dit IE ?). Et là j'ai toujours été bloqué. Je suivais la recommandation qui disait : « dans un fichier xhtml, placez votre code javascript dans un fichier à part. ». Très bien, sauf que sur mon hébergeur j'ai une limitation en nombre de requêtes http, par conséquent j'ai souhaité pour une fois optimiser dans ce sens en n'envoyant qu'un seul fichier au navigateur. J'ai trouvé la solution sur devedge (je me demande d'ailleurs ce que devient ce site depuis la mort de Netscape) :

<script type="text/javascript">
//<![CDATA[
for(i = 0; i < nCount; ++i)
{
	// Fait des trucs...
}
//]]>
</script>

Et voilà, il suffit d'utiliser des commentaires javascript pour commenter les balises CDATA qui posent problèmes avec certains navigateurs. Quant aux bons analyseurs xml ils verront les balises CDATA et ne tenteront pas d'analyser le code javascript.