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

<chapitre typecourssiteweb="dhtml">
	<cours nomfichier="jquery">Cours de JavaScript</cours>
	<entete>
		<titre>Initiation à la bibliothèque jQuery</titre>
		<auteur email="Gilles.Chagnon@sorbonne-universite.fr">G. Chagnon</auteur>
		<resume>Ce chapitre présente les bases permettant d'utiliser la bibliothèque jQuery.</resume>
		<motsclefs>jquery</motsclefs>
	</entete>
	<corpus>
		<partie titre="Introduction" ancre="jqintro">
			<section titre="Principe" ancre="jqhisto">
				<paragraphe>
					<texte>jQuery est une bibliothèque <code type="langage">JavaScript</code> qui a pour but  de soulager le développeur des tâches fastidieuses de gestion de compatibilité inter-navigateurs, ainsi que de lui fournir des effets classiques «&#160;clef en main&#160;». Une fonction incontournable de cette bibliothèque est la fonction <code>$</code>, qui a de multiples usages comme nous allons le voir. Le but de ce chapitre n'est pas de donner une liste détaillée de toutes les propriétés et méthodes définies par cette bibliothèque. Le <reference href="http://jquery.com/">site officiel de jQuery</reference> le fait bien plus complètement&#160;; il s'agit simplement de fournir les bases permettant de saisir le principe de fonctionnement de la bibliothèque.</texte>
				</paragraphe>
			</section>
			<section titre="Utilisation" ancre="jqpcp">
				<paragraphe titre="Chargement de la bibliothèque" ancre="jqload">
					<texte>Pour commencer, il faut évidemment télécharger la bibliothèque, qui est disponible sur le site officiel. Il suffit ensuite de l'incorporer à l'aide d'un élément <code>script</code> dans l'entête du document <code type="typefichier">HTML</code>&#160;:</texte>
					<exemple type="HTML">
