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

<chapitre typecourssiteweb="dhtml">
	<cours nomfichier="modifs">Cours de manipulation du DOM et DHTML</cours>
	<entete>
		<titre>Le DOM: modification du contenu dans un document</titre>
		<auteur email="Gilles.Chagnon@upmc.fr">G. Chagnon</auteur>
		<resume>Le DOM donne la possibilité de modifier, ajouter et supprimer du contenu dans un document.</resume>
		<motsclefs>dhtml, dom, javascript</motsclefs>
	</entete>
	<corpus>
		
		<partie titre="Introduction" ancre="intromodifs">
			<paragraphe>
				<texte>Nous avons vu dans le précédent chapitre d'<reference href="introdom.html">introduction au Document Object Model</reference> comment il était possible d'accéder à des n&#339;uds particuliers dans un document <code type='typefichier'>HTML</code>. Nous allons voir maintenant comment il est possible d'en <reference href="#modification">modifier le contenu</reference>, d'en <reference href="#ajout">ajouter</reference> ou de <reference href="#suppression">supprimer</reference> des éléments.</texte>
				<texte>Dans toute la suite, on considérera que l'on a déjà sélectionné un élément <code>elt</code>.</texte>
			</paragraphe>
		</partie>
		
		<partie titre="Modification de contenu" ancre="modification">
			<section titre="Remplacement du document entier" ancre="remplacedocument">
				<paragraphe>
					<texte>Nous n'allons pas revenir dans ce cours sur le fonctionnement des méthodes <code>write()</code> et <code>writeln()</code> appliquées à l'objet <code>document</code>. Ces méthodes remplacent le contenu total du document courant par leur argument.</texte>
				</paragraphe>
			</section>
			<section titre="Modification d'attributs" ancre="modifattributs">
				<paragraphe titre="Modification des éléments de ''stylage''" ancre="style">
					<texte>On peut directement accéder aux attributs <code>id</code> et <code>class</code> d'un élément donné à l'aide des propriétés correspondantes <code>id</code> et <code>className</code>. Il est donc possible de modifier la manière dont un élément est affiché, simplement en changeant son identifiant ou bien sa classe, en rapport avec une feuille de style <code type='typefichier'>CSS</code>.</texte>
					<texte>De plus, ainsi que nous l'avons déjà pratiqué, il est possible d'avoir accès séparément à toutes les propriétés de feuille de style pour l'élément sélectionné en faisant appel à la collection <code>style</code>. Par exemple, <code>elt.style.fontSize='1.2em'</code> ajuste la taille de la police de l'élement sélectionné à 120% de sa taille par défaut. On rappelle que dans le cas des propriétés dont le nom en <code type="langage">CSS</code> comporte un trait d'union, <code type="langage">JavaScript</code> demande l'utilisation d'une majuscule (comme par exemple la propriété précédente).</texte>	
				</paragraphe>
				<paragraphe titre="Modification des autres attributs" ancre="autresattr">
					<texte>L'attribut <code>lang</code> est accessible directement grâce à la propriété... <code>lang</code>.</texte>
					<texte>L'attribut <code>tabIndex</code> est lui aussi modifiable directement par la propriété du même nom.</texte>
					<texte>Plus généralement, on peut faire appel à la méthode <code>setAttribute()</code>. Par exemple, <code>elt.setAttribute("align", "center")</code> permet de modifier l'attribut <code>align</code> de l'élément courant de telle manière que ce dernier soit centré.</texte>
				</paragraphe>
				<exercice titre="Modifications d'attributs" ancre="exoattributs">
					<enonce href="exercices/exo8.html"/>
					<correction href="exercices/exo8cor.html"/>
				</exercice>
			</section>
			<section titre="Modification d'éléments" ancre="modifelements">
				<paragraphe titre="Changement d'un élément" ancre="changeelementname">
					<texte>On peut remplacer un élément par un autre par la méthode <code>replaceChild</code>, sous réserve de l'avoir créé au préalable. On l'appelle comme suit&#160;: <code>elt.replaceChild(newChild, oldChild)</code> (voir plus loin pour l'étape préalable de <reference href="#creation">création d'un n&#339;ud</reference>).</texte>
				</paragraphe>
				<paragraphe titre="Contenu d'un n&#339;ud" ancre="modifcontenu">
					<texte>Deux propriétés permettent de modifier le contenu d'un élément déterminé. Nous avons déjà rencontré <code>innerHTML</code>. <code>elt.innerHTML="Ceci est un texte &lt;b&gt;en gras&lt;/b&gt;."</code> affecte cette chaîne de caractères à l'élément.</texte>
					<texte>On peut également avoir accès à la <valeur>valeur</valeur> d'un n&#339;ud, avec la propriété <code>nodeValue</code>. Cette propriété renvoie des résultats différents selon le n&#339;ud auquel elle est appliquée&#160;:</texte>
					<tableau>
						<ligne type="header">
							<colonne id="noeud"><texte>Type de n&#339;ud</texte></colonne>
							<colonne id="valeur"><texte>Valeur retournée par <code>nodeValue</code></texte></colonne>
						</ligne>
						<ligne>
							<colonne headers="noeud"><texte>attribut</texte></colonne>
							<colonne headers="valeur"><texte>Valeur de l'attribut</texte></colonne>
						</ligne>
						<ligne>
							<colonne headers="noeud"><texte>Section CDATA</texte></colonne>
							<colonne headers="valeur"><texte>Contenu de la section</texte></colonne>
						</ligne>
						<ligne>
							<colonne headers="noeud"><texte>document</texte></colonne>
							<colonne headers="valeur"><texte><code>null</code></texte></colonne>
						</ligne>
						<ligne>
							<colonne headers="noeud"><texte>element</texte></colonne>
							<colonne headers="valeur"><texte><code>null</code></texte></colonne>
						</ligne>
						<ligne>
							<colonne headers="noeud"><texte>texte</texte></colonne>
							<colonne headers="valeur"><texte>Contenu du n&#339;ud texte</texte></colonne>
						</ligne>
						<legende>Valeur retournée par <code>nodeValue</code> pour chaque type de nœud.</legende>
					</tableau>
				</paragraphe>
			</section>
		</partie>
		
		<partie titre="Ajout de contenu" ancre="ajout">
			<section titre="Méthodes de création de n&#339;uds" ancre="creation">
				<paragraphe titre="Création ex-nihilo" ancre="exnihilo">
					<texte>Deux méthodes appliquées à l'objet <code>document</code> et une méthode appliquée à un objet déjà existant permettent de créer des n&#339;uds à partir de rien. Le résultat de ces méthodes est un n&#339;ud n'ayant aucun parent. Il est donc nécessaire, ce que nous verrons par la suite, d'<reference href="#affectation">affecter ce n&#339;ud à un n&#339;ud déjà existant</reference>.</texte>
					<liste>
						<item><texte><code>createElement</code> permet de créer un... élément. Par exemple, <code>preface=document.createElement("div")</code> crée un élément <code>div</code>.</texte></item>
						<item><texte><code>createTextNode</code> permet de créer un... n&#339;ud de type texte. Par exemple, <code>dublabla=document.createTextNode("un peu de blabla")</code> crée un contenu <code>"un peu de blabla"</code>.</texte></item>
						<item><texte><code>cloneNode(deep)</code> permet de créer une copie de l'élément courant. Le booléen <code>deep</code> permet de paramétrer le niveau de profondeur de la copie. Quand <code>deep</code> vaut <code>false</code>, seuls le nom de la balise et ses attributs sont copiés. Quand <code>deep</code> vaut <code>true</code>, le contenu de l'élément est lui aussi copié. Par exemple, <code>parag=document.getElementById("monpar"); parag2=parag.cloneNode(true)</code> crée une copie de l'élément d'identifiant <code>monpar</code>, texte inclus compris.</texte></item>
					</liste>
				</paragraphe>
				<paragraphe titre="Affectation d'un n&#339;ud à un autre n&#339;ud" ancre="affectation">
					<texte>La méthode standard est la méthode <code>appendChild()</code> appliquée à un élément donné. Supposons par exemple créés les éléments <code>para1</code> et <code>spanauteur</code>. On peut affecter <code>spanauteur</code> à <code>para1</code> en exécutant <code>para1.appendChild(spanauteur);</code></texte>
					<texte>On peut aussi directement créer un attribut et l'attacher à un élément existant par la méthode <code>createAttribute()</code>. Ainsi, <code>attr_alignement=document.createAttribute("align"); attr_alignement.nodeValue="center";para1.setAttributeNode(attr_alignement);</code> permet d'affecter à l'élément <code>para1</code> l'attribut <code>align</code> avec la valeur <code>center</code>.</texte>
				</paragraphe>
				<paragraphe titre="Ajout local" ancre="ajoutlocal">
					<texte>Enfin, étant donné un n&#339;ud créé au préalable avec <code>createElement</code>, on peut l'affecter en amont d'un autre élément. Par exemple,</texte>
					<exemplejavascript>
						<variable name="div1"/><autres>=</autres><propriete name="document."/><fonction name="getElementById"><autres>"parentDiv"</autres></fonction><finligne/>
						<variable name="p2"/><autres>=</autres><propriete name="document."/><fonction name="getElementById"><autres>"enfantP"</autres></fonction><finligne/>
						<variable name="p1"/><autres>=</autres><propriete name="document."/><fonction name="createElement"><autres>"p"</autres></fonction><finligne/>
						<propriete name="div1.."/><fonction name="insertBefore"><autres>p1,p2</autres></fonction><finligne/>
					</exemplejavascript>
					
					<texte>... repère d'abord dans le document le <code>div</code> d'identifiant <code>parentDiv</code>, puis l'élément <code>p</code> d'identifiant <code>enfantP</code>, crée un élément <code>p</code> supplémentaire, puis l'insère avant le précédent.</texte>
				</paragraphe>
				<exercice titre="Créer et ajouter des éléments" ancre="exoajoutselements">
					<enonce href="exercices/exo9.html"/>
					<correction href="exercices/exo9cor.html" description="Ajout d'un élément de liste"/>
					<correction href="exercices/exo9_2cor.html" description="Ajout d'un bouton"/>
				</exercice>
			</section>
		</partie>
		
		<partie titre="Suppression de contenu" ancre="suppression">
			<section ancre="supprimenodes" titre="Suppression de n&#339;uds">
				<paragraphe titre="Suppression d'un n&#339;ud quelconque" ancre="supprimequelconque">
					<texte>Il est possible de supprimer un enfant quelconque grâce à la méthode <code>removeChild</code>. Par exemple</texte>
					<exemplejavascript>
						<variable name="elt"/><autres>=</autres><propriete name="document."/><fonction name="getElementById"><autres>"div1"</autres></fonction><finligne/>
						<variable name="elt_inclus"/><autres>=</autres><propriete name="document."/><fonction name="getElementById"><autres>"para1"</autres></fonction><finligne/>
						<variable name="elt_rejete"/><autres>=</autres><variable name="elt."/><fonction name="removeChild"><variable name="elt_inclus"/></fonction><finligne/>
					</exemplejavascript>
				</paragraphe>
				<paragraphe titre="Suppression d'un attribut" ancre="supprimeattribut">
					<texte>Un attribut peut être supprimé de deux manières différentes&#160;:</texte>
					<liste type="ordonnee">
						<item><texte>soit en utilisant directement son nom, par la méthode <code>removeAttribute</code>. Par exemple, <code>elt.removeAttribute("align")</code> supprime l'attribut <code>align</code> de l'élément.</texte></item>
						<item>
							<texte>soit en supprimant le <valeur>n&#339;ud</valeur> attribut correspondant avec la méthode <code>removeAttributeNode</code>. Par exemple</texte>
							<exemplejavascript>
								<variable name="elt"/><autres>=</autres><propriete name="document."/><fonction name="getElementById"><autres>"top"</autres></fonction><finligne/>
								<variable name="attr_align"/><autres>=</autres><variable name="elt"/><fonction name=".getAttributeNode"><autres>"align"</autres></fonction><finligne/>
								<variable name="elt"/><fonction name=".removeAttributeNode"><variable name="attr_align"/></fonction><finligne/>
							</exemplejavascript>
						</item>
					</liste>
				</paragraphe>
			</section>
			<exercice titre="Suppression d'éléments" ancre="exosupprime">
				<enonce href="exercices/exo10.html"/>
				<correction href="exercices/exo10cor.html"/>
			</exercice>
			<!--<section titre="Effacement total d'un document" ancre="effacement">
				<paragraphe>
					<texte>On peut également effacer <valeur>totalement</valeur> un document à l'écran, à l'aide de <code>document.clear()</code>.</texte>
				</paragraphe>
			</section>-->
		</partie>
	</corpus>
</chapitre>

