<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE chapitre SYSTEM "../ressources/chapitre22.dtd">

<chapitre typecourssiteweb="dhtml">
	<cours nomfichier="intro">Cours de manipulation de JavaScript</cours>
	<entete>
		<titre>Premiers effets</titre>
		<auteur email="Gilles.Chagnon@upmc.fr">G. Chagnon</auteur>
		<resume>Ce chapitre présente quelques effets simples applicables à une page Web via JavaScript.</resume>
		<motsclefs>dhtml, dom, javascript</motsclefs>
	</entete>
	<corpus>
		<partie ancre="gene" titre="Généralités">
			<section titre="Qu'est-ce que le DOM&#160;?" ancre="koikce">
				<paragraphe>
					<texte>Le <reference href="http://www.w3.org/DOM/"><acronyme titre="Document Object Model" lang="en">DOM</acronyme></reference>, ou <autrelangue type="en">Document Object Model</autrelangue> est un standard du W3C désignant l'ensemble des techniques permettant à un langage de script (comme JavaScript) d'accéder au contenu d'un document balisé (comme par exemple une page (X)HTML).</texte>
				</paragraphe>
			</section>
			<section titre="À quoi cela sert-il&#160;?" ancre="utilite">
				<paragraphe>
					<liste>
						<item><texte>Le <code type="langage">HTML</code> «&#160;standard&#160;» est statique. La page est chargée sur le navigateur de l'internaute, et son affichage est défini une fois pour toutes. Si l'on revient sur cette page un autre jour, elle n'aura pas changé d'aspect. On peut considérer que le <code type="langage">DOM</code> permet d'aller au-delà de cet aspect statique.</texte></item>
						<item><texte>Mais ajouter des animations à une page est un acte gratuit et inutile si cela n'apporte rien à l'internaute. Le <code type="langage">JavaScript</code> permet d'augmenter le niveau d'<valeur>interactivité</valeur> de l'utilisateur, voire de concevoir des applications en ligne.</texte></item>
						<item><texte>Ces animations supplémentaires ne sont traitées que sur la machine de l'internaute, ce qui allège d'autant les charges reposant sur le serveur.</texte></item>
					</liste>
				</paragraphe>
			</section>
			<section titre="Quelles sont les techniques mises en jeu&#160;?" ancre="techniques">
				<paragraphe>
					<texte>Le <code type="langage">DOM</code> est la conjonction d'un ensemble de techniques, qui sont supportées par les plus récentes versions des navigateurs (partiellement à partir de la version 4 d'<logiciel>Internet Explorer</logiciel> et 5 d'<logiciel>Opéra</logiciel>, des versions 4 de <logiciel>Netscape</logiciel>&#160;; presque totalement et de manière «&#160;compatibilisable&#160;» à partir des versions 6, ainsi que toutes les versions de <logiciel>Mozilla</logiciel>).</texte>
					<liste type="ordonnee">
						<item><texte>une vue orientée objet de la page web et de ses éléments. Chaque élément <code><![CDATA[<tag id="id_du_tag"> blabla </tag>]]></code> est identifié par son identifiant (l'attribut <code>id</code>) et accessible de manière univoque. De plus, la structure entière de la page peut être représentée sous la forme d'une arborescence, permettant l'accès direct (et la modification) à chacun de ses éléments. C'est à proprement parler cette structure qui constitue le <acronyme titre="Document Object Model">DOM</acronyme> du W3C.</texte></item>
						<item><texte>l'appel systématique aux feuilles de style (les <acronyme titre="Cascading StyleSheets">CSS</acronyme>) qui permettent une modification précise de l'apparence de chacun des éléments.</texte></item>
						<item><texte>le recours éventuel à des langages de script pour la gestion des événements. Nous nous limiterons au <code type="langage">JavaScript</code>, mais cela pourrait être du <code type="langage">VBscript</code>.</texte></item>
					</liste>
				</paragraphe>
			</section>
			<!--<section titre="Je sais programmer en Flash; que m'apporte le DHTML?" ancre="flash_et_dhtml">
				<paragraphe>
					<texte>Plusieurs arguments plaident en faveur d'une répartition des tâches entre DHTML et Flash. Flash est sur-compétent, par exemple, pour la réalisation d'un simple effet de <autrelangue type="en">roll-over</autrelangue> (le fait qu'une image change au passage de la souris), ou pour la réalisation d'un menu déroulant. De plus, un code Flash est en format propriétaire, et nécessite un logiciel dédié pour sa maintenance, alors qu'un effet DHTML ne demande qu'un éditeur de texte de base. En règle générale d'ailleurs, comme vous le verrez, la réalisation d'un effet DHTML ne demande pas l'apprentissage d'un nouveau langage de programmation&#160;: il suffit de connaître <code type="langage">HTML</code> et <code type="langage">CSS</code> d'une part, et quelques instructions supplémentaires de JavaScript d'autre part pour écrire un code propre et maintenable.</texte>
				</paragraphe>
				</section> -->
		</partie>
		
		<partie titre="Les premiers effets" ancre="premierspas">
			<section titre="Attributs de gestion d'événements" ancre="attributs">
				<paragraphe titre="Introduction" ancre="attributs_intro"><texte>La gestion d'événements est un processus complexe si on veut pouvoir tirer parti de toutes les possibilités offertes par le DOM. Fort heureusement, lorsqu'il s'agit de coder un effet simple, destiné à n'être utilisé que ponctuellement dans un fichier, il est possible de faire appel aux attributs définis dans la recommandation HTML.</texte></paragraphe>
				<paragraphe titre="Les attributs" ancre="liste_attributs">
					<texte>Ces attributs définis dans la recommandation du W3C sont suffisants pour la gestion des événements de base. On trouve&#160;:</texte>
					<liste>
						<item>
							<texte>Les attributs de gestion des boutons de la souris&#160;: <code>onclick</code> et <code>ondblclick</code> permettent la prise en compte d'un clic simple ou d'un double clic, tandis que <code>onmousedown</code> et <code>onmouseup</code> détectent si un bouton de la souris a été enfoncé ou relaché.</texte>
						</item>
						<item>
							<texte>Les attributs de gestion des déplacements de la souris&#160;: <code>onmouseover</code> et <code>onmouseout</code> détectent si la souris passe sur la boîte de l'élément courant, ou bien la quitte.</texte>
						</item>
						<item>
							<texte>Les attributs de gestion du clavier&#160;: <code>onkeypress</code>, <code>onkeydown</code> et <code>onkeyup</code> détectent respectivement si l'utilisateur a appuyé puis relaché, simplement appuyé, ou relaché une touche du clavier.</texte>
						</item>
					</liste>
				</paragraphe>
			</section>
			<section titre="Modification des propriétés de style" ancre="modifstyle">
				<paragraphe titre="Introduction" ancre="styleintro">
					<texte>Il est possible de modifier localement les propriétés de style d'un élément. On fait alors appel à l'objet courant <code>this</code> en <code type="langage">JavaScript</code>. En voici quelques exemples&#160;: </texte>
					<exemple type="HTML">
						<element nom="p">
							<attribut nom="onmouseover">this.style.color='blue'</attribut>
							<attribut nom="onmouseout">this.style.color='black'</attribut>
							Ceci est un texte dont la couleur va changer au passage de la souris.
						</element>
					</exemple>
					<exemple type="HTML">
						<element nom="p">Exemple de texte à géométrie variable. Exemple de texte à géométrie variable. Exemple de texte à géométrie variable. Exemple de texte à géométrie variable. Exemple de texte à géométrie variable. Exemple de texte à géométrie variable.Exemple de texte à géométrie variable. Exemple de texte à géométrie variable.Exemple de texte à géométrie variable. Exemple de texte à géométrie variable. Exemple de texte à géométrie variable. Exemple de texte à géométrie variable. Exemple de texte à géométrie variable.
							<attribut nom="style">position: absolute; left: 10px; top: 230px; width:400px</attribut>
							<attribut nom="onmouseover">this.style.left='100px'; this.style.top='300px'; this.style.width='600px'; this.style.textAlign='center'</attribut>
							<attribut nom="oumouseout">this.style.left='10px'; this.style.top='230px'; this.style.width='400px'; this.style.textAlign='left'</attribut>
						</element>
					</exemple>
					<texte>Noter dans l'exemple précédent l'utilisation de majuscules pour éviter d'utiliser le tiret présent dans la propriété CSS, mais qui a un sens différent en JavaScript, puisqu'il permet d'effectuer une soustraction.</texte>
					<texte>Il y a une autre exception, avec la propriété <code>float</code>&#160;: elle est accessible via la propriété <code>this.styleFloat</code> pour <logiciel lang="en">Internet Explorer</logiciel>, et <code>this.style.cssFloat</code> pour les autres navigateurs.</texte>
				</paragraphe>
				<exercice titre="Modification de la couleur" ancre="modifcouleur">
					<enonce href="exercices/exo1.html"/>
					<correction href="exercices/exo1cor.html"/>
				</exercice>
				<exercice titre="Déplacement d'élément" ancre="modifposition">
					<enonce href="exercices/exo2.html"/>
					<correction href="exercices/exo2cor.html"/>
				</exercice>
				<exercice titre="Modification de la police" ancre="modifpolice">
					<enonce href="exercices/exo3.html"/>
					<correction href="exercices/exo3cor.html"/>
				</exercice>
			</section>
			<section titre="Modification d'un attribut quelconque" ancre="modifattribut">
				<paragraphe>
					<texte>Il est aussi possible de modifier d'une manière similaire n'importe quel attribut d'un élément.</texte>
				</paragraphe>
				<exercice titre="Modification de contenu" ancre="modifcontenu">
					<enonce href="exercices/exo4.html"/>
					<correction href="exercices/exo4cor.html"/>
				</exercice>
			</section>
			<section titre="Utilisation des feuilles de style" ancre="feuilledestyle">
				<paragraphe>
					<texte>On peut aussi utiliser directement les propriétés de feuille de style, sans faire appel aux attributs de gestion des événements, avec notamment la pseudo-classe <code>hover</code>. Malheureusement <logiciel>Internet Explorer</logiciel> jusqu'à la version 6 ne prend en charge cette pseudo-classe que sur l'élément <code>a</code>, contrairement aux recommandations du W3C.</texte>
				</paragraphe>
				<exercice titre="Menu à onglets" ancre="exo_onglets">
					<enonce href="exercices/exo5.html"/>
					<correction href="exercices/onglets.css"/>
				</exercice>
			</section>
		</partie>
	</corpus>
</chapitre>