<element nom="script"><attribut nom="type">text/javascript</attribut><attribut nom="src">CheminRelatifVersLeFichierjQuery.js</attribut></element>
					</exemple>
					<texte>Le script doit être présent sur le serveur afin de limiter les risques de rejet du code lié à la protection contre les scripts inter-domaines.</texte>
				</paragraphe>
				<paragraphe titre="Lancement au chargement de la page" ancre="jqdocready">
					<texte>Il est usuel d'utiliser l'événement <code>load</code> sur l'élément <code>body</code> pour ne lancer un script que lorsque l'on est sûr que l'intégralité du <abreviation titre="Document Object Model" lang="en">DOM</abreviation> a été chargée, ou, mieux, de ne lancer un gestionnaire qu'une fois que le DOM de la page a été chargé&#160;: <code>document.addEventListener("DOMContentLoaded", gestionnaire, false);</code>. jQuery offre une méthode plus souple, à l'aide de la méthode <code>ready&#160;:</code></texte>
					<exemplejavascript><fonction name="$"><autres>document</autres></fonction><autres>.</autres><fonction name="ready"><variable name="GestionnaireALancer"/></fonction><finligne/></exemplejavascript>
					<texte>On peut ainsi écrire...</texte>
					<exemplejavascript><fonction name="$"><autres>document</autres></fonction><autres>.</autres><fonction name="ready"><autres>function(){...}</autres></fonction><finligne/></exemplejavascript>
					<texte>... ou...</texte>
					<exemplejavascript><fonction name="$"><autres>document</autres></fonction><autres>.</autres><fonction name="ready"><autres>Gestionnaire</autres></fonction><finligne/>
					<sautligne/>
					<instruction name="function"/><autres> Gestionnaire(evt)</autres><sautligne/>
					<bloc>
						<autres>...</autres>
					</bloc>
					</exemplejavascript>
					<texte>Il suffit de placer cette ligne de code entre les balises <code><![CDATA[<script>]]></code> et <code><![CDATA[</script>]]></code> dans l'entête du document <code type="typefichier">HTML</code>.</texte>
				</paragraphe>
			</section>
			<section titre="Utilisation de plugins" ancre="plugins">
				<paragraphe>
					<texte><code>jQuery</code> est très utile en combinaison avec des extensions, ou plugins. Il en existe de toutes sortes, disponibles sur le <reference href="http://plugins.jquery.com/">site officiel des plugins</reference>, où des démonstrations sont possibles. Avant de réaliser un effet, il est souvent judicieux de vérifier s’il n’existe pas déjà un plugin qui permet de le réaliser, souvent avec des options attractives.</texte>
					<texte>Pour utiliser un plugin, il suffit de charger au préalable la bibliothèque, puis le fichier <code type="langage">JavaScript</code> de l’extension.</texte>
				</paragraphe>
			</section>
		</partie>
		<partie titre="Les sélecteurs" ancre="jqselec">
			<section titre="Sélecteurs de base" ancre="jqbase">
				<paragraphe>
					<texte>La fonction <code>$</code> permet de sélectionner directement des éléments à l’aide de la syntaxe <code type="langage">CSS</code>&#160;:</texte>
					<liste>
						<item><texte><code>$("#ident")</code> sélectionne l'élément d'identifiant <code>ident</code>&#160;; c'est donc l'équivalent d'un <code>document.getElementById("ident")</code> en plus court</texte></item>
						<item><texte><code>$("nomÉlément")</code> sélectionne les éléments portant un nom donné. Par exemple, <code>$("p")</code> sélectionne tous les éléments <code>p</code> du document. Il s'agit toujours d'un tableau à une dimension (même s’il n’y a qu’un seul élément dans le document)&#160;: par exemple, <code>$("h2")[1]</code> cible le deuxième élément <code>h2</code> du document.</texte></item>
						<item><texte><code>$(".truc")</code> sélectionne les éléments portant la classe <code>truc</code>, c'est-à-dire tous ceux pour lesquels l'attribut <code>class</code> vaut <code>truc</code>. De même, <code>$(".truc.machin")</code> sélectionne les éléments portant les classes <code>truc</code> <valeur>et</valeur> <code>machin</code>.</texte></item>
						<item><texte><code>$("*")</code> sélectionne tous les éléments.</texte></item>
					</liste>
					<texte>Il est possible d'indiquer plusieurs sélecteurs, à la manière des <code type="langage">CSS</code>&#160;: <code>$(".truc, div, #machin")</code> sélectionne tous les éléments de classe <code>truc</code>, tous les éléments <code>div</code> et l'élément d'identifiant <code>machin</code>.</texte>
					<texte><valeur>Remarque&#160;:</valeur> la plupart du temps, on obtient un tableau. Sa taille est évidemment disponible grâce à la propriété <code>length</code>. Par exemple, <code>$("p").length</code> permet de connaître le nombre de paragraphes dans un document.</texte>
				</paragraphe>
			</section>
			<section titre="Filtrage" ancre="jqfiltre">
				<paragraphe titre="Filtres sur l'arborescence" ancre="jqarbre">
					<liste>
						<item><texte><code>:first</code> sélectionne le premier élément d'une collection, <code>:last</code> le dernier. Par exemple, <code>$(".truc:last")</code> sélectionne le dernier élément de classe <code>truc</code> dans le document.</texte></item>
						<item><texte><code>:not(selecteur)</code> permet de retirer de la sélection tous les éléments spécifiés. Par exemple, <code>$(".truc:not(.machin)")</code> permet de sélectionner tous les éléments de classe <code>truc</code> ne possédant pas la classe <code>machin</code>.</texte></item>
						<item><texte><code>:header</code> sélectionne tous les titres (<code>h1</code>, <code>h2</code>, etc.)</texte></item>
						<item><texte><code>:odd</code> et <code>:even</code> sélectionne tous les éléments d'ordre respectivement impair et pair d'une collection. Par exemple, <code>$(tr:even)</code> sélectionne les lignes de tableau n°0, 2, 4, etc.</texte></item>
					</liste>
				</paragraphe>
				<paragraphe titre="Filtres de contenu" ancre="jqcont">
					<liste>
						<item><texte><code>contains(texte)</code> sélectionne tous les éléments contenant un texte donné (par exemple <code>$("p:contains(’test’)")</code> cible tous les paragraphes contenant le texte "test".</texte></item>
						<item><texte><code>has(sélecteur)</code> sélectionne les éléments contenant au moins un élément sélectionné par <code>sélecteur</code>. Par exemple, <code>$("li:has(ul)")</code> sélectionne les éléments d'item de liste (<code>li</code>) contenant au moins une liste.</texte></item>
						<item><texte><code>:empty</code> sélectionne les éléments vides.</texte></item>
					</liste>
				</paragraphe>
				<paragraphe titre="Filtres de visibilité" ancre="jqvis">
					<liste>
						<item><texte><code>:visible</code> sélectionne les éléments qui sont visibles</texte></item>
						<item><texte><code>:hidden</code> sélectionne les éléments qui ont été cachés (voir ci-après)</texte></item>
					</liste>
				</paragraphe>
				<paragraphe titre="Filtres d'attributs" ancre="jqattr">
					<liste>
						<item><texte><code>[attribut]</code> sélectionne les éléments possédant l'attribut <code>attribut</code>. Par exemple, <code>$("img[longdesc]")</code> sélectionne les éléments <code>img</code> possédant un attribut <code>longdesc</code>.</texte></item>
						<item><texte><code>[attribute=valeur]</code> sélectionne les éléments possédant un attribut <code>attribut</code> valant <code>valeur</code>. Par exemple, <code>$("td[colspan=2]")</code> sélectionne les cellules de tableaux s'étendant sur deux colonnes.</texte></item>
					</liste>
				</paragraphe>
			</section>
		</partie>
		<partie titre="Les événements" ancre="jqevent">
			<section titre="Événements du DOM" ancre="jqevtdom">
				<paragraphe>
					<texte>Les événements de la spécification du DOM sont baptisés simplement en enlevant le préfixe <code>on</code> de l'attribut <code type="langage">HTML</code> correspondant&#160;: on obtient alors l'événement <code>click</code> associé au clic de la souris. Pour gérer un événement, on utilise la méthode <code>on</code>, appliquée à un objet de type jQuery (renvoyé par la fonction <code>$</code>), et qui peut prendre trois paramètres&#160;:</texte>
					<liste type="ordonnee">
						<item><texte>une chaîne de caractères indiquant l'événement à détecter&#160;;</texte></item>
						<item><texte>une chaîne de caractères précisant éventuellement des éléments descendats (voir ci-après)&#160;;</texte></item>
						<item><texte>le nom d'une fonction à appeler quand l'événement est déclenché (ce nom doit être écrit sans parenthèses).</texte></item>
					</liste>
					<texte>On écrira par exemple <code>$("p").on("mouseover", "", survol)</code> pour lancer la fonction <code>survol</code> quand la souris passe au-dessus des paragraphes, et <code>$("p").on("mouseover", "em", survol)</code> pour ne la lancer qu'au passage des éléments <code>em</code> dans les paragraphes.</texte>
					<texte>On retire un gestionnaire d'événement avec la méthode <code>off</code> appelée avec les mêmes paramètres que le <code>on</code> qui avait servi à l'associer. Ici par exemple, on écrira <code>$("p").off("mouseover", "", survol)</code>.</texte>
				</paragraphe>
			</section>
			<section titre="Nouveaux événements" ancre="jqnvxevt">
				<paragraphe>
					<texte>jQuery définit de nouveaux événements. En voici quelques-uns&#160;:</texte>
					<liste>
						<item><texte><code>mouseenter</code> est lancé quand la souris pénètre «&#160;au-dessus&#160;» d'un élément. Il n'est actif qu'à l'<valeur>entrée</valeur> de la souris, au contraire de <code>mouseover</code> qui, lui, est lancé aussi quand la souris survole l'élément. Il est associé à <code>mouseleave</code>, qui est son pendant quand la souris quitte l'élément.</texte></item>
						<item><texte><code>scroll</code> est lancé quand l'utilisateur fait défiler la page.</texte></item>
					</liste>
				</paragraphe>
			</section>
			<section titre="Gestionnaires d’événements" ancre="gestionevt">
				<paragraphe><texte>Pour mémoire, un gestionnaire d’événement est une fonction destinée à être lancée en réponse à une action de l’utilisateur (par exemple un clic de souris sur un élément donné). De la même manière qu’avec le DOM, <code type="langage">jQuery</code> fournit deux manières de définir un gestionnaire d’événement&#160;:</texte>
					<liste>
						<item><texte>soit en indiquant le <valeur>nom</valeur> du gestionnaire, par exemple...</texte>
							<exemplejavascript>
								<fonction name="$"><autres>"p"</autres></fonction><autres>.</autres><fonction name="on"><autres>"click", "", Gestionnaire</autres></fonction><finligne/>
								<sautligne/>
								<instruction name="function"/><autres> Gestionnaire(evt)</autres><sautligne/>
								<bloc>
									<fonction name="alert" niveau="1"><autres>"Ceci est un paragraphe"</autres></fonction><finligne/>
								</bloc>
							</exemplejavascript>
						</item>
						<item><texte>soit en codant directement le gestionnaire, par exemple…</texte>
							<exemplejavascript>
								<fonction name="$"><autres>"p"</autres></fonction><autres>.</autres><fonction name="on"><autres>"click", "", function(){alert("Ceci est un paragraphe");}</autres></fonction><finligne/>
							</exemplejavascript>
						</item>
					</liste>
				</paragraphe>
			</section>
			<exercice titre="Premiers effets" ancre="exo1">
				<enonce href="exercices/exo36.html"/>
				<correction href="exercices/exo36cor.html"/>
			</exercice>
			<exercice titre="Sélecteurs" ancre="exoselect">
				<enonce href="exercices/exo37.html"/>
				<correction href="exercices/exo37cor.html"/>
			</exercice>
		</partie>
		<partie titre="Quelques effets" ancre="jqeffets">
			<section titre="Apparition, disparition" ancre="jqapp">
				<paragraphe>
					<liste>
						<item><texte><code>show()</code> et <code>hide()</code> permettent respectivement de montrer et cacher des éléments. Par exemple, <code>$("p").hide()</code> cache tous les paragraphes du document.</texte></item>
						<item><texte><code>show(vitesse)</code> et <code>hide(vitesse)</code> permettent respectivement de montrer et cacher des éléments avec une certaine vitesse. Cette vitesse est indiquée par des mots-clefs (<code>"slow"</code>, <code>"normal"</code> ou <code>"fast"</code>) ou le nombre de millisecondes que doit durer l'animation.</texte></item>
						<item><texte><code>toggle()</code> et <code>toggle(vitesse)</code> permettent de basculer d'un mode d'affichage à un autre (un élément caché devient visible, ou un élément visible devient caché).</texte></item>
						<item><texte><code>slideDown()</code> et <code>slideUp()</code> permettent de faire apparaître (respectivement disparaître) un élément à la manière d'un store se déroulant ou s'enroulant.</texte></item>
						<item><texte><code>slideToggle()</code> permet de basculer d'un mode d'affichage à un autre.</texte></item>
						<item><texte><code>fadeIn(vitesse)</code> et <code>fadeOut(vitesse)</code> permettent de faire progressivement apparaître (ou disparaître) un élément en jouant sur sa transparence.</texte></item>
					</liste>
				</paragraphe>
			</section>
			<section titre="Effets personnalisés, contrôle" ancre="jqperso">
				<paragraphe>
					<liste>
						<item><texte><code>animate(paramètres)</code> permet de contrôler une animation, via par exemple les propriétés <code type="langage">CSS</code>.</texte></item>
						<item><texte><code>stop()</code> arrête toutes les animations en cours sur le document</texte></item>
						<item><texte><code>jQuery.fx.off = true;</code> permet de désactiver toutes les animations d'un document. <code>jQuery.fx.off = false;</code> les réactive.</texte></item>
					</liste>
				</paragraphe>
			</section>
			<exercice titre="Effets" ancre="exoeffets">
				<enonce href="exercices/exo39.html"/>
				<correction href="exercices/exo39cor.html"/>
			</exercice>
		</partie>
		<partie titre="Manipulation du DOM" ancre="jqmanip">
			<section titre="Création de nœuds" ancre="jqcreate">
				<paragraphe>
					<texte>La fonction <code>$</code> permet de facilement créer des nœuds. par exemple, <code>$("<![CDATA[<div><p>Un peu de texte</p></div>]]>")</code> crée un élément <code>div</code> contenant un paragraphe. Attention cependant, un tel élément reste «&#160;en suspens&#160;» tant qu'il n'a pas été explicitement rattaché au DOM, de même qu'un élement créé avec la méthode <reference href="modifs.html#exnihilo"><code>createElement()</code></reference>.</texte>
				</paragraphe>
			</section>
			<section titre="Modification des nœuds" ancre="jqnode">
				<paragraphe>
					<texte>jQuery facilite l'accès et la modification des contenus des nœuds.</texte>
					<liste>
						<item><texte>Le code <code type="langage">HTML</code> est accessible via la méthode <code>html()</code>. Si cette méthode est appelée sans argument, elle renvoie le contenu <code>HTML</code> de l'élément sélectionné. Ainsi, si on a <code><![CDATA[<p id="p1">Un peu de texte <em>important</em>.</p>]]></code>, <code>alert($("#p1").html());</code> affichera <code><![CDATA[Un peu de texte <em>important</em>.]]></code>. Si cette méthode est appelée avec argument, alors elle permet de modifier le contenu <code>HTML</code>. Toujours avec le même code source <code type="langage">HTML</code>, <code><![CDATA[alert($("#p1").html("Un peu de texte <strong>très important</strong>."))]]></code>a pour effet de remplacer le code source initial.</texte></item>
						<item><texte>La méthode <code>text()</code> permet, elle, de lire ou de modifier le contenu textuel des éléments auxquels elle est appliquée. <code>$("#id1").text()</code> lit ainsi le contenu de l'élément d'identifiant <code>id1</code>, alors que <code>$("li").text("salut");</code> permet de modifier le contenu de tous les éléments <code>li</code> en "salut".</texte></item>
					</liste>
				</paragraphe>
			</section>
			<section titre="Insertion de contenu" ancre="jqinsert">
				<paragraphe titre="Insertion à l'intérieur d'un élément donné" ancre="jqinsdedans">
					<liste>
						<item><texte>Les méthodes <code>append(contenu)</code> et <code>prepend(contenu)</code> ajoutent <code>contenu</code> à l'élément sélectionné, respectivement à sa fin et à son début. Ces méthodes peuvent prendre en paramètres des éléments, des objets jQuery, du texte…</texte></item>
						<item><texte>Les méthodes <code>appendTo(sélecteur)</code> et <code>prependTo(sélecteur)</code> ajoutent l'élément sélectionné à la fin (respectivement au début) de l'élément spécifié par <code>sélecteur</code>. Par exemple, <code>$("<![CDATA[<span>(Fin de paragraphe)</span>]]>").appendTo($("p"));</code> ajoute un élément <code>span</code> à la fin de tous les paragraphes du document.</texte></item>
					</liste>
				</paragraphe>
				<paragraphe titre="Insertion à l'extérieur d'un élément donné" ancre="jqdehors">
					<liste>
						<item><texte>Les méthodes <code>after(contenu)</code> et <code>before(contenu)</code> ajoutent <code>contenu</code> respectivement après et avant l'élément sélectionné.</texte></item>
						<item><texte>Les méthodes <code>insertAfter(sélecteur)</code> et <code>insertBefore(sélecteur)</code> ajoutent l'élément sélectionné après (respectivement avant) l'élément spécifié par <code>sélecteur</code>. Par exemple, <code>$("<![CDATA[<p>(Fin de section)</p>]]>").insertBefore($("*:header:not(h1)"));</code> ajoute un paragraphe avant tous les titres du document, à l'exception des titres <code>h1</code>.</texte></item>	
					</liste>
				</paragraphe>
				<paragraphe titre="Insertion autour d'un élément donné" ancre="jqautour">
					<liste>
						<item><texte><code>wrap(html)</code> permet d'intégrer l'élément sélectionné dans le code <code type="langage">HTML</code> spécifié.</texte></item>
						<item><texte><code>wrap(élément)</code> permet d'intégrer l'élément sélectionné dans l'élément spécifié.</texte></item>
					</liste>
					<texte>Par exemple, <code><![CDATA[$("p").wrap($("<div></div>"));]]></code> et <code>$("p").wrap(document.createElement(div));</code> permettent d'entourer tous les paragraphes par un élément <code>div</code>.</texte>
				</paragraphe>
			</section>
			<section titre="Remplacement et suppression" ancre="jqreplsup">
				<paragraphe>
					<texte><code>replaceAll(sélecteur)</code> permet de remplacer l'élément indiqué par <code>sélecteur</code> par le contenu spécifié&#160;:ar exemple, <code><![CDATA[$("<p>Paragraphe</p>").replaceAll("h3");]]></code> remplace tous les titres de niveau 3 par des paragraphes avec le même contenu. <code>replaceWith(contenu)</code> permet de remplacer l'élément sélectionné par <code>contenu</code>&#160;: <code><![CDATA[$("em").on("click", "", function(){$(this).replaceWith("<strong>"+$(this).text()+"</strong>")});]]></code> remplace ainsi au clic un élément <code>em</code> par un élément <code>strong</code>.</texte>
					<texte>Pour vider un élément sélectionné, on fait appel à la méthode <code>empty()</code>. Par exemple, <code>$("#p1").empty()</code> laisse présent l'élément d'identifiant <code>p1</code>, mais supprime tous ses enfants. La méthode <code>remove(expression)</code> supprime de l'élément sélectionné le contenu indiqué par <code>expression</code>. Par exemple, <code>$("p").remove($(":contains('test')"));</code> supprime tous les paragraphes contenant la chaîne de caractères <code>"test"</code>.</texte>
				</paragraphe>
			</section>
			<exercice titre="Manipulation du DOM" ancre="exomanip">
				<enonce href="exercices/exo38.html"/>
				<correction href="exercices/exo38cor.html"/>
			</exercice>
		</partie>
	</corpus>
</chapitre>