<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
"http://openweb.eu.org/dtd/docbkx42/docbookx.dtd">
<article lang="fr" role="article" id="ecmascript_html">
	<articleinfo>
		<title>ECMAScript et (X)HTML</title>
		<pubdate>2003-03-21</pubdate>
		<date>2005-03-21</date>
		<author>
			<firstname>Steve</firstname>
			<surname>Frécinaux</surname>
		</author>
		<subjectset>
			<subject role="profil">
				<subjectterm>debutant</subjectterm>
				<subjectterm>expert</subjectterm>
			</subject>
			<subject role="technologie">
				<subjectterm>dom</subjectterm>
			</subject>
			<subject role="theme">
				<subjectterm>pages_dynamiques</subjectterm>
			</subject>
		</subjectset>
		<abstract>
			<para>Comment insérer un script ECMAScript dans un fichier HTML</para>
		</abstract>
	</articleinfo>
  <section>
  	<title>Implanter un script dans le code d'une page <acronym>HTML</acronym></title>
  	<para>Pour rendre dynamique une page web, il faut lui intégrer un script. Pour ce faire, on utilise donc la bien nommée balise <token>&lt;script&gt;</token>, laquelle accepte un attribut <token>type</token> pour définir le langage utilisé. Dans une page <acronym>HTML</acronym>, le langage utilisé est quasiment toujours l'E<acronym>CMAScript</acronym>, et cet attribut doit donc prendre, dans ce cas, la valeur <token>text/javascript</token>. (Ça peut sembler étrange, mais c'est comme ça, raisons historiques obligent).</para>
  	<para>Un script inclus dans une page ressemble donc à ceci :</para>
  <programlisting>&lt;script type="text/javascript"&gt;
    /* Votre script ici */
  &lt;/script&gt;</programlisting>
  	<para>Cependant, suivant que l'on travaille en <acronym>HTML</acronym> ou en <acronym>XHTML</acronym>, certains petits problèmes peuvent se présenter.</para>
  	<para>En <acronym>HTML</acronym>, l'habitude qui prévaut est d'entourer le script de commentaires <acronym>HTML</acronym> :</para>
  <programlisting>&lt;script type="text/javascript"&gt;
    &lt;!--
      /* Votre script ici */
    // --&gt;
  &lt;/script&gt;</programlisting>
  	<para>Cette habitude, héritée des temps anciens où certains navigateurs ne connaissaient pas la balise <token>&lt;script&gt;</token> et affichaient alors bêtement le code source, n'est plus vraiment d'actualité aujourd'hui, car les analyseurs <acronym>HTML</acronym> (le validateur du <acronym>W3C</acronym> y compris) reconnaissent que le contenu de la balise <token>&lt;script&gt;</token> n'est pas du <acronym>HTML</acronym>, et ils ne rouspèteront pas, même si votre code contient des caractères spéciaux tels <token>&lt;</token>, <token>&gt;</token> ou <token>&amp;</token>. Cependant, cette habitude ne coûte rien, et en vertu du sacro-saint principe de précaution, je vous conseillerais de continuer à l'utiliser.</para>
  </section>
  <section>
  	<title>Le cas <acronym>XHTML</acronym></title>
  	<para>En <acronym>XHTML</acronym>, par contre, un double problème se pose :
  le validateur trébuche systématiquement sur les caractères <token>&lt;</token>, <token>&gt;</token> ou <token>&amp;</token>, lesquels ne sont pas valides en <acronym>XML</acronym> en dehors de leurs utilisations dédiées (<token>&lt;</token> et <token>&gt;</token> délimitent des balises, <token>&amp;</token> indique le début d'une entité).</para>
  	<para>la norme <acronym>XML</acronym> indique que les analyseurs peuvent supprimer sans condition les commentaires <acronym>XML</acronym>, et ceux-ci ne s'en privent pas. Autrement dit, mettre le script "tout nu", ça ne fonctionne pas, et l'encadrer de commentaires ne fonctionne pas non plus.</para>
  	<para>La première solution serait donc d'encoder les caractères délictueux à l'aide des entités <token>&amp;lt;</token>, <token>&amp;gt;</token> et <token>&amp;amp;</token>. Solution tout à fait correcte si ce n'est qu'elle a tendance à rendre le code illisible, et qu'elle peut rapidement s'avérer un vrai casse-tête.</para>
  	<para>L'autre solution est d'utiliser un outil qui nous est fourni par la spécification <acronym>XML</acronym> : les sections <token>CDATA</token>. Les sections <token>CDATA</token> permettent d'indiquer à l'analyseur <acronym>XML</acronym> que le bloc de texte encadré, contenant des caractères qui seraient autrement reconnus comme du balisage, est en fait du texte brut. Ce qui nous arrange bien, cela va nous permettre d'éviter l'analyse du bloc de code <acronym>ECMAScript</acronym> :</para>
  <programlisting>&lt;script type="text/javascript"&gt;
    // &lt;![CDATA[
      /* Votre script ici */
    // ]]&gt;
  &lt;/script&gt;</programlisting>
  	<para>Attention, votre script ne devra pas contenir la chaîne <token>]]&gt;</token>, qui indiquerait à l'analyseur une fin prématurée de la section <token>CDATA</token>, et provoquerait donc une erreur.</para>
  	<para>Comme les pages <acronym>XHTML</acronym> sont souvent servies en tant que <acronym>HTML</acronym> et non en tant que <acronym>XML</acronym> (notamment parce que Internet Explorer ne le gère pas), et que les analyseurs <acronym>HTML</acronym> ne connaissent pas la section <token>C</token>DATA, vous remarquerez que les balises <token>&lt;![CDATA[ </token>et <token>]]&gt;</token> sont placées dans des commentaires du script.</para>
  </section>
  <section>
  	<title>Inclure un fichier externe</title>
  	<para>Il faut aussi savoir que la balise <token>&lt;script&gt;</token> peut être utilisée d'une autre façon, afin d'inclure un fichier externe, lequel ne sera pas sujet aux problèmes discutés précédemment :</para>
  <programlisting>&lt;script type="text/javascript" src="monscript.js"&gt;&lt;/script&gt;</programlisting>
  	<para>L'attribut <token>src</token> désigne alors le chemin, relatif ou absolu, vers le fichier contenant le script. Le fichier inclus ne doit contenir que de l'<acronym>ECMAScript</acronym>, il ne faut pas y mettre de commentaires <acronym>HTML</acronym>, ni de balise <token>&lt;script&gt;</token> !</para>
  	<para>Cette méthode a quelques avantages par rapport au fait de mettre directement le script dans le code source de la page, grosso-modo les mêmes que les avantages liés aux feuilles CSS externes :</para>
  	<itemizedlist>
  		<listitem>
  			<para>les pages sont plus légères, et le fichier du script n'est chargé qu'une seule fois depuis l'internet, d'où un chargement en moyenne plus rapide ;</para>
  		</listitem>
  		<listitem>
  			<para>La mise à jour en est facilitée, car il ne faut modifier qu'un seul fichier.</para>
  		</listitem>
  	</itemizedlist>
  </section>
  <section>
  	<title>Associer un comportement aux objets d'une page</title>
  	<para>Une fois le script associé à une page, encore faut-il, pour rendre la page réactive, associer une action à une intervention du visiteur (clic, mouvement de la souris). Pour ce faire, il existe, en <acronym>HTML</acronym> tout comme en <acronym>XHTML</acronym>, toute une série d'attributs, comme <token>onclick</token> ou <token>onmouseover</token>. Dans l'exemple suivant, la fonction <token>DoSomething()</token> est exécutée quand la souris arrive sur l'image :</para>
  <programlisting>&lt;img src="logo.jpg"
     alt="OpenWeb.eu.org, pour les standards du Web"
     width="785"
     height="258"
     onmouseover="DoSomething();" /&gt;</programlisting>
  	<para>Mais, dans ce cas, se pose un nouveau problème pour le navigateur : dans quel langage est programmée l'expression <token>DoSomething()</token> ? Pour lever cette ambiguïté, vous devez donc indiquer un langage de script par défaut dans l'en-tête du document <acronym>HTML</acronym> :</para>
  <programlisting>&lt;meta
     http-equiv="Content-Script-Type"
     content="text/javascript" /&gt;</programlisting>
  	<para>Il existe une autre façon d'associer des actions aux événements déclenchés par le visiteur, directement à partir du code <acronym>ECMAScript</acronym>, par l'intermédiaire des attributs <token>id</token> et <token>class</token>. Dans la mesure où cette façon de faire est supportée par les navigateurs supportant le <acronym>DOM</acronym>, je vous encourage à utiliser cette seconde méthode, qui a l'avantage de ne pas encombrer le code <acronym>HTML</acronym> avec quoi que ce soit relatif au dynamisme de la page (à l'image de ce qui se fait avec <acronym>CSS</acronym> au niveau de la présentation), et de faciliter ainsi les modifications et les mises à jours. Pour poursuivre sur ce sujet, Nous vous invitons à lire <ulink url="http://pompage.net/pompe/separation/">Séparer le comportement de la structure</ulink>.</para>
  </section>
</article>