Simplifiez Vos Developpements Javascript Avec Jquery
Simplifiez Vos Developpements Javascript Avec Jquery
Simplifiez Vos Developpements Javascript Avec Jquery
D epuis la nuit des temps (il y a presque une vingtaine d'années déjà !), les créa-
teurs de sites Web utilisent les langages HTML, CSS et JavaScript pour dénir
du contenu, le mettre en forme et interagir avec les internautes. JavaScript est
aujourd'hui universellement reconnu comme un des langages majeurs du Web. Il a
gagné ses lettres de noblesse lors de l'avènement du Web 2.0, en 2005. Depuis cette
époque, l'internaute et sa relation avec les autres sont devenus le centre de toutes les
attentions : chacun peut donner ses impressions sur tel ou tel article, attribuer des
notes à tel ou tel produit et ainsi inuencer les membres de sa communauté. C'est ainsi
que de nouveaux besoins d'interactivité sont apparus. JavaScript a donc rapidement
évolué en s'adaptant aux nombreuses versions des navigateurs Web qui ne cessaient de
se succéder. Cette évolution a remodelé le paysage du Web, mais, en contrepartie, le
langage JavaScript est peu à peu devenu plus complexe. Dans un souci de simplica-
tion, plusieurs cadres de travail (ou frameworks ) sont apparus. L'un d'entre eux
s'est rapidement imposé : jQuery.
Chaque framework possède sa propre philosophie. Pour l'utiliser de façon ecace, il
est nécessaire d'apprendre la syntaxe qui lui est propre, mais également de prendre
en considération la manière dont il a été pensé. Après un premier contact (que vous
jugerez peut-être un peu rude si vous n'avez jamais approché jQuery), vous compren-
drez vite à quel point ce framework peut vous faire gagner du temps et simplier vos
développements ! Si vous lisez ces lignes, c'est que, vous aussi, vous avez décidé de re-
joindre la grande famille des développeurs jQuery. Je ne peux que vous en féliciter ! Très
rapidement, votre code gagnera en clarté, en ecacité et sera plus facile à maintenir.
Bienvenue dans le monde magique de la programmation jQuery !
i
CHAPITRE 0. AVANT-PROPOS
gon technique qui entoure jQuery. À la n de la partie, vous pourrez enn écrire
vos premières lignes de code. Vous pourrez alors constater à quel point jQuery
est concis et puissant. Bienvenue dans le monde de la programmation jQuery !
2. Les bases de jQuery : dans cette partie, vous allez prendre conscience de la puis-
sance de jQuery en découvrant quelques-unes de ses facettes. Après cette lecture,
vous saurez interroger un document HTML et une feuille de styles CSS (sélection
et lecture de la valeur de la plupart des éléments), vous connaîtrez la nature des
objets retournés par les instructions jQuery et vous saurez réduire la taille du
code jQuery en chaînant les méthodes utilisées. Soyez rassurés, vous apprendrez
également à agir sur les éléments sélectionnés pour les transformer. Vous pour-
rez ainsi modier les attributs et les propriétés CSS des éléments sélectionnés,
mais aussi ajouter, réorganiser et supprimer des éléments du DOM pour mo-
dier l'agencement de la page sur laquelle vous travaillez. Et pour terminer en
beauté, vous mettrez en pratique tout ce que vous avez appris pour développer
un questionnaire interactif en jQuery.
3. Aller plus loin avec jQuery : vous avez déjà fait connaissance avec la ges-
tion événementielle dans le TP de la deuxième partie. Cela vous a permis de
réagir au survol d'un lien hypertexte. Ce chapitre va aller beaucoup plus loin
en présentant les très nombreux événements (clavier, souris, éléments et pages)
qui peuvent être gérés par du code jQuery. Vous apprendrez également à gé-
rer plusieurs événements avec une seule méthode, à déclencher des événements
avec du code jQuery ou encore à utiliser la délégation d'événements pour limiter
le code. En poursuivant votre lecture, vous apprendrez à faire apparaître, faire
disparaître et animer des objets en utilisant et en combinant les méthodes prédé-
nies de jQuery. Si ces dernières ne vous susent pas, je vous montrerai comment
enchaîner vos animations, ou au contraire comment les exécuter simultanément,
comment répéter sans n une animation, et comment mettre en place un timer
pour exécuter du code à intervalles réguliers. C'est également dans ce chapitre
que vous découvrirez des méthodes spécialisées dans le traitement des chaînes, des
images, des formulaires et des tableaux. Une fois tous ces concepts emmagasinés,
vous pourrez vous détendre en apprenant à créer des jeux en jQuery.
4. jQuery et AJAX : cette partie va aborder un sujet qui fait souvent peur
aux programmeurs Web : AJAX. Vous allez voir à quel point jQuery facilite
les échanges de données AJAX et il y a fort à parier que vous utiliserez sans
aucune appréhension tout ce que vous aurez appris pour obtenir des pages Web
dynamiques, vraiment réactives et qui soulageront dans de grandes mesures les
échanges avec le serveur. Au l des pages, vous apprendrez à limiter la mise à jour
d'une page Web à une partie de son contenu, à charger et exécuter des scripts
JavaScript et des données JSON et à gérer les événements liés à l'exécution de
requêtes AJAX.
5. Les plugins jQuery : la bibliothèque jQuery a été écrite de telle sorte qu'il
soit très simple de l'étendre en installant des modules additionnels, connus sous
le nom d'extensions ou de plugins. Cette partie va vous montrer comment les
installer et les utiliser. Dans les parties précédentes, vous avez appris à utiliser
les très nombreuses méthodes de jQuery pour gérer le DOM, les propriétés CSS,
ii
COMMENT LIRE CE LIVRE ?
AJAX et les événements. Dans cette partie, je vais vous présenter le plugin jQuery
UI. Complément idéal de jQuery, il ore des méthodes additionnelles appliquées
à la réalisation de l'interface utilisateur. jQuery UI est en quelque sorte un vaste
assemblage de plugins accessibles à travers un seul et unique chier JavaScript.
Enn, vous découvrirez comment apporter votre pierre à l'édice jQuery en créant
vos propres plugins.
Cet ouvrage se termine par une annexe traitant du débogage du code jQuery. Lors-
qu'une page Web ne contient que quelques instructions jQuery, la phase de débogage
est généralement réduite à sa plus simple expression : vous achez la page et vous
constatez que tout fonctionne. Si vous écrivez des programmes plus volumineux, conte-
nant plusieurs centaines d'instructions jQuery, il en va parfois tout autrement. Dans
cette annexe, vous découvrirez plusieurs techniques et outils pour débusquer les bogues
qui pourraient s'être glissés dans votre code.
iii
CHAPITRE 0. AVANT-PROPOS
Remerciements
Écrire un livre demande beaucoup d'énergie, de volonté et de persévérance. C'est aussi
le travail de toute une équipe et je tiens à remercier tous ceux et toutes celles qui m'ont
accompagné dans cette entreprise :
Mathieu Nebra et Pierre Dubuc qui ont cru en ce projet et qui m'ont donné l'oppor-
tunité de le réaliser ;
Jonathan Baudoin qui a su me guider d'une main d'expert tout au long du processus
d'écriture ;
l'équipe de Simple IT et la communauté du Site du Zéro, qui m'ont permis de peau-
ner et parfois de donner une nouvelle orientation à ce projet ;
et enn mon épouse et mes enfants qui ne m'ont pas beaucoup vu pendant les
quelques mois nécessaires à la mise au point du tutoriel puis du livre.
Et maintenant que mon bébé a vu le jour, j'espère que vous aimerez son contenu
et que vous y apprendrez quelques celles. Je vous souhaite une bonne lecture et vous
dis à bientôt sur le Site du Zéro !
iv
Sommaire
Avant-propos i
Qu'allez-vous apprendre en lisant ce livre ? . . . . . . . . . . . . . . . . . . . . i
Comment lire ce livre ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . iii
Remerciements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . iv
I Introduction à jQuery 1
1 Avant de commencer 3
Historique du Web : de HTML à jQuery . . . . . . . . . . . . . . . . . . . . . 4
Qu'est-ce que jQuery ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Ce qui rend jQuery si puissant et universel . . . . . . . . . . . . . . . . . . . 7
Installer jQuery . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2 Premiers pas 15
Le vocabulaire à connaître . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Le squelette HTML typique . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Attendre la disponibilité du DOM . . . . . . . . . . . . . . . . . . . . . . . . 22
Premier script : Hello world . . . . . . . . . . . . . . . . . . . . . . . . . . 22
v
SOMMAIRE
Sélection d'éléments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
Notions indispensables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
vi
SOMMAIRE
viii
SOMMAIRE
21 jQuery UI 293
De quoi est capable jQuery UI ? . . . . . . . . . . . . . . . . . . . . . . . . . . 294
Déplacer et redimensionner des éléments . . . . . . . . . . . . . . . . . . . . . 294
Un accordéon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296
Sélection de date . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297
Des boîtes de dialogue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299
Acher des onglets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301
Animation : une impression de déjà-vu . . . . . . . . . . . . . . . . . . . . . . 303
Animation de couleurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305
Modèles de progression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307
VI Annexe 321
23 Déboguer le code jQuery 323
Déboguer avec la fonction alert() . . . . . . . . . . . . . . . . . . . . . . . . . 324
Try et catch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
Capturer toutes les erreurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
Déboguer avec Firebug . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
ix
SOMMAIRE
x
Première partie
Introduction à jQuery
1
Chapitre 1
Avant de commencer
Diculté :
S i vous vous intéressez un tant soit peu à la création de sites Web, vous avez forcément
entendu parler de jQuery et vous connaissez certainement plusieurs personnes qui
vantent ses mérites. Mais voilà, vous pensez que seuls les experts peuvent en tirer
quelque chose, et vous avez peur de ne pas avoir le niveau nécessaire ! Je vous rassure tout
de suite : jQuery est loin d'être inabordable, surtout si vous avez quelques notions (même
sommaires) de HTML, CSS et JavaScript.
Mais au fait, qu'est-ce que jQuery ? Comment est-il apparu ? Comment vous le procurer ?
De quel environnement matériel et logiciel avez-vous besoin pour développer en jQuery ?
Autant de questions qui trouveront une réponse dans ce premier chapitre.
3
CHAPITRE 1. AVANT DE COMMENCER
4
HISTORIQUE DU WEB : DE HTML À JQUERY
HTML est le langage de base du Web. Apparu en août 1991, il utilise un ensemble
de balises pour décrire les données à acher.
CSS est un langage consacré à la mise en forme des contenus HTML. Apparu vers
le milieu des années 90, c'est aujourd'hui un complément essentiel de tout site Web
qui se respecte. Il assure l'uniformité des pages et facilite leur maintenance.
JavaScript a été développé par Netscape en 1995. Il a vu le jour sous le nom LiveS-
cript et a été utilisé pour la première fois dans Netscape 1.0. Ce n'est que lors de
la sortie de Netscape 2.0 que le nom JavaScript est apparu. Exécuté côté client,
il ajoute de l'interactivité aux pages Web.
AJAX est également apparu en 1995. Son utilisation est très intéressante, car elle
permet de mettre à jour une partie (et une partie seulement) d'une page Web en
demandant les données nécessaires à un serveur. Les échanges client/serveur sont
donc limités et les pages Web sont achées plus rapidement, pour le plus grand
plaisir des internautes.
jQuery est une bibliothèque (c'est-à-dire un ensemble de codes prêts à l'emploi)
conçue pour simplier l'écriture de codes JavaScript et AJAX. Créée en 2006 par
John Resig, cette bibliothèque est la plus célèbre et la plus utilisée à ce jour.
J'espère que je ne vous ai pas trop ennuyés avec cette énumération. Mais je pense que
c'était une étape nécessaire pour comprendre comment jQuery se positionne dans le
petit monde de la programmation Web. La gure 1.2 schématise ce qui vient d'être dit
an de bien matérialiser les choses.
5
CHAPITRE 1. AVANT DE COMMENCER
6
CE QUI REND JQUERY SI PUISSANT ET UNIVERSEL
B
Forum de discussion
Code web : 351464
jQuery est très pratique, mais n'en protez pas pour ne penser qu'à l'aspect
visuel du développement : une page se doit avant tout de reposer sur des
bases HTML solides !
Mais que se passe-t-il lorsqu'une nouvelle version de JavaScript voit le jour ? Eh bien, les
instructions jQuery sont complétées en conséquence. Vous pouvez continuer à utiliser
les instructions avec lesquelles vous avez l'habitude de travailler et/ou consulter la do-
7
CHAPITRE 1. AVANT DE COMMENCER
8
INSTALLER JQUERY
cumentation sur les nouvelles instructions disponibles. Quelle que soit votre démarche,
toutes les instructions jQuery utilisées fonctionneront dans tous les navigateurs dispo-
nibles. Cette approche est un vrai bonheur pour le programmeur, qu'il soit néophyte
ou conrmé. J'ajouterai quelques autres détails qui vont à coup sûr vous convaincre
que vous avez fait le bon choix en décidant de vous mettre à l'apprentissage de jQuery :
La documentation ocielle est très fournie et de grande qualité ;
La communauté qui gravite autour de jQuery est en perpétuelle expansion et elle
fournit un support de qualité ;
De nombreux acteurs de premier plan du Web (Microsoft, Google, Amazon, Twitter,
Mozilla, etc.) utilisent jQuery ;
Une foultitude de plugins est disponible an d'augmenter les possibilités de base de
jQuery.
Bienvenue dans le monde merveilleux de jQuery !
Installer jQuery
jQuery est une bibliothèque JavaScript. En d'autres termes, un chier d'extension .js.
Pour l'utiliser dans une page HTML, il vous sut d'y faire référence en utilisant une
balise <script>, comme ceci :
1 < script src = " jquery . js " > </ script >
Dans cet exemple, l'attribut src vaut jquery.js. Comme vous pouvez le voir, l'empla-
cement du chier n'est pas précisé dans l'attribut. Cela signie qu'il devra se trouver
dans le même dossier que le document HTML.
Mais le chier jquery.js n'est pas sur mon ordinateur. Est-ce que ce code
va quand même fonctionner ?
9
CHAPITRE 1. AVANT DE COMMENCER
B
Télécharger jQuery
Code web : 263224
10
INSTALLER JQUERY
ociel.
Sur le site ociel, deux versions de la bibliothèque jQuery sont proposées :
jquery.js et jquery.min.js. Pourquoi a-t-on choisi la première version ?
La deuxième est-elle moins complète ?
Ces deux chiers sont strictement identiques d'un point de vue fonctionnel. Par contre,
le deuxième a une taille inférieure au premier. Pour cela, les espaces, tabulations, et
commentaires y ont été supprimés, et les noms des variables et des fonctions ont été
raccourcis, comme le montre la gure 1.7.
Vous aussi, vous pourrez minimiser vos scripts jQuery pour qu'ils se chargent
plus vite. Pour cela vous utiliserez Google Closure Compiler ou YUI
Compressor .
11
CHAPITRE 1. AVANT DE COMMENCER
12
INSTALLER JQUERY
En résumé
En règle générale, le code jQuery s'exécute sur les ordinateurs clients. Cependant,
il peut parfois demander à un serveur de mettre à jour une partie d'une page en
utilisant du code AJAX.
La meilleure technique pour développer du code jQuery sur son ordinateur consiste
à télécharger le chier jquery.js, à le placer dans un dossier de son disque dur et à
faire référence à ce chier dans une balise <script>.
Lorsque le code a été testé et débogué, vous le placerez sur un serveur Web avec votre
client FTP et vous ferez référence au chier jquery.min.js stocké sur un CDN pour
améliorer les temps de réponse sans grignoter la bande passante de votre serveur.
13
CHAPITRE 1. AVANT DE COMMENCER
14
Chapitre 2
Premiers pas
Diculté :
V ous êtes maintenant équipés pour développer en jQuery et vous brûlez d'écrire vos
premières lignes de code. Ce chapitre est là pour cela. Mais avant, je voudrais intro-
duire le jargon technique qui sera utilisé tout au long de ce tutoriel. Dans ce chapitre,
vous verrez que les pages Web qui utilisent des instructions jQuery sont construites selon
un modèle bien précis. Le squelette présenté ici servira tout au long de ce cours.
Et enn, vous ferez vos premiers pas en programmation jQuery en écrivant quelques lignes
de code. Vous pourrez alors constater à quel point jQuery est concis et puissant. Bienvenue
dans le monde de la programmation jQuery !
15
CHAPITRE 2. PREMIERS PAS
Le vocabulaire à connaître
Tout au long de ce tutoriel, nous utiliserons un jargon technique propre aux langages
HTML, CSS, JavaScript et jQuery. Cette section va passer en revue les diérents termes
à connaître. Il n'est pas nécessaire de lire tout ce qui gure dans cette section (surtout
que vous êtes censés connaître la plupart de ces termes). Sachez simplement qu'elle
existe et reportez-vous-y lorsque vous rencontrez un terme dont la signication vous
échappe. Si vous avez besoin d'une piqûre de rappel plus importante, je vous renvoie
sur deux cours rédigés sur le Site du Zéro, accessibles via les deux codes web suivants.
Cours HTML5 et CSS3 de
B Mathieu Nebra
Code web : 444691
Cours JavaScript de Sébas-
B
tien de la Mark et Johann
Pardanaud
Code web : 584755
Balise
Aussi appelée élément ou tag, c'est l'entité de base du langage HTML. Les balises sont
toujours encadrées par les caractères < et >. Par exemple <html> ou encore <body>. Les
balises ouvertes doivent être fermées avec une balise fermante. Par exemple </html> ou
encore </body>. Certaines balises peuvent être à la fois ouvrantes et fermantes. Dans
ce cas, le caractère / apparaît avant le signe > de n de balise. Par exemple, <img
src="image.jpg" />.
Attribut
Outre leur nom, certaines balises HTML peuvent recevoir une ou plusieurs informations
complémentaires. Ces informations sont des attributs. Toujours spéciés dans la balise
ouvrante, ils sont suivis d'un signe = et d'une valeur entre guillemets. Lorsqu'une
balise contient plusieurs attributs, ils sont séparés par des espaces. La balise <img> du
code <img src="jquery.jpg" alt="logo jQuery" id="imglogo" /> contient trois
attributs : src, alt et id.
Block
Les balises HTML de type block sont achées sur des lignes successives. Par exemple,
si l'on dénit deux balises <div> dans un document HTML, elles seront achées l'une
en dessous de l'autre. Les balises de type block peuvent être dimensionnées, et donc
occuper un espace bien déni (hauteur et largeur) dans un document.
16
LE VOCABULAIRE À CONNAÎTRE
Inline
Les balises HTML de type inline sont achées les unes à la suite des autres. Par
exemple, si l'on dénit deux balises <span> dans un document HTML, elles seront a-
chées sur une même ligne. Les balises de type inline ne peuvent pas être dimensionnées.
Elles occupent un espace qui dépend de leur contenu.
Inline-block
C'est un mélange des types inline et block. Si on dénit deux balises de type inline-
block dans un document HTML, elles seront achées l'une à la suite de l'autre (c'est
le comportement des balises inline). Leur taille (largeur et hauteur) pourra également
être dénie (c'est le comportement des balises block).
Feuille de styles
C'est un document qui rassemble un ou plusieurs styles CSS qui dénissent la mise
en forme d'un document. Si la feuille de styles est interne à un document, les dié-
rents styles doivent être dénis dans l'en-tête du document, entre les balises <style
type="text/css"> et </style>. Si la feuille de styles est externe, vous devez dénir les
styles dans un chier d'extension .css et y faire référence dans l'en-tête du document
en utilisant une balise <link /> :
1 < link rel = " stylesheet " type = " text / css " href = " feuille - de - styles .
css " / >
Propriétés CSS
Elles dénissent les caractéristiques d'un style CSS. Elles sont précisées dans la feuille
de styles, entre les accolades ouvrante et fermante qui suivent le nom du style. Dans
l'exemple qui suit, color et margin sont des propriétés CSS :
1 li
2 {
3 color : red ;
4 margin : 10 px ;
5 }
Sélecteur CSS
Pour dénir une règle CSS, on utilise un sélecteur qui indique à quoi va se reporter la
règle. Il peut s'agir d'un sélecteur de balise, de classe, d'identiant, de pseudo-élément,
voire même d'un sélecteur universel qui s'adresse à toutes les balises du document. Le
17
CHAPITRE 2. PREMIERS PAS
W3C
Le World Wide Web Consortium (W3C), est un organisme de standardisation à but
non lucratif, chargé de promouvoir la compatibilité des technologies du World Wide
Web telles que HTML, XHTML, XML, RDF, CSS, PNG, SVG et SOAP.
DOM
Le Document Object Model est une structure de données qui représente un document
HTML comme une arborescence. La racine de cet arbre est un n÷ud nommé document
qui correspond grossièrement à la balise <html>. Tout aussi grossièrement, les balises
HTML dénies dans la page Web correspondent aux n÷uds de l'arbre DOM et en
constituent la structure. Le langage jQuery est en mesure d'interroger le DOM pour
connaître les caractéristiques (attributs et valeurs HTML, propriétés et valeurs CSS)
des balises qui constituent un document HTML, mais aussi de modier ces éléments
pour changer l'allure et/ou le contenu du document.
DTD
Le Document TYPE Declaration fait référence à la balise <!DOCTYPE>. Cette dernière
doit apparaître en tête des documents HTML. Elle indique au navigateur les règles
d'écriture utilisées dans le document. Dans ce cours, nous utiliserons systématiquement
les règles d'écriture du langage HTML5. Le DTD correspondant sera <!DOCTYPE html>.
Jeu de caractères
Le jeu de caractères d'un document HTML est associé aux diérents claviers natio-
naux. Pour indiquer au navigateur dans quel jeu de caractères vous travaillez, vous
18
LE SQUELETTE HTML TYPIQUE
devez insérer une balise <meta charset=""> dans l'en-tête du document. Deux jeux
de caractères sont essentiellement utilisés :
ISO-8859-1 pour accéder à la majorité des caractères des langues occidentales, telles
que le français, l'anglais, l'allemand, l'espagnol, etc.
UTF-8 pour acher sur une même page des caractères issus de plusieurs langues
(français et japonais par exemple).
Selon vos besoins, vous utiliserez donc une balise <meta charset="ISO-8859-1"> ou
<meta charset="UTF-8">.
Fonction jQuery
C'est le point d'entrée de la bibliothèque jQuery. Vous pouvez utiliser au choix l'ins-
truction jQuery() ou son alias $(). Dans ce cours, nous utiliserons systématiquement
l'alias pour limiter l'écriture.
Méthodes jQuery
La bibliothèque jQuery est constituée d'un ensemble de blocs de code autonomes appe-
lés méthodes. Ce qui fait la puissance de cette bibliothèque, c'est avant tout la grande
diversité des méthodes proposées. Pour exécuter une méthode jQuery, il sut de pré-
ciser son nom à la suite d'un sélecteur en le séparant de ce dernier par un point :
$(sélecteur).méthode(paramètres);.
Objet jQuery
On appelle objet jQuery l'entité retournée par la fonction jQuery, c'est-à-dire par
$(). Cet objet représente un ensemble de zéro, un ou plusieurs éléments issus du
document.
19
CHAPITRE 2. PREMIERS PAS
Je ne vais pas m'arrêter sur chacune de ces lignes, vous devriez être en mesure de les
comprendre. Je vais cependant détailler un peu les lignes 10 et 11.
La ligne 10 fait référence à la bibliothèque jquery.js. Ici également, étant donné qu'au-
cun chemin n'est spécié dans la valeur aectée à l'attribut src, le chier jquery.js
doit se trouver dans le même dossier que le document HTML. Je ne vais pas revenir
sur comment le télécharger, reportez-vous au premier chapitre si vous avez besoin.
La ligne 11 fait référence à un chier JavaScript externe à votre page dans lequel vous
placerez tout le code jQuery en rapport avec le document.
Au nal, on se retrouve donc avec quatre chiers :
1. Le document HTML lui-même ;
2. La feuille de styles externe qui dénit la mise en forme du document ;
3. Le chier jquery.js, qui contient la bibliothèque jQuery ;
4. Un chier JavaScript externe qui contient tout le code jQuery que vous dévelop-
perez.
20
LE SQUELETTE HTML TYPIQUE
La maintenance sera d'autant facilitée : pour eectuer une modication dans tout
le site, il vous sura d'agir sur la feuille de styles externe et sur le chier de code
JavaScript externe. Si vous aviez internalisé le code de ces deux chiers, vous auriez
dû agir sur chacune des pages HTML du site !
Optimisation du code
Voici quelques recommandations qui augmenteront les performances des pages qui
contiennent du code jQuery :
21
CHAPITRE 2. PREMIERS PAS
Cette écriture peut se simplier en remplaçant jQuery par son alias, $, ce qui donne :
1 $ ( document ) . ready ( function () {
2 // Ici , le DOM est enti è rement dé fini
3 }) ;
Dans l'introduction, il a été dit que jQuery peut être utilisé pour interro-
ger/modier le DOM, mais aussi les styles CSS du document. L'instruction
$(function() { s'assure que le DOM est entièrement déni. Mais qu'en
est-il de la feuille de styles ?
Si vous avez fait référence à une feuille de styles entre les balises <head> et </head>,
l'instruction $(function() { s'assure également que la feuille de styles est chargée.
Vous pouvez donc l'interroger et la manipuler comme bon vous semble.
22
PREMIER SCRIPT : HELLO WORLD
dénir une balise <span> dans le document, lui aecter un attribut id an de l'identier
et modier son contenu en jQuery.
hello-world.html :
1 <! DOCTYPE html >
2 < html >
3 < head >
4 < meta charset = " UTF -8 " >
5 < title > Hello World </ title >
6 </ head >
7 < body >
8 Ce texte est affich é en HTML
9
Comme vous pouvez le constater, la ligne contenant une balise <link> a été enlevée
de l'en-tête. En eet, l'utilisation d'une feuille de styles ne présente aucun intérêt dans
cet exemple. La ligne 12 fait référence au chier JavaScript jq-hello-world.js. En
voici le contenu :
1 $ ( function () {
2 $ ( '# texteJQ ') . html ( ' Hello world . Ce texte est affich é par
jQuery . ') ;
3 }) ;
Si vous n'avez pas la mémoire trop courte, vous reconnaissez certainement les lignes
1 et 3 qui attendent la disponibilité du DOM. La ligne 2, quant à elle, contient une
instruction jQuery dont la syntaxe peut vous laisser perplexes. Décomposons-la pour
mieux comprendre son fonctionnement :
$('#texteJQ') : cette partie agit comme un sélecteur. Elle retrouve dans le DOM
l'élément dont l'attribut id vaut texteJQ. Pourquoi l'attribut id, me direz-vous ?
Eh bien parce que, selon les conventions du langage CSS, le caractère # représente
justement l'attribut id.
html('Hello world. Ce texte est affiché par jQuery.'); : la deuxième par-
tie indique ce qui doit être modié. Dans cet exemple, on utilise la méthode html()
pour demander la modication du contenu de la balise.
Le point entre ces deux parties fait le lien entre le sélecteur et l'action.
Cette instruction sélectionne donc l'élément d'id texteJQ et y insère le texte Hello
world. Ce texte est aché par jQuery. Vous voyez, il n'y a rien de sorcier là-dedans.
Double-cliquez sur le chier hello-world.html pour l'ouvrir dans votre navigateur.
Vous devriez obtenir quelque chose ressemblant à la gure 2.1.
Si chez vous rien ne s'ache, vériez que :
Le chier jquery.js se trouve dans le même dossier que le chier hello-world.html.
23
CHAPITRE 2. PREMIERS PAS
Vous n'avez oublié aucun guillemet, parenthèse ou accolade dans le code du chier
jq-hello-world.js.
En résumé
Le squelette d'un document qui utilise du code jQuery est diérent en dévelop-
pement et en production. Dans le premier cas, vous ferez référence à la biblio-
thèque jquery.js localement. Dans le second, vous ferez référence à la bibliothèque
jquery.min.js sur un CDN.
Il est impératif d'attendre la disponibilité du DOM avant d'exécuter du code jQuery.
Sans quoi, ce code pourrait s'appliquer à un élément indisponible et provoquer un
comportement inattendu, voire même un plantage du navigateur.
En jQuery, pour modier le contenu d'une balise <span> dont l'attribut id vaut
monid, on utilise l'instruction $("#monid").html("texte quelconque");.
Pour optimiser le code d'un document HTML qui utilise une feuille de styles et du
code jQuery, on place les styles et le code jQuery dans des chiers externes. La feuille
de styles est appelée dans l'en-tête du document, alors que le code jQuery est appelé
juste avant la balise </body> et juste après la référence à la bibliothèque jQuery.
24
Deuxième partie
Les bases de jQuery
25
Chapitre 3
Sélection d'éléments
Diculté :
27
CHAPITRE 3. SÉLECTION D'ÉLÉMENTS
Sélection d'éléments
Une des grandes forces de jQuery est d'intégrer la syntaxe des sélecteurs CSS. Par cet
intermédiaire, il est élémentaire de sélectionner les n÷uds DOM qui nous intéressent,
en utilisant la syntaxe $(sélection) où sélection représente un sélecteur CSS.
En eet, jQuery est fortement lié à trois autres langages : HTML, CSS et JavaScript.
CSS est un langage consacré à la mise en forme des documents écrits en HTML. Les
sélecteurs CSS sont des mots et symboles qui permettent d'identier les éléments conte-
nus dans un document HTML. Par exemple, h2 représente les balises HTML <h2>, ou
encore p représente les balises <p>. En utilisant un sélecteur CSS dans la première
partie d'une instruction jQuery, le ou les éléments HTML correspondants seront sélec-
tionnés. Par la suite, il sura de leur appliquer une action pour modier leur contenu
ou leur apparence.
Avant de poursuivre, voici quelques sélecteurs CSS que vous devez avoir en mémoire :
Un nom de balise, sans les caractères < et >, permet de sélectionner cette balise.
Si plusieurs balises de même nom se trouvent dans le document, toutes ces balises
sont sélectionnées. Par exemple, si le document contient plusieurs balises <div>, le
sélecteur CSS div sélectionne toutes ces balises.
Le signe # fait référence à l'attribut id (ou identiant) d'une balise. Par exemple, si
vous dénissez la balise <p id="premier">, le sélecteur #premier sélectionne cette
balise. Notez que deux balises ne peuvent pas avoir le même identiant.
Le point fait référence à l'attribut class d'une balise. Supposons que vous ayez
déni la balise <h2 class="rouge">. Le sélecteur .rouge sélectionne cette balise.
Plusieurs balises peuvent avoir la même classe. Un même traitement pourra donc
être appliqué à ces deux balises.
Pour diérencier les balises <h2> de classe rouge des balises <p> de classe rouge,
vous utiliserez les sélecteurs h2.rouge et p.rouge. Ce cas particulier s'applique à
toutes les balises et toutes les classes. Ainsi, le sélecteur nom_balise.nom_classe
28
SÉLECTION D'ÉLÉMENTS
29
CHAPITRE 3. SÉLECTION D'ÉLÉMENTS
30
NOTIONS INDISPENSABLES
Notions indispensables
Je vais ici vous parler de deux notions indispensables : les fonctions de rappel et le
chaînage de méthodes.
Fonctions de rappel
Une fonction de rappel (ou callback en anglais) est une fonction exécutée lorsqu'une
autre fonction a terminé de s'exécuter. En jQuery, les fonctions de rappel sont essen-
tiellement utilisées pour réaliser des animations et des appels AJAX. Nous reviendrons
sur ces deux sujets dans la partie 3 du cours.
Juste pour vous mettre l'eau à la bouche, voici un exemple de fonction de rappel,
appliquée aux éléments de classe rouge :
31
CHAPITRE 3. SÉLECTION D'ÉLÉMENTS
1 $ ( function () {
2 $ ( " . rouge " ) . fadeOut ( " slow " , function () {
3 $ ( this ) . fadeIn ( " slow " ) ;
4 }) ;
5 }) ;
Ce code fait disparaître puis réapparaître progressivement les balises de classe rouge.
Chaînage de méthodes
Le chaînage est un concept très puissant et pourtant simple à comprendre. Étant donné
que les méthodes jQuery retournent un objet jQuery, il est possible de les chaîner ,
c'est-à-dire de les exécuter les unes à la suite des autres.
À titre d'exemple, les deux premières instructions sont équivalentes à la troisième :
1 $ ( '. rouge ') . css ( ' background ', ' red ') ;
2 $ ( '. rouge ') . css ( ' color ' ,' yellow ') ;
3
4 $ ( '. rouge ') . css ( ' background ', ' red ') . css ( ' color ', ' yellow ') ;
Nous n'avons pas encore étudié la méthode jQuery css(), mais je suis sûr qu'en obser-
vant la façon dont elle s'articule vous comprenez son fonctionnement. Cette méthode
admet deux paramètres. Le premier est une propriété CSS et le deuxième, la valeur à
aecter à cette propriété.
La première instruction aecte un arrière-plan de couleur rouge aux balises de classe
rouge. La deuxième instruction aecte la couleur jaune (yellow) aux balises de classe
rouge. En chaînant ces deux instructions, les balises de classe rouge ont un arrière-
plan de couleur rouge et des caractères de couleur jaune. Et tout cela en une seule
instruction !
La méthode css() n'est qu'une des nombreuses méthodes utilisables en
jQuery. Pour avoir un aperçu global des principales méthodes, reportez-vous à
la section Getters et setters (page 52) du chapitre Modier le contenu
d'un élément .
En résumé
Le sélecteur jQuery $('sel') utilise la syntaxe CSS. En remplaçant sel par un sélec-
teur CSS quelconque, les éléments correspondants (s'ils existent) seront sélectionnés
dans le DOM. Par exemple :
$('a') sélectionne tous les liens hypertextes ;
$('.rouge') sélectionne les éléments de classe rouge ;
$('#e2') sélectionne l'élément d'identiant e2 ;
$('[src]') sélectionne tous les éléments qui possèdent un attribut src ;
32
NOTIONS INDISPENSABLES
$('[width="40"]') sélectionne tous les éléments qui ont un attribut width égal
à 40.
L'objet retourné par un sélecteur jQuery peut faire référence à plusieurs éléments.
Pour accéder à un élément, vous pouvez préciser son index entre crochets, en ayant
bien à l'esprit que le premier élément a un index égal à 0. Par exemple, le sélecteur
$('a')[2] fait référence au troisième lien hypertexte contenu dans la page.
Pour appliquer une méthode à un objet jQuery obtenu en utilisant un sélecteur, il
sut d'écrire cette méthode à droite du sélecteur en la séparant de ce dernier par
un point. Par exemple, l'instruction suivante écrit en jaune tous les liens hypertextes
contenus dans la page : $('a').css('color', 'yellow');.
Pour chaîner deux méthodes jQuery, écrivez-les l'une à la suite de l'autre en les
séparant par un point.
33
CHAPITRE 3. SÉLECTION D'ÉLÉMENTS
34
Chapitre 4
Plus loin dans la sélection d'éléments
Diculté :
V ous avez appris à sélectionner des balises, des identiants et des classes dans le code
HTML d'une page Web. Ces types de sélections sont très utiles et vous les utiliserez
fréquemment lors de vos développements jQuery.
Cependant, il est possible d'aller plus loin en sélectionnant encore plus nement les élé-
ments du DOM. Ce chapitre va vous montrer comment sélectionner des éléments HTML
en fonction de leurs attributs, comment limiter les éléments retournés en utilisant des
pseudo-sélecteurs ou encore comment utiliser des sélecteurs spécialisés pour certains types
d'éléments.
Vous apprendrez également à parcourir les éléments sélectionnés pour appliquer à chacun
d'entre eux un traitement spécique. Cette technique est très importante. Elle sera souvent
utilisée dans les autres chapitres de ce cours.
35
CHAPITRE 4. PLUS LOIN DANS LA SÉLECTION D'ÉLÉMENTS
Sélecteurs d'attributs
Arrivés à ce point dans la lecture du cours, vous savez sélectionner les éléments qui
contiennent :
un attribut donné, en utilisant le sélecteur $('[nom]') ;
un attribut donné qui a une certaine valeur, en utilisant le sélecteur $('[nom:valeur]').
Le tableau suivant dresse la liste des sélecteurs d'attributs évolués auxquels nous allons
nous intéresser.
Pour bien comprendre comment fonctionnent ces sélecteurs, nous allons travailler avec
le code suivant :
1 <! DOCTYPE html >
2 < html >
3 < head >
4 < meta charset = " UTF -8 " >
5 < title > S é lecteurs CSS </ title >
6 </ head >
7 < body >
8 < img src = " canard . jpg " title = " animal canard " border = " 11 " >
9 < img src = " chat . jpg " title = " animal chat " border = " 4 " >
10 < img src = " cheval . jpg " title = " cheval " >
11 < img src = " chien . jpg " title = " animal chien " border = " 8 " >
12 < img src = " girafe . jpg " title = " girafe " border = " 4 " >
13
14 < script src = " jquery . js " > </ script >
15 < script >
16 $ ( function () {
17 // Le code jQuery sera ins é r é ici
18 }) ;
19 </ script >
20 </ body >
36
SÉLECTEURS D'ATTRIBUTS
Au début de ce cours, je vous ai dit qu'il était conseillé de séparer les codes
HTML, CSS et jQuery dans plusieurs chiers. Ce conseil reste toujours d'ac-
tualité ; cependant, étant donné la faible ampleur du code, j'ai pris la liberté
de mettre le code jQuery directement dans le HTML. N'ayez crainte, nous
utiliserons plusieurs chiers séparés lorsque le code deviendra un peu plus
étoé.
Le corps du document contient cinq balises <img>. Chacune d'entre elles a trois attri-
buts : src, title et border. Nous allons utiliser plusieurs sélecteurs d'attribut évolués
pour modier la couleur de certaines bordures d'images. Après que les images ont été
dénies, une balise <script> fait référence à la bibliothèque jQuery et une autre dé-
limite le code jQuery que nous allons écrire. L'instruction $(function() { attend la
disponibilité du DOM. Les instructions jQuery seront placées à la place du commen-
taire.
La gure 4.1 représente le résultat lorsqu'on exécute ce code dans Internet Explorer.
37
CHAPITRE 4. PLUS LOIN DANS LA SÉLECTION D'ÉLÉMENTS
Sélecteurs hiérarchiques
Dans l'arborescence DOM, à l'exception de html, tous les éléments ont un parent, et
certains éléments ont un ou plusieurs enfants. Cette section s'intéresse aux sélecteurs
hiérarchiques, avec lesquels vous pourrez sélectionner les enfants d'un certain parent,
l'énième enfant d'un parent, les enfants uniques, etc.
Rien de tel qu'un peu de code pour bien comprendre comment fonctionnent ces sélec-
teurs. Ici, nous utiliserons des listes imbriquées :
1 <! DOCTYPE html >
2 < html >
3 < head >
4 < meta charset = " UTF -8 " >
5 < title > S é lecteurs CSS </ title >
6 </ head >
7 < body >
8 < div id = " listes " >
9 < ul id = " ul1 " >
38
SÉLECTEURS HIÉRARCHIQUES
21 < script src = " jquery . js " > </ script >
22 < script >
23 $ ( function () {
24 // Le code jQuery sera ins é r é ici
25 }) ;
26 </ script >
27 </ body >
28 </ html >
Nous allons acher en rouge certains éléments de ces listes imbriquées en utilisant la
méthode jQuery css() suivante :
1 $ ( function () {
2 $ ( ' sel ') . css ( ' color ' ,' red ') ;
3 }) ;
39
CHAPITRE 4. PLUS LOIN DANS LA SÉLECTION D'ÉLÉMENTS
Pour varier les plaisirs, nous allons eectuer des sélections dans une série de para-
graphes. Voici le code HTML utilisé :
1 <! DOCTYPE html >
2 < html >
3 < head >
4 < meta charset = " UTF -8 " >
5 < title > S é lecteurs CSS </ title >
6 </ head >
7 < body >
8 <p > Paragraphe 1 </p >
9 <p > Paragraphe 2 </p >
10 <p > Paragraphe 3 </p >
11 <p > Paragraphe 4 </p >
12 <p > Paragraphe 5 </p >
13
14 < script src = " jquery . js " > </ script >
40
SÉLECTEURS D'ÉLÉMENTS PARTICULIERS
Nous allons acher en rouge certains éléments de ces listes imbriquées en utilisant la
méthode jQuery css().
14 < script src = " jquery . js " > </ script >
15 < script >
41
CHAPITRE 4. PLUS LOIN DANS LA SÉLECTION D'ÉLÉMENTS
16 $ ( function () {
17 $ ( ' div ') . hide () ;
18 // Le code jQuery sera ins é r é ici
19 }) ;
20 </ script >
21 </ body >
22 </ html >
Ligne 17, l'instruction jQuery dissimule la balise <div> à l'aide de la méthode hide().
Testez tour à tour les trois instructions jQuery suivantes :
42
PSEUDO-SÉLECTEURS SPÉCIFIQUES AUX FORMULAIRES
Pour illustrer ces pseudo-sélecteurs, nous allons utiliser un formulaire très classique
contenant :
une zone de texte ;
un mot de passe ;
deux boutons radio ;
une zone de texte multiligne ;
un bouton submit et un bouton reset ;
un bouton image.
Voici le code :
1 <! DOCTYPE html >
2 < html >
3 < head >
4 < meta charset = " UTF -8 " >
5 < title > S é lecteurs CSS </ title >
6 </ head >
7 < body >
8 < form >
9 Nom d ' utilisateur
10 < input type = " text " name = " nom " >< br / >
11
12 Mot de passe
13 < input type = " password " name = " pass " >< br / >
14
15 Sexe
16 Homme < input type = " radio " name = " sexe " value = " H" >
17 Femme < input type = " radio " name = " sexe " value = " F" >< br / >
18
19 Commentaires
20 < textarea rows = " 3 " name = " commentaires " > Tapez vos
commentaires ici </ textarea > < br / >
21
22 < input type = " image " src = " chat . jpg " >< br / >
23
24 < input type = " submit " value = " Envoyer " >
25 < input type = " reset " value = " Annuler " >
26 </ form >
27
28 < script src = " jquery . js " > </ script >
29 < script >
30 $ ( function () {
31 // Le code jQuery sera tap é ici
32 }) ;
33 </ script >
34 </ body >
35 </ html >
43
CHAPITRE 4. PLUS LOIN DANS LA SÉLECTION D'ÉLÉMENTS
44
SÉLECTEURS UTILISÉS DANS LES TABLEAUX
Nous allons mettre en application ces pseudo-sélecteurs en les appliquant sur le tableau
déni en HTML que voici :
19 < script src = " jquery . js " > </ script >
20 < script >
21 $ ( function () {
22 $ ( 'td ') . css ( 'text - align ' ,' center ') ;
23 // Le code jQuery sera tap é ici
24 }) ;
25 </ script >
26 </ body >
27 </ html >
45
CHAPITRE 4. PLUS LOIN DANS LA SÉLECTION D'ÉLÉMENTS
. . . où :
sel est un sélecteur CSS, comme ceux que nous avons utilisés jusqu'ici ;
index est une variable JavaScript qui représente la position de l'élément dans la
sélection. Il aura pour valeurs consécutives 0, 1, 2, etc. jusqu'à ce que tous les éléments
aient été passés en revue ;
Jusqu'ici, rien de bien méchant ! Cependant, une question se pose : comment accéder
à l'élément courant, c'est-à-dire à l'élément à modier ? Pour cela, vous devez utiliser
le mot this. Si vous avez suivi ce que j'ai dit un peu plus haut, la modication se fera
via l'attribut src de la balise <img>. Eh bien, dans ce cas, vous utiliserez l'expression
this.src.
Examinons le code suivant :
1 <! DOCTYPE html >
2 < html >
46
PARCOURIR LES ÉLÉMENTS SÉLECTIONNÉS
12 < script src = " jquery . js " > </ script >
13 < script >
14 $ ( function () {
15 $ ( ' img ') . each ( function ( index ) {
16 this . src = ' images2 / i ' + ( index +1) + '. jpg ';
17 }) ;
18 }) ;
19 </ script >
20 </ body >
21 </ html >
Nous retrouvons nos trois images, l'appel à jQuery ainsi que quelques instructions.
Lorsque le DOM est disponible, les images du document sont sélectionnées avec le
sélecteur img et les éléments sélectionnés sont parcourus avec la méthode each(). Une
seule ligne est nécessaire pour modier les adresses des images :
1 this . src = ' images2 / i ' + ( index +1) + '. jpg ';
47
CHAPITRE 4. PLUS LOIN DANS LA SÉLECTION D'ÉLÉMENTS
Conversion jQuery/DOM
Conversion d'un élément du DOM en un objet jQuery
Si vous avez suivi attentivement ce tutoriel, vous savez que le simple fait d'utiliser un
sélecteur jQuery convertit un élément (ou un ensemble d'éléments) du DOM en un
objet jQuery. Ainsi par exemple, l'instruction $('div') retourne un objet jQuery qui
donne accès à toutes les balises <div> du document. La première balise <div> est alors
accessible avec $("div")[0];, la deuxième avec $("div")[1];, et ainsi de suite.
La première ligne crée une variable JavaScript en lui aectant un simple texte. La
deuxième la convertit en un objet jQuery en l'enveloppant avec l'alias $().
Ici, le tableau est stocké dans la variable JavaScript spans. La valeur stockée dans la
première cellule du tableau est obtenue avec spans[0].innerHTML, la valeur stockée
dans la deuxième cellule du tableau est obtenue avec spans[1].innerHTML, et ainsi de
suite. . .
En résumé
Il est possible d'aner la sélection d'éléments grâce aux sélecteurs d'attributs, aux
pseudo-sélecteurs et aux sélecteurs hiérarchiques.
Les formulaires ont leur propre jeu de pseudo-sélecteurs. Faciles à mémoriser, ils ont
le nom des balises correspondantes et sont précédés d'un : .
48
CONVERSION JQUERY/DOM
49
CHAPITRE 4. PLUS LOIN DANS LA SÉLECTION D'ÉLÉMENTS
50
Chapitre 5
Modier le contenu d'un élément
Diculté :
A rrivés à ce point dans la lecture du cours, vous savez sélectionner à peu près tout
ce qui peut se trouver dans un document HTML. Vous vous sentez peut-être un peu
frustrés : à quoi bon eectuer des sélections si vous n'en faites rien ! Vous avez tout
à fait raison.
Ce chapitre va (enn !) vous montrer comment agir sur les éléments sélectionnés pour les
transformer. Vous pourrez ainsi modier les attributs et les propriétés CSS des éléments sé-
lectionnés, mais aussi ajouter, réorganiser et supprimer des éléments du DOM pour modier
l'agencement de la page sur laquelle vous travaillez.
Poursuivez vite la lecture et surtout. . . amusez-vous bien !
51
CHAPITRE 5. MODIFIER LE CONTENU D'UN ÉLÉMENT
Getters et setters
Plutôt que de diérencier les méthodes chargées de lire (ces méthodes sont dites getters,
de l'anglais to get qui signie obtenir ) et de modier (ces méthodes sont dites setters,
de l'anglais to set qui signie dénir ) les valeurs HTML ou CSS, les concepteurs de
jQuery ont choisi de leur donner le même nom. Mais alors, comment les diérencier, me
direz-vous ? C'est très simple, puisqu'il sut d'observer les paramètres de la fonction.
Raisonnons sur un exemple pour mieux comprendre de quoi il retourne. Observez les
deux instructions suivantes :
1 $ ( ' h2 ') . css ( ' font - size ') ;
2 $ ( ' h2 ') . css ( ' font - size ' ,'2 em ') ;
Dans la première instruction, aucune valeur n'est précisée. Il est impossible de modier
la valeur de la propriété CSS font-size. La première méthode est donc un getter ;
elle retourne la valeur de la propriété font-size. Pour faciliter sa manipulation, vous
pouvez la mémoriser dans une variable :
1 var taille = $ ( 'h2 ') . css ( 'font - size ') ;
Dans la deuxième instruction, la valeur 2em est précisée dans les paramètres de
la méthode css(). Cette valeur sera utilisée pour mettre à jour la propriété CSS
font-size (ou la créer si elle n'existe pas) de tous les éléments retournés par le sélec-
teur. La deuxième méthode est donc un setter.
Ce qui vient d'être dit peut se généraliser à toutes les méthodes jQuery :
Si aucune valeur n'est précisée dans les arguments de la méthode, il s'agit d'un getter.
La méthode retourne la valeur qui correspond au premier argument.
Si une valeur est précisée dans les arguments de la méthode, il s'agit d'un setter. Le
premier argument de la méthode est initialisé avec cette valeur. S'il n'existe pas, il
est créé. S'il existe, il est modié en conséquence.
52
GETTERS ET SETTERS
13 < script src = " jquery . js " > </ script >
14 < script >
15 $ ( function () {
16 var test = $ ( 'a ') . attr ( ' href ') ;
17 document . write ( test ) ;
18 }) ;
19 </ script >
20 </ body >
21 </ html >
Deux liens hypertextes sont dénis lignes 9 et 10. Le premier pointe sur la page
http://api.jquery.com et le second sur la page http://docs.jquery.com. À la ligne
16, on utilise l'instruction jQuery $('a').attr('href') pour lire le contenu de l'at-
tribut href des balises <a> contenues dans le document. L'objet retourné est stocké
dans la variable test. La ligne 17 ache cette variable. D'après vous, quelle valeur va
s'acher dans le navigateur ?
Comme il a été dit précédemment, dans le cas d'une réponse multiple, seule la première
valeur est retournée par le getter. Ici, c'est donc l'adresse http://api.jquery.com qui
s'achera dans le navigateur.
Comme vous pouvez le voir, les deux balises <a> de ce document ne contiennent qu'un
seul attribut : href. Si on utilisait l'instruction var test = $('a').attr('class');,
la valeur retournée serait undefined.
53
CHAPITRE 5. MODIFIER LE CONTENU D'UN ÉLÉMENT
Si vous avez quelques rudiments de JavaScript, le code utilisé dans cette fonction ne
devrait pas vous poser de problème. Dans le cas contraire, je vais décrire en détail les
actions accomplies.
Si le lien (this.host) se trouve sur le même site que la page en cours (== location.host),
l'attribut target est initialisé avec la valeur _self (return '_self'). Dans le
cas contraire, l'attribut target est initialisé avec la valeur _blank (else return
'_blank'). Une fois ces deux lignes exécutées, les liens hypertextes seront ouverts :
dans l'onglet courant du navigateur s'ils renvoient vers une page située dans le même
nom de domaine que la page actuelle ;
dans une autre fenêtre (ou un nouvel onglet) du navigateur s'ils se trouvent sur un
autre nom de domaine.
. . . où sel est un sélecteur jQuery et attribut est l'attribut que vous voulez supprimer.
Cette méthode agit sur tous les éléments sélectionnés par le sélecteur jQuery. Par
exemple, pour supprimer l'attribut href de toutes les balises <a> du document, vous
utiliserez l'instruction suivante :
1 $ ( 'a ') . removeAttr ( ' href ') ;
Pour avoir un aperçu des diérentes balises HTML5 et de leurs attributs, vous
pouvez consulter le site W3Schools.com.
54
TRAVAILLER AVEC L'ATTRIBUT CLASS
B
HTML sur W3Schools.com
Code web : 650163
Pour avoir un aperçu des diérentes propriétés CSS3, vous pouvez consulter
le site W3Schools.com.
B
CSS sur W3Schools.com
Code web : 237691
55
CHAPITRE 5. MODIFIER LE CONTENU D'UN ÉLÉMENT
16 < span id = " pierre " > Pierre </ span >
17
18 < span id = " paul " class = " vert grand " > Paul </ span >
19
20 < span id = " julia " > Julia </ span >
21
22 < span id = " eric " class = " vert " > Eric </ span >
23
24 < span id = " kevin " >Ké vin </ span >
25
26
27 < script src = " jquery . js " > </ script >
28 < script >
29 $ ( function () {
30 // Ajouter le code jQuery ici
31 }) ;
32 </ script >
33 </ body >
34 </ html >
56
TRAVAILLER AVEC L'ATTRIBUT CLASS
Supposons maintenant que le prénom Julia doive être aché en grands caractères verts.
Le code à utiliser est le suivant :
1 $ ( '# julia ') . addClass ( ' vert grand ') ;
Nous allons maintenant travailler avec le prénom Eric. Ce prénom est aché via une
balise <span> de classe vert. Supposons que vous vouliez acher le prénom Eric en
rouge. L'instruction suivante n'a aucun eet :
1 $ ( '# eric ') . addClass ( ' rouge ') ;
Avez-vous une idée de la raison de cet échec ? Cela vient d'un conit entre la classe
vert (existante) et la classe rouge (que l'on veut ajouter). Pour parvenir au résultat
souhaité, il faudrait supprimer la classe existante et la remplacer par la classe rouge :
1 $ ( '# eric ') . removeClass ( ' vert ') . addClass ( ' rouge ') ;
57
CHAPITRE 5. MODIFIER LE CONTENU D'UN ÉLÉMENT
1 $ ( '# pierre ') . removeClass ( ' vert ') . addClass ( ' rouge ') . removeClass (
' grand ') . addClass ( ' petit ') ;
Par contre, si vous l'appliquez au <span> d'identiant eric, le prénom Eric est aché
en caractères rouges de grande taille :
Le <span> étant de classe vert, cette classe est supprimée : toggleClass('vert') ;
La classe rouge lui est ajoutée puisqu'elle n'existe pas : toggleClass('rouge') ;
Le <span> étant de classe petit, cette classe est supprimée : toggleClass('petit') ;
Enn, la classe grand lui est ajoutée puisqu'elle n'existe pas : toggleClass('grand').
Pour simplier l'écriture, il est possible d'indiquer plusieurs classes séparées par des
espaces dans les méthodes addclass(), removeclass() et toggleclass(). Ainsi par
exemple, cette instruction :
1 $ ( '# pierre ') . removeClass ( ' vert ') . addClass ( ' rouge ') . removeClass (
' grand ') . addClass ( ' petit ') ;
58
TRAVAILLER AVEC LES FORMULAIRES
Si vous devez tester l'appartenance à plusieurs classes, vous utiliserez la méthode is().
Raisonnons sur la balise <span> suivante :
1 < span id = " jean " class = " rouge grand " > Jean </ span > < br / >
12 Mot de passe
13 < input type = " password " id = " pass " >< br / >
14
15 Sexe
16 H < input type = " radio " id = " sexe " name = " H " value = " H " >
17 F < input type = " radio " id = " sexe " name = " F " value = " F " >< br / >
18
19 Fonction
20 < select id = " fonction " >
21 < option VALUE = " etudiant " > Etudiant </ option >
22 < option VALUE = " ingenieur " > Ing é nieur </ option >
23 < option VALUE = " enseignant " > Enseignant </ option >
24 < option VALUE = " retraite " > Retrait é </ option >
25 < option VALUE = " autre " > Autre </ option >
59
CHAPITRE 5. MODIFIER LE CONTENU D'UN ÉLÉMENT
28 < input type = " submit " id = " envoyer " value = " Envoyer " >
29 < input type = " reset " id = " annuler " value =" Annuler " >
30 </ table >
31 </ form >
32
33 < script src = " jquery . js " > </ script >
34 < script >
35 $ ( function () {
36 // Entrer les instructions jQuery ici
37 }) ;
38 </ script >
39 </ body >
40 </ html >
Ce code dénit une zone de texte (nom), un mot de passe (pass), deux boutons radio
(sexe), une liste déroulante (fonction), un bouton Envoyer (envoyer) et un bouton
Annuler (annuler).
Le tableau suivant donne un aperçu des instructions que vous pouvez utiliser pour lire
et modier les données stockées dans le formulaire.
Instruction jQuery Eet
$('#nom').val() Lit le nom de l'utilisateur
$('#pass').val() Lit le mot de passe
$(':radio[name="H"]:checked').val() Lit l'état du bouton radio H. Renvoie
true si le bouton est sélectionné, si-
non false.
$('#fonction').val() Lit l'élément sélectionné dans la liste
déroulante
$('#nom').val('Michel') Écrit Michel dans la zone de
texte Nom d'utilisateur
$('#pass').val('abcde') Écrit abcde dans la zone de texte
Mot de passe
$(':radio').val(['H']); Sélectionne le bouton radio H
$('#fonction').val('retraite') Sélectionne Retraité dans la liste
déroulante
La syntaxe des instructions n'est pas complexe, mais rien de tel qu'un peu de pratique
pour qu'elle ne vous pose plus aucun problème. Je vous suggère donc de vous entraîner
à utiliser ces instructions en les tapant une à une sur la ligne 36 du code précédent !
60
TRAVAILLER AVEC LES VALEURS STOCKÉES DANS DES ÉLÉMENTS
textuelles, vous pouvez les lire ou les modier en utilisant deux méthodes jQuery :
text() retourne/modie la valeur textuelle stockée dans l'élément ;
html() retourne/modie le code HTML stocké dans l'élément.
Comme toujours, nous allons utiliser un exemple pour bien comprendre le fonctionne-
ment de ces deux méthodes. Voici le code utilisé :
1 <! DOCTYPE html >
2 < html >
3 < head >
4 < meta charset = " UTF -8 " >
5 < title > Valeurs stock é es dans les é lé ments </ title >
6 </ head >
7 < body >
8 <h1 > Documentation jQuery </ h1 >
9 <p > < a href = ' http :// docs . jquery . com ' > Documentation
officielle </ a > </p >
10 <p > < a href = ' http :// api . jquery . com '> API jQuery </ a > </p >
11
12 < script src = " jquery . js " > </ script >
13 < script >
14 $ ( function () {
15 // Entrer les instructions jQuery ici
16 }) ;
17 </ script >
18 </ body >
19 </ html >
Le corps du document dénit un titre de niveau 1 et deux paragraphes qui pointent vers
la documentation ocielle de jQuery et l'API jQuery. Pour récupérer le texte stocké
dans les deux paragraphes, nous utiliserons l'instruction $('p').text();, et pour a-
cher ce texte sur l'écran nous utiliserons une boîte de dialogue : alert($('p').text());.
Tapez cette instruction à la ligne 15 du code précédent, sauvegardez le document et
achez-le dans le navigateur de votre choix. La gure 5.2 vous montre le résultat sous
Internet Explorer.
Comme vous pouvez le voir, l'instruction retourne les deux valeurs textuelles stockées
dans les balises <p>. Ces deux valeurs sont placées l'une à la suite de l'autre. Pour
accéder individuellement à la première et à la dernière valeur, le plus simple consiste à
utiliser des pseudo-opérateurs :
1 var premier = $ ( 'p : first ') . text () ;
2 var dernier = $ ( 'p : last ') . text () ;
Si vous voulez accéder individuellement à chacune des valeurs, vous devez dénir une
fonction comme paramètre de la méthode text(), comme ceci : function(index,
actuel), où index représente le numéro de la valeur en cours de traitement (à partir
de 0), et actuel représente la valeur en cours de traitement.
À titre d'exemple, pour acher la valeur contenue dans chaque paragraphe du docu-
ment, vous pourriez utiliser le code suivant :
61
CHAPITRE 5. MODIFIER LE CONTENU D'UN ÉLÉMENT
62
POSITION ET TAILLE DES ÉLÉMENTS
Instructions Résultat
alert($('p').html()); Ache le code HTML
du premier élément (voir
image suivante).
alert($('p:first').html()); Ache le code HTML du
premier élément.
alert($('p:last').html()); Ache le code HTML du
dernier élément.
$('p').html(function(index,actuel) { Ache individuellement
alert('Paragraphe ' + (index+1) + ' : le code HTML de chaque
'+actuel);}); élément.
63
CHAPITRE 5. MODIFIER LE CONTENU D'UN ÉLÉMENT
8 width : 300 px ;
9 height :300 px ;
10 position : absolute ;
11 top : 100 px ;
12 left : 200 px ;
13 background - color : yellow ;
14 }
15
16 # enfant {
17 width : 100 px ;
18 height :100 px ;
19 position : absolute ;
20 top : 150 px ;
21 left : 100 px ;
22 background - color : red ;
23 }
24 </ style >
25 </ head >
26 < body >
27 < div id = " parent " >
28 Texte dans le parent
29 < div id = " enfant " >
30 Texte dans l ' enfant
31 </ div >
32 </ div >
33 < span id = " resultat " > </ span >
34
35 < script src = " jquery . js " > </ script >
36 < script >
37 $ ( function () {
38 // Entrer les instructions jQuery ici
39 }) ;
40 </ script >
41 </ body >
42 </ html >
. . . ainsi qu'une balise <span> qui sera utilisée par la suite pour acher les coordonnées
des balises <div> :
1 < span id = " resultat " > </ span >
64
POSITION ET TAILLE DES ÉLÉMENTS
Ces balises sont mises en forme par des règles CSS, entre les lignes 7 et 23. Les dimen-
sions de la balise d'identiant parent sont xées à 300 pixels sur 300. Cette balise est
positionnée de façon absolue à 100 pixels du bord supérieur et à 200 pixels du bord
gauche de la page. Enn, la couleur d'arrière-plan est jaune :
1 # parent {
2 width : 300 px ;
3 height :300 px ;
4 position : absolute ;
5 top : 100 px ;
6 left : 200 px ;
7 background - color : yellow ;
8 }
Les dimensions de la balise d'identiant enfant sont xées à 100 pixels sur 100. Cette
balise est positionnée de façon absolue à 150 pixels du bord supérieur et à 100 pixels
du bord gauche de son parent. Oui, vous avez bien lu, de son parent : la balise enfant
étant imbriquée dans la balise parent, le terme absolute a une valeur toute. . . relative
(sans vouloir faire un jeu de mots). En eet, le positionnement est bien absolu, si on
se réfère à la balise parent et non au document dans son ensemble. Enn, la couleur
d'arrière-plan est rouge :
1 # enfant {
2 width : 100 px ;
3 height :100 px ;
4 position : absolute ;
5 top : 150 px ;
6 left : 100 px ;
7 background - color : red ;
8 }
Si vous achez ce document dans votre navigateur, vous devriez obtenir la gure 5.4.
65
CHAPITRE 5. MODIFIER LE CONTENU D'UN ÉLÉMENT
Les coordonnées left et top des balises parent et enfant sont extraites des variables
posparent et posenfant. Par exemple, pour l'abscisse de la balise parent, on utilise
posparent.left.
66
POSITION ET TAILLE DES ÉLÉMENTS
67
CHAPITRE 5. MODIFIER LE CONTENU D'UN ÉLÉMENT
68
POSITION ET TAILLE DES ÉLÉMENTS
69
CHAPITRE 5. MODIFIER LE CONTENU D'UN ÉLÉMENT
28 < script src = " jquery . js " > </ script >
29 < script >
30 $ ( function () {
31 // Entrer les instructions jQuery ici
32 }) ;
33 </ script >
34 </ body >
35 </ html >
70
POSITION ET TAILLE DES ÉLÉMENTS
Les deux premières lignes obtiennent les dimensions de la balise <div> avec les mé-
thodes width(), innerWidth(), outerWidth(), outerWidth(true), height(), innerheight(),
outerHeight() et outerHeight(true). Ces informations sont mémorisées dans la va-
riable dimensions. La troisième ligne ache le contenu de la variable dimensions dans
la balise <span> en utilisant la méthode jQuery text().
Aux imprécisions près, les valeurs retournées par les méthodes jQuery correspondent
bien aux dimensions dénies dans le style CSS de la balise <div> :
Supposons maintenant que vous vouliez modier les dimensions de la balise <div>.
Vous utiliserez pour cela les méthodes width() et height() en tant que setters. Dans
cet exemple, les dimensions de la balise <div> sont xées à 400×200 pixels :
71
CHAPITRE 5. MODIFIER LE CONTENU D'UN ÉLÉMENT
. . . où :
el est le nom de l'élément concerné, sans apostrophes ;
nom est le nom (entre apostrophes) de la variable dans laquelle sera stockée la
donnée ;
nom_don est le nom (sans apostrophes) associé à la donnée ;
don est une donnée quelconque. S'il s'agit d'un nombre, les apostrophes sont inutiles.
Par contre, s'il s'agit d'une chaîne, mettez-la entre apostrophes.
Si vous voulez associer plusieurs données à un élément, vous utiliserez une syntaxe
légèrement diérente :
72
ASSOCIER DES DONNÉES AUX BALISES
. . . où :
el est le nom de l'élément concerné, sans apostrophes ;
nom est le nom (entre apostrophes) dans lequel sera stockée la donnée ;
nom_don1, nom_don2, nom_don3, etc. sont les noms (sans apostrophes) associés aux
données ;
don1, don2, don3, etc. sont des données quelconques. Lorsqu'une de ces données est
numérique, ne mettez pas d'apostrophes. Au contraire, lorsqu'une de ces données est
une chaîne, mettez-la entre apostrophes.
Pour retrouver une donnée associée à un élément, utilisez la syntaxe suivante :
1 var uneVariable = $ . data ( el , ' nom ') . nom_don ;
. . . où :
uneVariable est une variable quelconque ;
el est le nom de l'élément (sans apostrophes) auquel une donnée a été associée ;
nom est le nom (entre apostrophes) dans lequel a été stockée la donnée ;
nom_don est le nom de la donnée à retrouver, sans apostrophes.
Si tout ceci est confus pour vous, un petit exemple va vous apporter la lumière ! Dans
le code suivant, nous allons associer trois données à une balise <div>, retrouver ces
données et les acher dans trois balises <span> enfants du <div>. Voici le code :
1 <! DOCTYPE html >
2 < html >
3 < head >
4 < meta charset = " UTF -8 " >
5 < title > Manipulation de l ' attribut class </ title >
6 </ head >
7 < body >
8 < div id = " mondiv " >
9 Les valeurs stock é es dans la balise & lt ; div & gt ; sont : < span
id = " sp1 " > </ span > , < span id = " sp2 " > </ span > et < span id = " sp3 "
> </ span >.
10 </ div >
11
12 < script src = " jquery . js " > </ script >
13 < script >
14 $ ( function () {
15 var div = $ ( '# mondiv ') ;
16 $ . data ( div , ' mesValeurs ' , { premier : ' bonjour ' , deuxieme
: 12 , troisieme : ' http :// www . siteduzero . com ' }) ;
17 var val1 = $ . data ( div , ' mesValeurs ') . premier ;
18 var val2 = $ . data ( div , ' mesValeurs ') . deuxieme ;
19 var val3 = $ . data ( div , ' mesValeurs ') . troisieme ;
20 $ ( '# sp1 ') . text ( val1 ) ;
21 $ ( '# sp2 ') . text ( val2 ) ;
73
CHAPITRE 5. MODIFIER LE CONTENU D'UN ÉLÉMENT
Remarquez :
Les codes HTML < et > qui apparaissent autour du mot div. Ces codes
remplacent les caractères < et >. Sans eux, le texte <div> serait interprété
comme une balise, et le code ne produirait pas l'eet recherché.
L'emplacement stratégique des balises <span>. En y insérant des données, elles com-
plèteront la phrase Les valeurs stockées [. . .] d'une façon naturelle, comme si la
phrase avait été écrite en dur .
La partie intéressante du code se trouve entre les lignes 15 et 22.
Pour alléger l'écriture, la ligne 15 commence par stocker l'objet jQuery correspondant
à la balise d'identiant #mondiv dans la variable div. Ainsi, il sura d'écrire mondiv
à la place de $('#mondiv'); :
1 var div = $ ( '# mondiv ') ;
Les lignes 17 à 19 sont construites sur le même modèle. À titre d'exemple, la ligne
17 lit la valeur premier de la variable mesValeurs associée à la balise <div> et la
mémorise dans la variable val1 :
1 var val1 = $ . data ( div , ' mesValeurs ') . premier ;
Les lignes 20 à 22 insèrent les trois valeurs récupérées lignes 17 à 19 dans les balises
<span> #sp1, #sp2 et #sp3 :
1 $ ( '# sp1 ') . text ( val1 );
2 $ ( '# sp2 ') . text ( val2 );
3 $ ( '# sp3 ') . text ( val3 );
Si vous exécutez ce code dans votre navigateur, vous devriez obtenir le même résultat
qu'à la gure 5.9.
Je vous ai dit que les données associées aux éléments ne surchargeaient pas la mémoire
de l'ordinateur, car elles étaient détruites lorsque l'élément auquel elles sont liées est
retiré du DOM, lorsque la page Web change ou que le navigateur est fermé.
Je voudrais vous parler d'une troisième technique, moins destructrice que les deux
premières puisqu'elle se contente de supprimer les données associées à un élément sans
74
ASSOCIER DES DONNÉES AUX BALISES
. . . où :
el est le nom de l'élément (sans apostrophes) auquel les données ont été associées ;
nom est le nom (entre apostrophes) de la variable dans lequel les données ont été
stockées.
Par exemple, pour supprimer la variable mesValeurs associée à la balise <div> #mondiv
de l'exemple précédent, vous utiliserez les instructions suivantes :
1 var div = $ ( '# mondiv ') ;
2 $ . removeData ( div , ' mesValeurs ') ;
En résumé
Les termes getter et setter correspondent aux méthodes de lecture (getter) et d'écri-
ture (setter) du langage jQuery. Ils viennent des verbes anglais to get (obtenir) et to
set (dénir). En jQuery, un getter est une méthode qui obtient une valeur HTML
ou CSS en interrogeant le code. Inversement, un setter est une méthode qui modie
une valeur HTML ou CSS dans le code du document.
Un sélecteur jQuery peut retourner zéro, un ou plusieurs éléments. Lorsqu'aucun
élément n'est retourné, le getter renvoie la valeur undefined (c'est-à-dire non dé-
ni ). Lorsqu'un seul élément est retourné, le getter renvoie la valeur de cet élément.
Les setters reçoivent généralement plusieurs paramètres textuels qui permettent de
modier une propriété CSS, un attribut HTML ou encore d'insérer un élément dans
le code.
Vous utiliserez la méthode attr() pour lire, créer et modier les attributs des balises
HTML.
75
CHAPITRE 5. MODIFIER LE CONTENU D'UN ÉLÉMENT
Vous utiliserez la méthode css() pour lire, créer et modier les propriétés CSS
attachées au document.
La méthode addClass() ajoute à la sélection l'attribut class dont le nom est indiqué
entre les parenthèses. La méthode removeClass() supprime un attribut class dans
une balise. Enn, la méthode hasClass() permet de tester l'existence d'une classe
dans les éléments retournés par le sélecteur.
La méthode val() permet de connaître et de modier la valeur des zones de texte,
boutons radio, cases à cocher, listes déroulantes et zones de liste contenues dans un
document HTML.
Les méthodes text() et html() permettent de travailler avec les valeurs stockées
dans des éléments HTML : text() retourne/modie la valeur textuelle stockée dans
l'élément, et html() retourne/modie le code HTML stocké dans l'élément.
Pour connaître/modier la position absolue d'une balise dans le document, vous
utiliserez les méthodes offset() et position(). Pour connaître les dimensions
d'un élément, vous utiliserez les méthodes width(), innerWidth(), outerWidth(),
height(), innerHeight(), et outerHeight().
En utilisant le langage jQuery, il est possible d'associer des données aux balises
HTML. Pour cela, on utilise la méthode $.data(). Dans un premier temps, on
aecte une ou plusieurs données à la balise en utilisant la méthode $.data() en
tant que setter. Lorsque cela est nécessaire, la ou les valeurs associées à la balise
sont récupérées en utilisant la méthode $.data() en getter. Lorsque les données
associées à une balise ne sont plus nécessaires, on peut les supprimer avec la méthode
$.removeData().
76
Chapitre 6
Insérer et remplacer des éléments dans
le DOM
Diculté :
N ous allons ici nous intéresser à une autre facette de jQuery : la modication du
DOM. Les méthodes qui vont être examinées permettent d'insérer, de remplacer et
de supprimer des éléments quelconques dans le DOM, et ainsi de modier le contenu
de la page achée dans le navigateur.
77
CHAPITRE 6. INSÉRER ET REMPLACER DES ÉLÉMENTS DANS LE DOM
Insérer du contenu
Toutes les méthodes passées en revue dans cette section seront testées sur le code
suivant :
15 < h2 id = " deux " > Lorem ipsum suite </ h2 >
16 <p >
17 Duis aute irure dolor in reprehenderit in voluptate velit
esse cillum dolore eu fugiat nulla pariatur .
18 Excepteur sint occaecat cupidatat non proident , sunt in
culpa qui officia deserunt mollit anim id est laborum .
19 </p >
20 <hr >
21
30 < script src = " jquery . js " > </ script >
31 < script >
32 $ ( function () {
33 // Ins é rer le code jQuery ici
34 }) ;
35 </ script >
36 </ body >
37 </ html >
78
INSÉRER DU CONTENU
La gure 6.1 vous montre comment apparaît la page lorsqu'aucun code jQuery n'a été
inséré.
79
CHAPITRE 6. INSÉRER ET REMPLACER DES ÉLÉMENTS DANS LE DOM
3 ') ;
Une petite question à tout hasard : quelle instruction jQuery utiliseriez-vous pour
remplacer tous les titres <h2> du document par des titres <h3> ?
...
Alors, une petite idée ? Peut-être avez-vous songé à cette instruction :
1 $ ( ' h2 ') . replaceWith ( ' <h3 > ') ;
Mais quelle déception lorsque vous avez aché le document dans votre navigateur ! En
eet, vous devriez avoir quelque chose ressemblant à la gure 6.2.
80
INSÉRER DES ÉLÉMENTS
leur contenu et la balise fermante </h2>. Les trois titres de niveau 2 ont donc été
remplacés par une balise <h3>, sans balise fermante, ce qui a provoqué leur disparition.
Mais alors, est-ce que nous nous trouvons face à la première lacune de jQuery ? Bien
sûr que non ! La solution consiste à parcourir les éléments sélectionnés avec la méthode
each() et à eectuer un remplacement replaceWith() personnalisé :
1 $ ( 'h2 ') . each ( function () {
2 var elemH2 = $ ( this ) ;
3 elemH2 . replaceWith ( ' <h3 > ' + elemH2 . text () + ' </ h3 > ') ;
4 }) ;
La première ligne sélectionne tous les éléments <h2> du document ($.('h2')) et ap-
plique une fonction à chacun d'entre eux (each(function(){).
Pour limiter l'écriture et améliorer les performances du code, la deuxième ligne dénit
la variable elemH2 et y mémorise l'élément <h2> en cours de traitement.
La troisième ligne applique la méthode replaceWith() à l'élément jQuery en cours de
traitement (elemH2.replaceWith) et le remplace par une balise ouvrante <h3>, suivie
du texte contenu dans l'élément en cours de traitement (elemH2.text()) et d'une
balise fermante </h3>.
La quatrième ligne met n à la fonction et à la méthode each().
Pour décrire eai et cible, vous pouvez utiliser un sélecteur jQuery, un nom
d'élément, une chaîne HTML ou un objet jQuery.
81
CHAPITRE 6. INSÉRER ET REMPLACER DES ÉLÉMENTS DANS LE DOM
Figure 6.3 La puce Deuxième élément bis a été insérée après la puce Deuxième
élément
6.3
Sans trop y rééchir, vous pensez certainement qu'une puce Deuxième élément bis
est ajoutée avant la puce Deuxième élément . Pourtant, si vous exécutez le code,
vous obtenez la gure 6.5.
82
INSÉRER DES ÉLÉMENTS
Figure 6.4 Un séparateur horizontal a été inséré avant chaque titre de niveau 2
Figure 6.5 L'eet de la méthode prependTo() n'est pas celui qui était attendu
83
CHAPITRE 6. INSÉRER ET REMPLACER DES ÉLÉMENTS DANS LE DOM
Rappelez-vous ce que j'ai dit à propos des diérences entre les méthodes prependTo()
et insertBefore(). La première eectue une insertion à l'intérieur de la cible et la
deuxième avant la cible. Après l'exécution de l'instruction jQuery, le code HTML de
la liste à puces est donc le suivant :
1 <ul >
2 <li > Premier é l é ment </ li >
3 <li > < li > Deuxi è me é l é ment bis </ li > Deuxi è me é l é ment </ li >
4 <li > Troisi è me é l é ment </ li >
5 <li > Quatri è me é l é ment </ li >
6 </ ul >
Totalement incohérent d'un point de vue sémantique, ce code est mal interprété par le
navigateur qui ache. . . quelque chose d'assez inattendu ! Ne rejetez pas la faute sur
lui : dans ce cas précis, la méthode insertBefore() était plus adaptée à la situation.
Déplacer du contenu
Pour déplacer un élément existant dans le document, vous utiliserez les méthodes
append(), prepend(), before() ou after() :
$('sel').append(depl);
$('sel').prepend(depl);
$('sel').before(depl);
$('sel').after(depl);
. . . où sel sélectionne l'élément avant ou après lequel doit se faire le déplacement et
depl représente l'élément à déplacer.
Les méthodes append() et after() sont comparables : elles déplacent toutes deux un
élément après un autre élément. Mais attention, avec append() le déplacement se fait
avant la balise de n de l'élément sélectionné, alors qu'avec after() elle se fait après
cette balise.
Les méthodes prepend() et before() sont également comparables : elles déplacent
toutes deux un élément avant un autre élément. Mais attention, avec prepend() le
déplacement se fait après la balise de début de l'élément sélectionné, alors qu'avec
before() elle se fait avant cette balise.
À titre d'exemple, considérons le code suivant :
1 <! DOCTYPE html >
2 < html >
3 < head >
4 < meta charset = " UTF -8 " >
5 < title > D é placement de contenu </ title >
6 </ head >
7 < body >
8 <h2 > Lorem ipsum </ h2 >
9 <p id = " un " >
10 Lorem ipsum dolor sit amet , consectetur adipisicing elit ,
sed do eiusmod tempor incididunt ut labore et dolore
84
DUPLIQUER DES ÉLÉMENTS
magna aliqua .
11 Ut enim ad minim veniam , quis nostrud exercitation
ullamco laboris nisi ut aliquip ex ea commodo
consequat .
12 </p >
13 <hr >
14
22 < script src = " jquery . js " > </ script >
23 < script >
24 $ ( function () {
25 // Ins é rer le code jQuery ici
26 }) ;
27 </ script >
28 </ body >
29 </ html >
Ce code dénit deux titres de niveau 2, chacun suivi d'un paragraphe de texte et d'un
trait de séparation horizontal, comme le montre la gure 6.6.
Remplacez la ligne 25 par l'instruction suivante, sauvegardez le code et rafraîchissez la
page dans le navigateur.
1 $ ( '# deux ') . after ( $ ( '# un ') ) ;
85
CHAPITRE 6. INSÉRER ET REMPLACER DES ÉLÉMENTS DANS LE DOM
86
DUPLIQUER DES ÉLÉMENTS
87
CHAPITRE 6. INSÉRER ET REMPLACER DES ÉLÉMENTS DANS LE DOM
Figure 6.8 Le paragraphe d'identiant #deux a été cloné et copié avant le paragraphe
d'identiant #un
Si l'élément dupliqué a un ou plusieurs descendants, ils font eux aussi partie du clonage.
Nous allons illustrer ce comportement en dupliquant tous les éléments qui composent
la liste à puces du code suivant :
1 <! DOCTYPE html >
2 < html >
3 < head >
4 < meta charset = " UTF -8 " >
5 < title > D é placement de contenu </ title >
6 </ head >
7 < body >
8 <h2 > Lorem ipsum </ h2 >
9 <p id = " un " >
10 Lorem ipsum dolor sit amet , consectetur adipisicing elit ,
sed do eiusmod tempor incididunt ut labore et dolore
magna aliqua .
11 Ut enim ad minim veniam , quis nostrud exercitation
ullamco laboris nisi ut aliquip ex ea commodo
consequat .
88
DUPLIQUER DES ÉLÉMENTS
12 </p >
13 <hr >
14
24 < script src = " jquery . js " > </ script >
25 < script >
26 $ ( function () {
27 // Ins é rer le code jQuery ici
28 }) ;
29 </ script >
30 </ body >
31 </ html >
Ce code ache un titre 2 suivi d'un paragraphe de texte et d'un trait de séparation,
puis un autre titre 2 suivi d'une liste à puces composée de quatre éléments, comme le
montre la gure 6.9.
Insérez l'instruction suivante ligne 27 :
1 $ ( '<h1 > Sommaire </ h1 > ') . insertBefore ( $ ( ' h2 : first ') ) ;
2 $ ( 'h2 ') . clone () . insertAfter ( $ ( 'h1 ') ) ;
89
CHAPITRE 6. INSÉRER ET REMPLACER DES ÉLÉMENTS DANS LE DOM
90
DUPLIQUER DES ÉLÉMENTS
Figure 6.10 La liste à puces a été clonée et copiée avant le premier titre de niveau 2
91
CHAPITRE 6. INSÉRER ET REMPLACER DES ÉLÉMENTS DANS LE DOM
92
ENTOURER DES ÉLÉMENTS
16 < script src = " jquery . js " > </ script >
17 < script >
18 $ ( function () {
19 // Ins é rer le code jQuery ici
20 }) ;
21 </ script >
22 </ body >
23 </ html >
Ce code ache un titre de niveau 2 et une liste à puces composée de quatre éléments.
Supposons que vous vouliez acher les éléments de la liste à puces en italique. Pour
cela, il vous sut de les entourer avec la balise <i> en utilisant la méthode wrap().
Insérez l'instruction suivante ligne 19 :
1 $ ( 'li ') . wrap ( ' <i > </i > ') ;
93
CHAPITRE 6. INSÉRER ET REMPLACER DES ÉLÉMENTS DANS LE DOM
1 $ ( ' li ') . wrap ( '< font color =" red " > <b ><i > <u > </u > </i > </b > </ font > ') ;
Passons à la vitesse supérieure en utilisant une fonction pour personnaliser les éléments
insérés autour de la sélection.
La méthode wrap() a deux variantes :
wrapInner(), pour entourer le contenu d'un élément par un autre élément créé à la
volée ;
wrapAll(), pour entourer d'une façon globale les éléments sélectionnés avec un autre
élément créé à la volée.
Pour illustrer le fonctionnement de la méthode wrapInner(), supposons qu'une page
HTML dénisse le paragraphe suivant :
1 <p > Le texte du paragraphe </ p >
. . . le paragraphe se transforme en :
1 <p > <i > Le texte du paragraphe </ i > </p >
94
ENTOURER DES ÉLÉMENTS
19 < script src = " jquery . js " > </ script >
20 < script >
21 $ ( function () {
22 // Ins é rer le code jQuery ici
23 }) ;
24 </ script >
25 </ body >
26 </ html >
95
CHAPITRE 6. INSÉRER ET REMPLACER DES ÉLÉMENTS DANS LE DOM
<div>. Le style div a été déni dans le document : les éléments de ce style auront un
arrière-plan rouge. Insérez l'instruction suivante en ligne 22 :
1 $ ( 'p ') . wrapAll ( '<div > </ div > ') ;
Ou encore, pour supprimer la troisième puce dans l'unique liste à puces du document,
utilisez l'instruction suivante :
1 $ ( ' li : nth - child (2) ') . remove () ;
96
SUPPRIMER DES ÉLÉMENTS
Un dernier exemple. Pour supprimer tous les paragraphes qui contiennent le mot quel-
conque , utilisez l'instruction suivante :
1 $ ( 'p ') . remove ( ': contains (" quelconque ") ') ;
En résumé
Pour insérer du contenu dans un document, vous utiliserez les méthodes append(),
prepend(), before() et after(). Pour remplacer des éléments, vous utiliserez la
méthode replaceWith(). Pour insérer des éléments dans le DOM, vous utiliserez
les méthodes appendTo(), prependTo(), insertBefore() et insertAfter(). En-
n, pour dupliquer des éléments, vous utiliserez la méthode clone(), chaînée à la
méthode appendTo(), prependTo(), insertBefore() ou insertAfter().
Les méthodes wrap(), wrapInner() et wrapAll() permettent d'entourer un élément
par un ou plusieurs autres éléments créés à la volée.
Pour supprimer un élément, vous utiliserez la méthode remove().
97
CHAPITRE 6. INSÉRER ET REMPLACER DES ÉLÉMENTS DANS LE DOM
98
Chapitre 7
TP : Questionnaire interactif en jQuery
Diculté :
99
CHAPITRE 7. TP : QUESTIONNAIRE INTERACTIF EN JQUERY
100
INSTRUCTIONS POUR RÉALISER LE TP
Si la troisième étape peut vous poser des problèmes, ce n'est pas tant par sa complexité
que par le fait que vous devrez utiliser une instruction jQuery qui n'a pas encore
été vue et qui donne de l'interactivité au QCM. J'aurais pu limiter votre travail à
une pure mise en forme, mais cela aurait vraiment été dommage de ne pas intégrer
de l'interactivité dans ce formulaire. Je vais donc vous donner l'instruction jQuery à
utiliser, sans m'étendre sur le sujet ni expliquer son fonctionnement.
La méthode à utiliser est la suivante :
1 $ ( 'a ') . hover (
2 function () {
3 // Les instructions à ex é cuter au survol du lien
4 },
5 function () {
6 // Les instructions à ex é cuter lorsque le lien n ' est plus
survol é
7 }
8 );
Vous voyez, il n'y a rien de bien sorcier. Vous auriez presque pu trouver la méthode
sans mon aide tant elle est proche de son homologue CSS hover.
Voici le code HTML de départ :
1 <! DOCTYPE html >
2 <! DOCTYPE html >
3 < html >
4 < head >
5 < meta charset = " UTF -8 " >
6 < title > Questionnaire interactif en jQuery </ title >
7 </ head >
8
101
CHAPITRE 7. TP : QUESTIONNAIRE INTERACTIF EN JQUERY
50 < script src = " jquery . js " > </ script >
51 < script >
52 $ ( function () {
102
CORRECTION
Correction
J'espère que vous n'avez pas eu trop de problèmes dans ce TP. Voici ma correction,
dans laquelle je passe en revue tous les points qui auraient pu coincer .
103
CHAPITRE 7. TP : QUESTIONNAIRE INTERACTIF EN JQUERY
104
CORRECTION
La troisième instruction fait otter l'image à droite de la balise <div> parente, c'est-
à-dire de la balise <div> de classe question :
1 $ ( ' img ') . css ( ' float ' , ' right ') ;
Enn, la quatrième instruction décale l'image vers le bas en dénissant une marge
supérieure de 80 pixels :
1 $ ( ' img ') . css ( ' margin - top ', ' 80 px ') ;
La mise en page est maintenant terminée. Si vous exécutez le code, vous devriez obtenir
quelque chose ressemblant à la gure 7.3.
Dans ce TP, la mise en forme des éléments HTML a été réalisée en jQuery.
Certains d'entre vous ont peut-être utilisé des instructions CSS à la place. Il
n'y a rien de mal à cela. Je dirai même que la mise en forme est le propre
du CSS. Si j'ai utilisé des instructions jQuery à la place, ce n'est que pour
ajouter quelques exemples à votre palmarès.
106
CORRECTION
21
Ne vous laissez pas impressionner par la longueur du code ! Vous allez voir, toutes ces
lignes sont vraiment simples à comprendre !
La première fonction contient trois blocs d'instructions quasiment identiques. Chacun
d'entre eux s'intéresse à une des questions posées dans le QCM. Nous allons nous
intéresser au premier bloc d'instructions. Vous pourrez sans problème transférer les
explications qui vont être données aux deux autres blocs.
Après avoir validé l'achage des balises de classe reponse :
1 $ ( '. reponse ') . show () ;
. . . l'état du premier bouton radio est testé (ce choix représente la bonne réponse). Si
ce bouton a été sélectionné :
1 if ( $ ( ': radio [ id =" r1 "]: checked ') . val () ) {
107
CHAPITRE 7. TP : QUESTIONNAIRE INTERACTIF EN JQUERY
Les deux autres blocs de code eectuent un traitement similaire, si ce n'est qu'ils testent
un autre bouton radio, et qu'ils agissent sur d'autres balises <img> et <span>.
Le deuxième paramètre de la méthode hover() indique ce qu'il faut faire quand le lien
n'est plus pointé par la souris. La réponse doit être cachée :
1 function () {
2 $ ( '. reponse ') . hide () ;
. . . et l'image question.png doit être achée dans les trois balises <img> :
1 $ ( ' img ') . each ( function () {
2 $ ( this ) . attr ( ' src ', ' question . png ') ;
3 }) ;
Le code complet
Ça y est, le code est entièrement opérationnel. Bien entendu, vous pouvez le modier
pour créer vos propres QCM. . .
1 <! DOCTYPE html >
2 < html >
3 < head >
4 < meta charset = " UTF -8 " >
5 < title > Questionnaire interactif en jQuery </ title >
6 </ head >
7
108
CORRECTION
23
49 < script src = " jquery . js " > </ script >
50 < script >
51 $ ( function () {
52 // Dissimulation des r é ponses
53 $ ( '. reponse ') . hide () ;
54
109
CHAPITRE 7. TP : QUESTIONNAIRE INTERACTIF EN JQUERY
64 $ ( '. texte ') . css ( ' float ' , ' left ') ;
65 $ ( '. texte ') . css ( ' width ' , ' 90% ') ;
66 $ ( ' img ') . css ( ' float ', ' right ') ;
67 $ ( ' img ') . css ( ' margin - top ' , '80 px ') ;
68
110
CORRECTION
111
CHAPITRE 7. TP : QUESTIONNAIRE INTERACTIF EN JQUERY
112
Troisième partie
Aller plus loin avec jQuery
113
Chapitre 8
Les bases de la gestion événementielle
Diculté :
115
CHAPITRE 8. LES BASES DE LA GESTION ÉVÉNEMENTIELLE
La souris
Avant de commencer
Quel que soit l'événement à gérer, vous devrez mettre en place une méthode qui res-
semblera à ceci :
. . . où sel est un sélecteur jQuery comme ceux que vous avez rencontrés jusqu'ici et
mge est une méthode de gestion événementielle comme celles que vous rencontrerez
tout au long de ce chapitre.
La mise en place d'un événement concerne tous les éléments retournés par le sélecteur.
Ainsi par exemple, en appliquant une gestion événementielle au sélecteur $('img'), elle
concernera toutes les balises <img> du document. Ou encore, en appliquant une gestion
événementielle au sélecteur $('.resultat'), elle s'appliquera à toutes les balises de
classe resultat. Bref, vous l'aurez compris : une seule instruction permet de mettre
en place plusieurs gestions événementielles. Quel gain de temps ! À vous de trouver le
sélecteur le plus approprié à chaque cas.
La souris est un périphérique universellement utilisé pour communiquer avec l'ordina-
teur. Vous pouvez désigner un élément en le pointant, sélectionner ou donner le focus à
un élément en cliquant dessus, ou encore déplacer le contenu d'un élément doté d'une
barre de délement en agissant sur la roulette. Autant d'événements accessibles en
jQuery. Dans ce sous-chapitre, nous allons nous intéresser aux événements décrits dans
le tableau suivant.
116
LA SOURIS
3 < script src = " jquery . js " > </ script >
4 < script >
5 $ ( function () {
6 // Dimensions de la fen ê tre
7 var largeur = ( $ ( window ) . width () ) - 50;
8 var hauteur = ( $ ( window ) . height () ) - 50;
9
Examinons les instructions qui composent ce document. Une balise <img> d'identiant
#target fait référence à l'image petitchat.jpg. Le reste du code utilise des instruc-
tions jQuery pour modier l'emplacement de l'image et réagir aux clics de l'utilisateur.
Après avoir attendu la disponibilité du DOM, les dimensions de la fenêtre sont mémo-
risées dans les variables largeur et hauteur :
1 var largeur = ( $ ( window ) . width () ) - 50;
2 var hauteur = ( $ ( window ) . height () ) - 50;
Vous avez raison, cette instruction n'a apparemment aucun intérêt. Et pourtant, en
y regardant d'un peu plus près. . . En utilisant l'instruction $('#target').offset()
et en mémorisant son résultat dans la variable JavaScript p, on dénit du même coup
un objet jQuery par lequel les coordonnées de l'image pourront être modiées. C'est
d'ailleurs ce que font les deux instructions suivantes en achant l'image aux coordon-
nées (100, 100) :
1 p . top =100;
2 p . left =100;
Il ne reste plus qu'à utiliser la méthode offset() pour acher l'image aux coordonnées
(100, 100) :
1 $ ( '# target ') . offset ( p );
Une gestion événementielle est mise en place pour l'événement click, c'est-à-dire
lorsque l'utilisateur clique sur le bouton gauche de la souris :
1 $ ( " # target " ) . click ( function () {
Une nouvelle position aléatoire est choisie pour l'image (tout en restant dans les limites
de la fenêtre) en attendant un autre clic de l'utilisateur. Un nombre aléatoire compris
entre 0 et la largeur de la fenêtre est choisi et mémorisé dans la variable x :
1 x = Math . floor ( Math . random () * largeur ) ;
Math.random() est une fonction JavaScript qui retourne un nombre aléatoire compris
entre 0 et une valeur proche de 1. Dans cet exemple, an de simplier les choses, nous
allons admettre que le nombre retourné est compris entre 0 et 1.
En multipliant la valeur retournée par la largeur de la fenêtre, on obtient un nombre
compris entre 0 et la largeur de la fenêtre. Enn, en appliquant la fonction JavaScript
Math.random() à ce nombre, on obtient la valeur entière la plus proche de ce nombre.
C'est exactement l'eet recherché.
La ligne suivante utilise la même technique pour choisir un nombre aléatoire compris
entre 0 et la hauteur de la fenêtre. Ce nombre est mémorisé dans la variable y.
Pour déplacer l'image, nous utilisons la technique traditionnelle. Après avoir obtenu
un objet jQuery qui correspond à la position actuelle de l'image :
118
LA SOURIS
. . . les coordonnées de l'image sont modiées en utilisant les coordonnées tirées aléa-
toirement dans l'étape précédente :
1 p . top = y ;
2 p . left = x ;
La méthode scroll
Pour terminer avec les méthodes événementielles relatives à la souris, il ne reste plus
qu'à écrire un peu de code pour utiliser la méthode scroll().
1 < style type = " text / css " >
2 div {
3 width : 200 px ;
4 height : 200 px ;
5 overflow : scroll ;
6 background - color : yellow ;
7 border : 2 px black solid ;
8 }
9 </ style >
10
11 <div >
12 Lorem ipsum dolor sit amet , consectetur adipisicing elit , sed
do eiusmod tempor incididunt ut labore et dolore magna
aliqua .
13 Ut enim ad minim veniam , quis nostrud exercitation ullamco
laboris nisi ut aliquip ex ea commodo consequat .
14 Duis aute irure dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur .
15 Excepteur sint occaecat cupidatat non proident , sunt in culpa
qui officia deserunt mollit anim id est laborum .
16 </ div >
17
18 < script src = " jquery . js " > </ script >
19 < script >
20 $ ( function () {
21 $ ( ' div ') . scroll ( function () {
119
CHAPITRE 8. LES BASES DE LA GESTION ÉVÉNEMENTIELLE
Ici aussi, la détection d'un mouvement de roulette déclenche l'achage d'une boîte de
message :
1 alert ( ' Utilisation de la roulette dans le document ') ;
which et type
Dans certains cas particuliers, il peut être nécessaire de savoir quel bouton de la souris
a été pressé. Pour cela, vous ferez appel à la méthode event.which, qui renvoie l'une
des valeurs suivantes :
1 : bouton gauche pressé ;
2 : bouton central pressé ;
3 : bouton droit pressé.
Pour connaître le type d'événement qui a été levé par la procédure de gestion événemen-
tielle, vous utiliserez la méthode event.type. La valeur renvoyée pourra être click,
dblclick, mousedown, mouseenter, mouseover, mouseleave, mouseout, mousemove ou
mouseup.
120
LE CLAVIER
5 < script src = " jquery . js " > </ script >
6 < script >
7 $ ( function () {
8 $ ( '# target ') . mousedown ( function ( e ) {
9 $ ( '# rapport ') . html ( 'É v é nement : ' + e . type + '. Bouton
press é : ' + e . which ) ;
10 }) ;
11 }) ;
12 </ script >
Les méthodes e.type et e.which sont utilisées pour indiquer le type d'événement levé
et le bouton qui a été pressé. Ces informations sont achées dans la balise <span>
d'identiant #rapport :
1 $ ( '# rapport ') . html ( 'É v é nement : ' + e . type + '. Bouton press é :
' + e . which ) ;
Le clavier
Le clavier est également un périphérique fondamental pour communiquer avec l'ordi-
nateur. Sur le Web, il est essentiellement utilisé pour saisir des données textuelles dans
des formulaires. jQuery est en mesure de capturer trois événements en rapport avec le
clavier.
Méthode Événement géré
keydown() Appui sur une touche du clavier
keyup() Relâchement d'une touche du clavier préalablement enfoncée
keypress() Maintien d'une touche du clavier enfoncée
Voyons comment utiliser ces méthodes en raisonnant sur un cas pratique. À titre
d'exemple, nous allons acher un petit rectangle de couleur verte chaque fois qu'un
caractère sera ajouté dans une balise <textarea>. Ce rectangle deviendra blanc lorsque
la touche sera relâchée. Voici le code utilisé :
1 < style type = " text / css " >
2 # lumiere {
121
CHAPITRE 8. LES BASES DE LA GESTION ÉVÉNEMENTIELLE
3 width : 10 px ;
4 height : 10 px ;
5 background - color : white ; }
6 </ style >
7
11 < script src = " jquery . js " > </ script >
12 < script >
13 $ ( function () {
14 $ ( '# target ') . keydown ( function () {
15 $ ( '# lumiere ') . css ( ' background - color ', ' green ') ;
16 }) ;
17 $ ( '# target ') . keyup ( function () {
18 $ ( '# lumiere ') . css ( ' background - color ', ' white ') ;
19 }) ;
20 }) ;
21 </ script >
Le code jQuery met en place deux procédures événementielles : une relative à l'évé-
nement keydown et l'autre à l'événement keyup. Lorsqu'une touche du clavier est en-
foncée, la couleur d'arrière-plan de la balise <div> devient verte. Lorsque la touche est
relâchée, la balise redevient blanche.
Dans certains programmes écrits en jQuery, il peut être nécessaire de savoir quelle
touche du clavier a été pressée. Pour cela, vous ferez appel à la méthode event.which
qui renvoie précisément cette information. Pour connaître le type d'événement qui a été
levé par la procédure de gestion événementielle, vous utiliserez la méthode event.type.
La valeur renvoyée pourra être keydown, keypress ou keyup, en fonction de la méthode
événementielle utilisée. Voyons comment utiliser la méthode event.which en pratique.
1 < form >
2 Laissez aller votre imagination : saisissez quelques mots < br
/>
3 < textarea id = " saisie " > </ textarea >
4 </ form > < br / >
5 Caract è re saisi : < span id = " unelettre " > </ span >
6
7 < script src = " jquery . js " > </ script >
8 < script >
9 $ ( function () {
10 $ ( '# saisie ') . keypress ( function ( e ) {
11 $ ( '# unelettre ') . text ( e . which ) ; // keyCode
12 }) ;
13 }) ;
14 </ script >
L'utilisateur est invité à taper quelques mots dans la zone de texte multilignes. Chacun
des caractères tapés est alors aché en dessous de la zone de saisie. Le code jQuery met
en place un gestionnaire événementiel sur la balise d'identiant #saisie, c'est-à-dire
122
LE CLAVIER
sur le <textarea>. La touche frappée est récupérée et achée dans la balise <span>,
comme le montre la gure 8.1.
Espace 32 3 51 F 70 Y 89 l 108
! 33 4 52 G 71 Z 90 m 109
34 5 53 H 72 [ 91 n 110
# 35 6 54 I 73 \ 92 o 111
$ 36 7 55 J 74 ] 93 p 112
% 37 8 56 K 75 ^ 94 q 113
& 38 9 57 L 76 _ 95 r 114
' 39 : 58 M 77 ` 96 s 115
( 40 ; 59 N 78 a 97 t 116
) 41 < 60 O 79 b 98 u 117
* 42 = 61 P 80 c 99 v 118
+ 43 > 62 Q 81 d 100 w 119
, 44 ? 63 R 82 e 101 x 120
- 45 @ 64 S 83 f 102 y 121
. 46 A 65 T 84 g 103 z 122
/ 47 B 66 U 85 h 104 { 123
0 48 C 67 V 86 i 105 | 124
1 49 D 68 W 87 j 106 } 125
2 50 E 69 X 88 k 107 ~ 126
Avec keydown() et keyup(), il s'agit d'une version simpliée du code ASCII dans
laquelle les caractères minuscules et majuscules sont confondus.
Si vous voulez obtenir non pas le code du caractère mais le caractère lui-même, assurez-
vous que vous utilisez la méthode keypress() :
1 $ ( '# saisie ') . keypress ( function ( e ) {
123
CHAPITRE 8. LES BASES DE LA GESTION ÉVÉNEMENTIELLE
124
LES ÉLÉMENTS
Les éléments
J'ai ici regroupé les méthodes événementielles en rapport avec le gain et la perte de
focus, la modication de la taille et du contenu, et la sélection d'un élément.
focus() et blur()
Un peu de code va éclaircir ce que je viens de dire. Tout d'abord, intéressons-nous aux
méthodes focus() et blur().
1 < form >
2 Cliquez sur les zones de texte <p >
3 < input type = " text " class = " f " id = " Zone - de - texte -1 " ><p >
4 < input type = " text " class = " f " id = " Zone -de - texte -2 " >< br / >
5 </ form > < br / >
6
7 Focus : < span id = " resultat " > </ span > < br / >
8 Perte de focus : < span id = " resultat2 " > </ span >
9
10 < script src = " jquery . js " > </ script >
125
CHAPITRE 8. LES BASES DE LA GESTION ÉVÉNEMENTIELLE
20 }) ;
21 </ script >
Examinez le sélecteur. Toutes les balises de classe f sont concernées, à savoir les
deux zones de texte. Lorsque cette fonction événementielle est exécutée, l'identiant
(attr('id')) de la balise qui a déclenché l'événement ($(this)) est aché (text)
dans la balise d'identiant #resultat ($('#resultat')), c'est-à-dire dans la première
balise <span> :
1 $ ( '# resultat ') . text ( $ ( this ) . attr ( 'id ') ) ;
Cette méthode concerne les balises de classe f, et donc les deux zones de texte.
Lorsque cette fonction événementielle est exécutée, l'identiant (attr('id')) de la
balise qui a déclenché l'événement ($(this)) est aché (text) dans la balise d'identi-
ant #resultat2 ($('#resultat2')), c'est-à-dire dans la deuxième balise <span>.
La gure 8.2 montre la page Web après avoir donné le focus à la deuxième zone de
texte, puis à la première.
focusin() et focusout()
Nous allons maintenant nous intéresser aux méthodes focusin() et focusout(), et
montrer leurs diérences par rapport aux méthodes focus() et blur(). Pour cela,
deux balises <fieldset> contenant chacune deux balises <input type="text"> vont
126
LES ÉLÉMENTS
Figure 8.2 Les deux <span> sont mis à jour en fonction de l'élément qui a le focus
être créées. Le gain et la perte de focus seront testés au niveau des balises <fieldset>.
En donnant le focus à une zone de texte, l'événement sera répercuté jusqu'à la balise
<fieldset> parent qui achera des informations en conséquence.
1 < form >
2 Cliquez sur les zones de texte <p >
3 < fieldset id = " premier " >
4 < legend > Premier groupe </ legend >
5 < input type = " text " class = " f " id = " Zone - de - texte -1 " ><p >
6 < input type = " text " class = " f " id = " Zone - de - texte -2 " >< br / >
7 </ fieldset >
8
16 Focus : < span id = " resultat " > </ span > < br / >
17 Perte de focus : < span id = " resultat2 " > </ span >
18
19 < script src = " jquery . js " > </ script >
20 < script >
21 $ ( function () {
22 $ ( ' fieldset ') . focusin ( function () {
23 $ ( '# resultat ') . text ( $ ( this ) . attr ( 'id ') ) ;
24 }) ;
25 $ ( ' fieldset ') . focusout ( function () {
26 $ ( '# resultat2 ') . text ( $ ( this ) . attr ( ' id ') ) ;
27 }) ;
28 }) ;
29 </ script >
127
CHAPITRE 8. LES BASES DE LA GESTION ÉVÉNEMENTIELLE
resize()
Nous allons maintenant nous intéresser à la méthode événementielle resize(). Cette
méthode est exécutée chaque fois que la fenêtre change de taille. Nous allons l'utiliser
pour acher dans une balise <span> les dimensions de la fenêtre chaque fois qu'elle est
exécutée :
1 < span id = " resultat " > </ span >
2
3 < script src = " jquery . js " > </ script >
4 < script >
5 $ ( function () {
6 $ ( window ) . resize ( function () {
7 var taille = ' Taille de la fen ê tre : ' + $ ( window ) . width
() + ' px x ' + $ ( window ) . height () + ' px ';
8 $ ( '# resultat ') . text ( taille ) ;
9 }) ;
10 }) ;
11 </ script >
Le corps du document est vraiment simple, puisqu'il ne comporte qu'une balise <span>
dans laquelle nous acherons les dimensions de la fenêtre. Quant au traitement, il est
128
LES ÉLÉMENTS
Puis le contenu de la variable taille est copié (text(taille)) dans la balise <span>
d'identiant #resultat ($('#resultat')) :
1 $ ( '# resultat ') . text ( taille ) ;
change()
Pour en terminer avec les méthodes événementielles relatives aux éléments, nous allons
nous intéresser à la méthode change(). Cette méthode est exécutée chaque fois que le
contenu de l'élément concerné change. Elle peut être utilisée sur les balises <input>,
<textarea> et <select>. À titre d'exemple, nous allons détecter les modications dans
une liste déroulante et acher un message en conséquence.
1 < form >
2 S é lectionnez une valeur dans la liste d é roulante
3 < select >
4 < option > J ' aime jQuery </ option >
5 < option > J ' adore jQuery </ option >
6 < option > Je raffole de jQuery </ option >
7 < option > jQuery ? Jamais entendu parler ! </ option >
8 </ select >
9 </ form > < br / >
10
11 < span id = " resultat " > </ span > < br / >
12
13 < script src = " jquery . js " > </ script >
14 < script >
15 $ ( function () {
16 $ ( ' select ') . change ( function () {
17 $ ( '# resultat ') . text ( ' Vous venez de sé lectionner " ' + $ (
this ) . val () + ' ". ') ;
18 }) ;
19 }) ;
20 </ script >
Le corps du document met en place une liste déroulante qui contient quatre éléments.
L'élément sélectionné dans la liste sera indiqué dans la balise <span> d'identiant
#resultat. La partie la plus intéressante du code se trouve bien évidemment entre les
balises <script> et </script>. La méthode événementielle change() est appliquée à
la balise <select>. Chaque fois que l'utilisateur sélectionne une valeur dans la liste,
cette méthode est exécutée :
129
CHAPITRE 8. LES BASES DE LA GESTION ÉVÉNEMENTIELLE
Le texte de l'élément sélectionné dans la liste ($(this).val()) est alors aché dans
la balise <span> d'identiant #resultat ($('#resultat').text) :
1 $ ( '# resultat ') . text ( ' Vous venez de s é lectionner " ' + $ ( this ) .
val () + ' ". ') ;
Figure 8.3 Le texte est mis à jour en fonction du choix dans la liste
Les pages
Appliquée à l'élément window, la méthode événementielle load() permet de tester le
complet chargement d'une page, en incluant les textes, images et autres objets qui la
composent. Quant à la méthode unload(), elle est déclenchée lorsque l'internaute a
demandé un changement de page. Voyons comment utiliser ces deux méthodes :
1 < img src = " canard . jpg " >< br / >
2 <a href = " http :// www . siteduzero . com " > Cliquez ici pour aller sur
le Site du Z é ro </ a >
3
4 < script src = " jquery . js " > </ script >
5 < script >
6 $ ( function () {
7 alert ( ' Le DOM est charg é ') ;
8 $ ( window ) . load ( function () {
9 alert ( ' La page est enti è rement charg é e ') ;
10 }) ;
11 $ ( window ) . unload ( function () {
12 alert ( ' Vous avez demand é à changer de page ') ;
13 }) ;
14 }) ;
15 </ script >
130
LES PAGES
Le corps du document contient une image et un lien qui pointe vers le Site du Zéro.
Lorsque le DOM est disponible, une boîte de dialogue est achée :
1 alert ( 'Le DOM est charg é ') ;
Le contenu de la page est alors chargé. Lorsque l'image et le lien sont en mémoire, la
méthode événementielle $(window).load() s'exécute. Une autre boîte de dialogue est
alors achée :
1 alert ( 'La page est enti è rement charg é e ') ;
Enn, quand l'utilisateur clique sur le lien Cliquez ici pour aller sur le Site du Zéro ,
puis clique sur Page précédente ou Page suivante du navigateur ou lorsqu'il ferme ce
dernier, la méthode événementielle $(window).unload() est exécutée, ce qui produit
l'achage d'une troisième boîte de dialogue :
1 alert ( ' Vous avez demand é à changer de page ') ;
En résumé
Dans une méthode de gestion événementielle de type mousedown(function(e)),
e.which indique quel bouton a été pressé (1 pour le bouton gauche, 2 pour le bou-
ton central, 3 pour le bouton droit). Dans une méthode de gestion événementielle
de type keypress(function(e)), e.which retourne le code ASCII de la touche
pressée. Ce code peut être converti en un caractère avec la fonction JavaScript
String.fromCharCode().
Vous utiliserez la méthode focus() pour eectuer un traitement suite au gain de fo-
cus par un élément et la méthode blur() pour eectuer un traitement suite à la perte
de focus par un élément. Si le gain et la perte de focus peuvent également concerner
les enfants de l'élément, vous utiliserez les méthodes focusin() et focusout().
Appliquée à l'élément window, la méthode load() permet d'exécuter du code lorsque
la page est entièrement chargée, en incluant les textes, images et autres objets qui
la composent. Quant à la méthode unload(), elle permet d'exécuter du code juste
avant un changement de page demandé par l'utilisateur.
131
CHAPITRE 8. LES BASES DE LA GESTION ÉVÉNEMENTIELLE
132
Chapitre 9
Plus loin dans la gestion événementielle
Diculté :
A rrivés à ce point dans la lecture du cours, vous savez comment mettre en place une
gestion événementielle en rapport avec la souris, le clavier et les éléments achés sur
une page Web. Je vous propose d'aller plus loin en vous faisant découvrir comment
gérer plusieurs événements avec une seule méthode, déclencher des événements avec du
code jQuery ou encore utiliser la délégation d'événements pour limiter le code.
133
CHAPITRE 9. PLUS LOIN DANS LA GESTION ÉVÉNEMENTIELLE
Événements personnalisés
Sans le savoir, vous avez utilisé la version simpliée de la méthode on() dans toutes
les méthodes événementielles étudiées jusqu'ici. Le tableau suivant donne quelques
correspondances entre les méthodes traditionnelles et les méthodes on() équivalentes.
Comme nous allons le voir, la méthode on() a plusieurs avantages. Elle permet de :
Limiter l'écriture en associant une même méthode événementielle à plusieurs élé-
ments ;
Relier plusieurs méthodes événementielles à un élément en une seule instruction ;
Désactiver une méthode événementielle précédemment attachée avec la méthode
on() ;
Relier plusieurs méthodes événementielles entre elles. Par la suite, vous pourrez
toutes les déclencher, ou toutes les désactiver en une seule instruction jQuery.
Comme vous le voyez, il sut de passer les méthodes événementielles dans le premier
argument de la méthode on() en les mettant entre apostrophes et en les séparant par
134
ÉVÉNEMENTS PERSONNALISÉS
une espace.
En utilisant la méthode on(), une seule ligne sut pour associer les deux traitements
aux deux événements des images de classe grand :
1 $ ( ' img . grand ') . on ({ mouseenter : fonction1 , mousemove : fonction2 }) ;
6 < script src = " jquery . js " > </ script >
7 < script >
8 $ ( function () {
9 function traitement () {
10 alert ( ' Image cliqu é e ') ;
11 }
12 $ ( '# activer ') . on ( ' click ' , function () {
13 $ ( '# image ') . click ( traitement ) ;
14 }) ;
15 $ ( '# desactiver ') . on ( ' click ', function () {
135
CHAPITRE 9. PLUS LOIN DANS LA GESTION ÉVÉNEMENTIELLE
Tout ceci fonctionne parfaitement tant que vous utilisez la bibliothèque jQuery sans
aucun plugin. Par contre, si un ou plusieurs plugins sont utilisés (un chapitre y est
consacré), il se peut qu'ils dénissent leurs propres méthodes événementielles et qu'ils
les attachent aux mêmes sélecteurs que vous. Si vous utilisez la méthode off() en pré-
cisant un nom d'événement, comme dans l'instruction précédente, toutes les méthodes
événementielles correspondant à cet événement seront supprimées : les vôtres, mais
aussi celles qui sont peut-être dénies dans les plugins que vous utilisez. Du coup, ces
plugins risquent de ne plus fonctionner !
136
ÉVÉNEMENTS PERSONNALISÉS
Première parade
Dans la sous-section Désactiver une méthode de gestion événementielle , vous avez vu
qu'il était possible de créer une fonction de traitement en JavaScript, et d'indiquer son
nom lorsque vous dénissez une méthode événementielle à un sélecteur. Par exemple,
pour attacher une méthode événementielle correspondant à l'événement début de
survol aux balises <img> en conant le traitement à la fonction actions(), vous
utilisez l'une de ces instructions :
1 $ ( ' img ') . mouseenter ( actions ) ;
2 $ ( ' img ') . on ( ' mouseenter ' , actions ) ;
Bien entendu, vous devrez dénir la fonction actions() pour indiquer quel traitement
doit être eectué :
1 function actions () {
2 // Ins é rer les instructions de traitement appropri é es
3 }
Par la suite, vous pourrez supprimer cette méthode événementielle sans toucher aux
éventuelles autres qui auraient pu être associées à l'événement mouseenter. Pour cela,
vous utiliserez cette instruction :
1 $ ( ' img ') . off ( ' mouseenter ', actions ) ;
Deuxième parade
Vous pouvez aecter un espace de noms (namespace en anglais) à vos méthodes
événementielles. Ne soyez pas erayés par ce nom. En jQuery, un espace de noms peut
être comparé à une classe CSS. Son but est de donner une étiquette à une ou plusieurs
méthodes événementielles an de faciliter leur manipulation. Une fois vos méthodes
événementielles ainsi étiquetées, vous pourrez facilement les supprimer sans que cela
nuise aux méthodes événementielles qui auraient pu être dénies dans les plugins que
vous utilisez.
Commencez par choisir un espace de noms. Supposons que vous utilisiez jQuery pour
mettre au point un site en rapport avec le dépannage informatique, vous pourriez
utiliser l'espace de noms depanPC pour toutes les méthodes événementielles que
vous dénirez. Cet espace de noms sera alors systématiquement ajouté chaque fois que
vous faites appel à la méthode on(). Par exemple :
1 $ ( ' img ') . on ( ' mouseenter . depanPC ' , function () { // traitement }) ;
2 $ ( ' img ') . on ( ' mouseleave . depanPC ' , function () { // traitement }) ;
3 $ ( ' img ') . on ( ' mousemove . depanPC ', function () { // traitement }) ;
Comme vous le voyez, il sut d'ajouter un point suivi de l'espace de noms à chaque
événement. Lorsque vous voudrez supprimer la méthode événementielle mouseleave()
que vous avez mise en place, vous utiliserez l'instruction suivante :
1 $ ( ' img ') . off ( ' mouseleave . depanPC ') ;
137
CHAPITRE 9. PLUS LOIN DANS LA GESTION ÉVÉNEMENTIELLE
Supposons maintenant que vous désiriez supprimer toutes les méthodes événementielles
rattachées à l'espace de noms depanPC . Pour cela, vous utiliserez l'instruction
suivante :
1 $ ( ' img ') . off ( '. depanPC ') ;
Enn, vous pouvez supprimer les méthodes événementielles liées à plusieurs espaces de
noms en une seule instruction. Par exemple, pour supprimer des espaces de noms de-
panPC et depanMAC de toutes les méthodes événementielles liées à l'événement
click et appliquées aux balises <img>, vous utiliserez l'instruction suivante :
1 $ ( ' img ') . off ( ' click . depanPC . depanMAC ') ;
Pour l'instant, vous ne voyez peut-être pas très bien à quoi les espaces de noms vont vous
servir, mais rassurez-vous, tout deviendra limpide lorsque vous dénirez vos propres
plugins jQuery.
5 < script src = " jquery . js " > </ script >
6 < script >
7 $ ( function () {
8 $ ( ' img ') . one ( ' click ', function () {
138
DÉCLENCHEMENT D'ÉVÉNEMENTS
9 $ ( '# message ') . text ( ' Vous avez cliqu é sur l \ ' image . D é
sormais , je resterai insensible aux clics . ') . fadeIn
(1000) . fadeOut (5000) ;
10 }) ;
11 }) ;
12 </ script >
Le corps du document contient un texte, une image et une balise <span> dans laquelle
sera aché un message suite au premier clic sur l'image. Le code jQuery met en place
une méthode événementielle à usage unique sur l'événement click de la balise <img> :
1 $ ( ' img ') . one ( ' click ' , function () {
Lorsque l'image est cliquée pour la première fois, un texte est aché dans la balise
<span> à l'aide de la méthode text(). Cette méthode est chaînée avec les méthodes
fadeIn() et fadeOut() pour provoquer une apparition du message en une seconde
(fadeIn(1000)) et une disparition du message en cinq secondes (fadeOut(5000)).
Déclenchement d'événements
Généralement, les événements sont déclenchés par l'utilisateur, lorsqu'il clique sur un
objet, utilise la roulette de la souris ou appuie sur une touche du clavier par exemple.
Dans certains cas, il peut être nécessaire de déclencher un événement sans le concours
de l'utilisateur, en utilisant une instruction jQuery. Pour cela, vous ferez appel à la
méthode trigger(), dont voici la syntaxe :
1 $ ( sel ) . trigger ( ' ev ') ;
6 < script src = " jquery . js " > </ script >
7 < script >
8 $ ( function () {
9 $ ( ' img ') . click ( function () {
139
CHAPITRE 9. PLUS LOIN DANS LA GESTION ÉVÉNEMENTIELLE
10 $ ( '# message ') . text ( 'L \' image a é t é cliqu é e . ') . fadeIn
(1000) . fadeOut (1000) ;
11 }) ;
12 $ ( ' button ') . click ( function () {
13 $ ( ' img ') . trigger ( ' click ') ;
14 }) ;
15 }) ;
16 </ script >
L'instruction suivante dénit une méthode événementielle liée au clic sur le bouton :
1 $ ( ' button ') . click ( function () {
Le message L'image a été cliquée est donc aché lorsque vous cliquez sur l'image
ou sur le bouton.
Il pourrait être intéressant d'acher un message si l'image est cliquée et un autre
message si le bouton est cliqué. Voici le code utilisé :
1 Cliquez sur l ' image < br / >
2 < img src = " bon . gif " >< br / >
3 < span id = ' message ' > </ span > < br / >
4 < button > Cliquez ici </ button >
5
6 < script src = " jquery . js " > </ script >
7 < script >
8 $ ( function () {
9 $ ( ' img ') . click ( function ( event , texte ) {
10 if ( texte == undefined )
11 texte = " par vous " ;
12 $ ( '# message ') . text ( 'L \' image a é t é cliqu é e ' + texte ).
fadeIn (1000) . fadeOut (1000) ;
13 }) ;
14 $ ( ' button ') . click ( function () {
15 $ ( ' img ') . trigger ( ' click ', ' par jQuery ') ;
16 }) ;
17 }) ;
18 </ script >
Comme vous pouvez le constater, seul le code jQuery a été modié. Maintenant, la
fonction a deux paramètres :
1 $ ( ' img ') . click ( function ( event , texte ) {
140
CRÉER DES ÉVÉNEMENTS PERSONNALISÉS
Le message aché a une partie xe ( L'image a été cliquée ) et une partie variable
(texte) qui dépend de l'élément cliqué par l'utilisateur. La méthode événementielle
liée au clic sur le bouton simule toujours un clic sur l'image, mais cette fois-ci le texte
par jQuery est passé à la méthode $('img').click() pour modier le texte aché
dans la balise <span>.
1 $ ( ' button ') . click ( function () {
2 $ ( ' img ') . trigger ( ' click ' , ' par jQuery ') ;
3 }) ;
. . . où :
sel est un sélecteur jQuery quelconque ;
ev est l'événement à simuler ;
param1, param2, param3 et les suivants s'ils existent sont les paramètres à passer à
la méthode événementielle déclenchée par la méthode trigger().
La méthode on() peut également être utilisée pour dénir des méthodes événementielles
personnalisées. Ici, nous dénissons l'événement personnalisé bonjour_jquery et nous
l'associons à un élément d'identiant #bonjour :
1 $ ( '# bonjour ') . on ( ' bonjour_jquery ', function () {
2 alert ( ' jQuery vous dit bonjour ! ') ;
3 }) ;
141
CHAPITRE 9. PLUS LOIN DANS LA GESTION ÉVÉNEMENTIELLE
3 < script src = " jquery . js " > </ script >
4 < script >
5 $ ( function () {
6 $ ( '# bonjour ') . on ( ' bonjour_jquery ' , function () {
7 alert ( ' jQuery vous dit bonjour ! ') ;
8 }) ;
9 $ ( '# bonjour ') . click ( function () {
10 $ ( '# bonjour ') . trigger ( ' bonjour_jquery ') ;
11 }) ;
12 }) ;
13 </ script >
Les instructions suivantes dénissent une méthode événementielle pour le clic sur le
bouton d'identiant #bonjour :
1 $ ( '# bonjour ') . click ( function () {
3 < script src = " jquery . js " > </ script >
4 < script >
5 $ ( function () {
6 $ ( '# bonjour ') . on ( ' bonjour_jquery ' , function ( event , param ) {
7 alert ( param + ' , jQuery vous dit bonjour ! ') ;
8 }) ;
9 $ ( '# bonjour ') . click ( function () {
10 $ ( '# bonjour ') . trigger ( ' bonjour_jquery ', ' Michel ') ;
142
DÉLÉGATION D'ÉVÉNEMENTS
11 }) ;
12 }) ;
13 </ script >
Comme vous pouvez le voir, deux paramètres sont passés à la fonction de retour :
1 $ ( '# bonjour ') . on ( ' bonjour_jquery ', function ( event , param ) {
Utilisez le paramètre transmis comme bon vous semble. Ici par exemple, il est intégré
dans le texte aché par la boîte de message :
1 alert ( param + ', jQuery vous dit bonjour ! ') ;
Délégation d'événements
jQuery est fréquemment utilisé pour ajouter des éléments dans une page Web. Si des
événements sont attachés aux éléments de même type déjà existants, vous voudrez
certainement attacher les mêmes événements aux nouveaux éléments. Plutôt que de
143
CHAPITRE 9. PLUS LOIN DANS LA GESTION ÉVÉNEMENTIELLE
dénir une méthode événementielle pour chacun des nouveaux éléments, vous utilise-
rez la délégation d'événements. Pour cela, vous devez utiliser la méthode on() en lui
transmettant trois arguments :
1 $ ( '# del ') . on ( 'ev ' , ' sel ', function () {
2 // Une ou plusieurs instructions
3 }) ;
. . . où :
del est l'élément dont on souhaite cloner le ou les gestionnaires d'événements ;
ev est le nom de l'événement concerné ;
sel est un sélecteur qui agit comme un ltre ;
function() est la fonction à exécuter lorsque l'événement ev est détecté.
Lorsque l'événement ev se produit sur l'élément retourné par le sélecteur $('#del'),
jQuery teste si cet événement correspond à ce qui est spécié dans le deuxième argument
de la méthode on(). Si c'est le cas, la fonction est exécutée.
Voyons comment fonctionne cette méthode en pratique. Dans l'exemple suivant, nous
allons dénir une balise <div>, modier ses caractéristiques à l'aide de quelques ins-
tructions CSS et lui aecter une gestion événementielle sur l'événement click. Lorsque
cet événement surviendra, une balise de même type sera créée à la suite de la balise
cliquée, et la gestion événementielle de la balise cliquée lui sera aectée.
À la gure 9.2, un clic sur l'élément d'origine crée un autre élément ayant la même allure
et le même comportement événementiel (1). Un deuxième clic sur l'élément d'origine
crée un deuxième élément ayant la même allure et le même comportement événementiel
(2). Étant donné que le premier élément créé a le même comportement événementiel
que celui dont il est issu, il est également possible de cliquer sur cet élément pour créer
un clone événementiel (3).
144
DÉLÉGATION D'ÉVÉNEMENTS
5 cursor : pointer ;
6 padding :8 px ;
7 }
8 </ style >
9
14 < script src = " jquery . js " > </ script >
15 < script >
16 $ ( '# master ') . on ( ' click ', ' div ' , function () {
17 $ ( this ) . after ( '<div > Ce & lt ; div & gt ; a les m ê mes caract é
ristiques que son parent </ div > ') ;
18 }) ;
19 </ script >
. . . où :
145
CHAPITRE 9. PLUS LOIN DANS LA GESTION ÉVÉNEMENTIELLE
Figure 9.3 Un clic sur une balise <div> permet d'en créer une nouvelle
146
DÉLÉGATION D'ÉVÉNEMENTS
del est l'élément à partir duquel le ou les gestionnaires d'événements ont été clonés ;
ev est le nom de l'événement concerné ;
sel est un sélecteur qui agit comme un ltre.
Nous allons ajouter un bouton de commande dans le code précédent pour supprimer
la délégation d'événements.
1 < button id = " suppr " > Supprimer la d é l é gation d ' é v é nements </ button
>
1 $ ( '# master ') . on ( ' click ', ' div ' , function () {
2 $ ( this ) . after ( '<div > Ce & lt ; div & gt ; a les m ê mes caract é
ristiques que son parent </ div > ') ;
3 }) ;
4 $ ( '# suppr ') . on ( ' click ' , function () {
5 $ ( '# master ') . off ( ' click ' ,' div ') ;
6 }) ;
En résumé
Certains événements peuvent être déclenchés par une instruction, en utilisant la
méthode trigger() : blur, change, click, dblclick, error, focus, keydown,
keypress, keyup, select et submit. Par contre, les événements suivants ne sont
pas déclenchables : load, mousedown, mouseout, mouseover, mousemove, mouseup,
resize et unload.
Il est possible de dénir des événements personnalisés en jQuery, en utilisant la mé-
thode on(). L'événement ainsi créé peut être déclenché avec la méthode trigger().
La délégation d'événements permet de cloner la gestion événementielle d'un élément
à un ou plusieurs de ses enfants créés à la volée dans le code jQuery. Peu importe le
nombre d'éléments créés : ils se comporteront tous (d'un point de vue événementiel)
comme leur parent. Et ce, sans qu'aucun code supplémentaire ne soit écrit.
147
CHAPITRE 9. PLUS LOIN DANS LA GESTION ÉVÉNEMENTIELLE
148
Chapitre 10
Animations et eets
Diculté :
D ans ce chapitre, je vais vous montrer comment animer vos pages Web. Après cette
lecture, vous saurez comment faire apparaître, faire disparaître et animer des objets,
en utilisant et en combinant les méthodes prédénies dans jQuery.
149
CHAPITRE 10. ANIMATIONS ET EFFETS
Apparition et disparition
Vous avez précédemment fait connaissance avec les méthodes show() et hide(). Dans
les versions élémentaires de ces deux méthodes, vous avez vu que hide() fait disparaître
le ou les objets auxquels elle est appliquée, alors que show() fait apparaître le ou les
objets auxquels elle est appliquée.
Ainsi l'instruction $('div').hide(); cache toutes les balises <div> du document.
Seulement, cette instruction fait apparaître ou disparaître les éléments correspondants
immédiatement, sans aucune animation. . .
11 < script src = " jquery . js " > </ script >
12 < script >
13 $ ( function () {
14 $ ( ' tr : even ') . css ( ' background ' ,' yellow ') ;
15 $ ( ' td ') . css ( ' width ' ,' 200 px ') ;
16 $ ( ' td ') . css ( ' text - align ', ' center ') ;
17 $ ( '# affiche ') . click ( function () {
18 $ ( ' tr : even ') . show ( ' slow ') ;
19 } );
20 $ ( '# cache ') . click ( function () {
21 $ ( ' tr : even ') . hide (1000) ;
22 }) ;
23 }) ;
24 </ script >
150
APPARITION ET DISPARITION
B
Essayer ce code
Code web : 785877
Le corps du document dénit les boutons #affiche et #cache ainsi qu'un tableau
composé de cinq lignes et de trois colonnes. La mise en forme du tableau est eectuée
en jQuery. Dans un premier temps, une couleur d'arrière-plan jaune est aectée aux
lignes paires du tableau, puis la largeur de toutes les cellules du tableau est xée à 200
pixels. Enn, le contenu des cellules est centré.
Lorsque l'utilisateur clique sur le premier bouton, la procédure événementielle associée
($('#affiche').click()) est exécutée. Les lignes paires sont alors achées (si elles
étaient cachées) en utilisant une animation lente :
1 $ ( 'tr : even ') . show ( ' slow ') ;
Si les valeurs prédénies fast et slow ne vous susent pas, vous pouvez les redénir,
voire même en ajouter d'autres. Vous agirez pour cela sur l'objet jQuery.fx.speeds.
Par exemple, l'instruction suivante redénit la valeur slow et lui aecte une durée de
1500 millisecondes :
1 jQuery . fx . speeds . slow = 1500;
L'instruction suivante ajoute la valeur super-slow et lui aecte une durée de 3000
millisecondes :
1 jQuery . fx . speeds [ ' super - slow '] = 3000;
Ces valeurs pourront être utilisées dans les méthodes show() et hide(), mais égale-
ment dans les méthodes fadeIn(), fadeOut(), fadeTo(), slideDown(), slideUp(),
slideToggle() et animate(), qui seront étudiées un peu plus loin dans ce chapitre.
151
CHAPITRE 10. ANIMATIONS ET EFFETS
En faisant appel à des plugins jQuery, vous pouvez utiliser d'autres modèles
de progression. Ne vous inquiétez pas, j'en parle plus loin dans ce cours.
Apparition/disparition en cascade
Il est possible d'utiliser une fonction de rappel dans les méthodes show() et hide().
Cette méthode est appelée lorsque l'achage/la dissimulation est terminé. Par exemple,
cette instruction ache une boîte de dialogue lorsque la dissimulation des images est
terminée :
1 $ ( ' img ') . hide ( ' slow ', function message () {
2 alert ( ' Les images sont maintenant cach é es ') ;
3 }) ;
7 < script src = " jquery . js " > </ script >
8 < script >
9 $ ( function () {
10 $ ( '# affiche ') . click ( function () {
11 $ ( ' img ') . first () . show ( ' slow ', function showNextOne () {
12 $ ( this ) . next ( ' img ') . show ( ' slow ' , showNextOne ) ;
13 }) ;
14 }) ;
15 $ ( '# cache ') . click ( function () {
16 $ ( ' img ') . first () . hide ( ' slow ', function hideNextOne () {
17 $ ( this ) . next ( ' img ') . hide ( ' slow ' , hideNextOne ) ;
18 }) ;
19 }) ;
20 }) ;
21 </ script >
152
FONDU ENCHAÎNÉ
B
Essayer ce code
Code web : 260785
Le corps du document contient deux boutons d'identiants #affiche et #cache et
trois images sans identiant, simplement achées l'une à la suite de l'autre. Lorsque
l'utilisateur clique sur le premier bouton, la méthode événementielle click() asso-
ciée est exécutée. La première image ($('img').first()) est achée (show()). Cet
achage est lent (slow), et la fonction showNextOne() est exécutée à la n de l'anima-
tion. À son tour, la fonction showNextOne() ache lentement (slow) l'image suivante
($(this).next('img')). Cette fonction étant appelée lorsque l'image est entièrement
achée, l'achage se poursuit jusqu'à la dernière image incluse dans le document.
Lorsque l'utilisateur clique sur le deuxième bouton, la méthode événementielle associée
est exécutée. Cette méthode est en tout point similaire à la précédente, si ce n'est que
les images disparaissent une à une en utilisant la méthode hide().
Fondu enchaîné
Les méthodes fadeIn() et fadeOut() sont complémentaires des méthodes hide()
et show(). Elles agissent toutes deux progressivement sur l'opacité d'un élément. La
première ache l'élément et la deuxième fait disparaître l'élément.
Apparition/disparition
Dans leur forme la plus simple, les méthodes fadeIn() et fadeOut() ne demandent
aucun paramètre. Dans ce cas, l'apparition ou la disparition se fait en 400 millisecondes :
1 $ ( ' sel ') . fadeIn () ;
2 $ ( ' sel ') . fadeOut () ;
En passant une valeur numérique à ces méthodes, vous pouvez indiquer le temps de
l'animation en millisecondes. Vous pouvez aussi passer la chaîne fast pour xer la durée
de l'animation à 200 millisecondes, ou la chaîne slow pour la xer à 600 millisecondes :
1 $ ( ' sel ') . fadeIn ( ' fast ') ;
2 $ ( ' sel ') . fadeOut ( ' slow ') ;
Tout comme pour les méthodes show() et hide(), vous pouvez faire appel
à des plugins jQuery pour utiliser d'autres modèles de progression.
153
CHAPITRE 10. ANIMATIONS ET EFFETS
Modication de l'opacité
Pour modier progressivement l'opacité d'un élément sans aller jusqu'à sa disparition
ou sa complète opacité, vous utiliserez la méthode fadeTo(), dont voici la syntaxe :
1 $ ( ' sel ') . fadeTo ( dur ée , opacit é ) ;
. . . où :
sel est un sélecteur jQuery ;
durée est la durée de l'animation. Indiquez un entier qui représente une durée en
millisecondes ou une chaîne (fast, normal ou slow pour xer la durée à 200, 400 ou
600 millisecondes) ;
opacité est un nombre décimal compris entre 0 (transparent) et 1 (opaque).
Si nécessaire, vous pouvez dénir une fonction de rappel, qui sera appelée à la n de
l'animation :
1 $ ( ' sel ') . fadeTo ( dur ée , opacit é , function () {
2 // Une ou plusieurs instructions
3 }) ;
À titre d'exemple, vous utiliserez l'instruction suivante pour faire passer l'opacité d'un
élément d'identiant #semiT de sa valeur actuelle à 0,4 :
1 $ ( '# semiT ') . fadeTo (3000 , 0.4) ;
10 < img src = " zozor5 . jpg " id = " img5 " >
11 < img src = " zozor4 . jpg " id = " img4 " >
12 < img src = " zozor3 . jpg " id = " img3 " >
13 < img src = " zozor2 . jpg " id = " img2 " >
14 < img src = " zozor1 . jpg " id = " img1 " >
15
16 < script src = " jquery . js " > </ script >
17 < script >
18 $ ( function () {
154
ALLER PLUS LOIN
Vous l'aurez compris : la fonction suivante() est appelée jusqu'à la dernière image,
provoquant ainsi un fondu enchaîné sur toutes les images empilées.
Une fois les cinq images dissimulées, plus rien ne se passe. Est-il possible de
boucler sur la première image pour faire un diaporama sans n ?
Eectivement, lorsque toutes les images ont été dissimulées avec la méthode fadeOut(),
la fenêtre reste désespérément vide. J'espère que vous ne m'en voudrez pas trop mais. . .
je vous montrerai comment réaliser des diaporamas un peu plus loin dans ce cours.
Pour l'instant, il est encore trop tôt et j'espère que vous pourrez vous contenter de
cette ébauche de diaporama.
155
CHAPITRE 10. ANIMATIONS ET EFFETS
Mais pourquoi désactiver les animations que nous avons mis du temps à
développer ?
La plupart de vos visiteurs apprécieront vos animations, mais il faut aussi penser à ceux
et celles qu'elles pourraient déranger ! D'autant plus que cette opération est élémentaire
en jQuery : pour désactiver toutes les animations, il vous sut d'aecter la valeur true
à l'objet jQuery.fx.off :
1 jQuery . fx . off = true ;
Et si, par la suite, vous voulez réactiver les animations, vous aecterez la valeur false
à ce même objet. L'activation et la désactivation des animations pourraient être dé-
clenchées suite au clic sur un lien hypertexte que vous placerez dans vos pages. Le plus
simple consiste à créer deux classes :
1 $ ( '. stopAnim ') . click ( function () {
2 jQuery . fx . off = true ;
3 }) ;
4 $ ( '. execAnim ') . click ( function () {
5 jQuery . fx . off = false ;
6 }) ;
156
ALLER PLUS LOIN
en millisecondes. Par exemple, supposons que vous vouliez acher un message avec la
méthode fadeIn(), le laisser aché pendant deux secondes pour qu'il ait le temps
d'être lu, puis l'eacer avec la méthode fadeOut(). Vous pourriez utiliser quelque
chose comme ceci :
1 < style >
2 # message { display : none ; background - color : yellow ; }
3 </ style >
4
5 < span id = " message " > Ce texte sera affich é pendant deux secondes
</ span > < br / > < br />
6 < button id = " afficheMessage " > Afficher le message </ button >
7
8 < script src = " jquery . js " > </ script >
9 < script >
10 $ ( function () {
11 $ ( '# afficheMessage ') . click ( function () {
12 $ ( '# message ') . fadeIn ( ' slow ') . delay (2000) . fadeOut ( ' slow ') ;
13 }) ;
14 }) ;
15 </ script >
Le corps du document ache une balise <span> dans laquelle se trouve le message, et
un bouton pour déclencher l'achage du message. Pour éviter que le message ne soit af-
ché à l'ouverture de la page, une instruction CSS aecte la valeur none à la propriété
display de la balise <span>. Lorsque le bouton est cliqué par l'utilisateur, le texte
contenu dans la balise <span> s'ache progressivement (fadeIn('slow')), reste aché
pendant 2 secondes (delay(2000)), puis disparaît progressivement (fadeOut('slow')).
Première syntaxe
Cette syntaxe est la plus fréquemment utilisée. Elle permet de faire évoluer plusieurs
propriétés de concert. Il est possible de choisir la durée de l'animation, le modèle de
progression de l'animation et, si cela est nécessaire, d'exécuter une fonction lorsque
l'animation est terminée :
1 $ ( ' sel ') . animate ({ prop1 : val1 , prop2 : val2 , prop3 : val3 , etc .
} , dur ée , mod è le , function () {
2 // Une ou plusieurs instructions
3 }) ;
. . . où :
157
CHAPITRE 10. ANIMATIONS ET EFFETS
Deuxième syntaxe
Dans cette syntaxe, le deuxième argument de la méthode animate() est un objet
qui peut contenir une ou plusieurs options identiées par des mots-clés. Elle est utilisée
dans des cas particuliers, comme par exemple l'exécution d'une fonction à chaque étape
de l'animation, la gestion des les d'attente d'animations ou encore l'utilisation de
plusieurs modèles de progression pour faire évoluer les diérentes propriétés CSS :
1 $ ( ' sel ') . animate ({ prop1 : val1 , prop2 : val2 , prop3 : val3 , etc .
} , { options }) ;
. . . où :
sel est un sélecteur jQuery ;
prop1, prop2 et prop3 sont des propriétés CSS et val1, val2 et val3 les valeurs
associées ;
options est un objet qui peut contenir une ou plusieurs des propriétés suivantes :
duration : durée de l'animation (entier en millisecondes ou chaîne fast, normal
ou slow) ;
158
ALLER PLUS LOIN
En résumé
Lorsque les méthodes show(), hide(), fadeIn(), fadeOut(), fadeTo(), slideDown(),
slideUp() et slideToggle() sont utilisées sans argument, leur durée d'exécution
est par défaut égale à 400 millisecondes. Si vous le souhaitez, il est possible de choisir
une autre durée. Vous pouvez utiliser la chaîne fast pour xer la durée à 200 milli-
secondes ou la chaîne slow pour xer la durée à 600 millisecondes. Mais vous pouvez
également passer un nombre entier qui représente une durée en millisecondes.
Deux modèles de progression sont disponibles pour vos animations : linear et swing.
Si vous voulez utiliser d'autres modèles de progression, vous devrez utiliser un ou
plusieurs plugins.
Les méthodes fadeIn(), fadeOut() et fadeTo() permettent d'agir sur l'opacité
des éléments sélectionnés. La première fait apparaître la sélection en augmentant
l'opacité jusqu'à 1.La deuxième fait disparaître la sélection en diminuant l'opacité
jusqu'à 0. La troisième augmente ou diminue l'opacité jusqu'à ce qu'elle atteigne la
valeur spéciée.
Pour replier des éléments vers le haut ou vers le bas, vous pouvez utiliser les méthodes
slideDown(), slideUp() et slideToggle(). Un niveau minimum en anglais vous
laisse supposer que la première méthode déplie la sélection vers le bas et la deuxième
replie la sélection vers le haut. Quant à la troisième, elle agit comme slideDown()
ou comme slideUp() en fonction de l'état (déplié ou replié) de la sélection.
L'objet jQuery.fx.off permet d'activer et de désactiver les animations. Aectez-lui
la valeur true pour désactiver toutes les animations et la valeur false pour autoriser
les animations.
La méthode delay() permet de diérer l'exécution d'une animation. Vous pouvez
l'insérer dans un chaînage d'animations.
Il est possible de dénir des animations en faisant évoluer progressivement une ou
plusieurs propriétés CSS via la méthode animate(). Ces animations sont dites per-
sonnalisées.
159
CHAPITRE 10. ANIMATIONS ET EFFETS
160
Chapitre 11
Files d'attente et timer
Diculté :
C e chapitre poursuit votre formation sur les animations. Vous y découvrirez entre
autres comment enchaîner vos animations, ou au contraire comment les exécuter
simultanément, comment répéter sans n une animation, et comment mettre en place
un timer pour exécuter du code à intervalles réguliers.
161
CHAPITRE 11. FILES D'ATTENTE ET TIMER
Mais, dans ce cas, la vitesse d'exécution de chaque animation est commune. Si vous
voulez exécuter plusieurs animations en même temps, chacune ayant une vitesse d'exé-
cution qui lui est propre, vous devez utiliser une technique particulière, basée sur l'uti-
lisation de la propriété queue dans la deuxième syntaxe de la méthode animate() :
1 $ ( ' sel ') . animate ({ prop1 : val1 , prop2 : val2 , prop3 : val3 , etc .
} , { queue : ...}) ;
Voyons tout cela en raisonnant sur un exemple pratique. Nous allons appliquer deux
animations à une image : la première augmentera progressivement la largeur de la
bordure et la deuxième diminuera progressivement la taille de l'image. Voici le code
utilisé :
1 < button id = " enchainer " > Encha î ner les animations </ button >
2 < button id = " nePasEnchainer " > Ne pas encha î ner les animations </
button > < br / >
3 < button id = " executerEnMemeTemps " > Ex é cuter les animations en m ê
me temps </ button >
4 < button id = " etatInitial " >É tat initial </ button > < br / > < br / >
5 < img src = " logo . png " style = " border : 2 px black solid ; " >
6
7 < script src = " jquery . js " > </ script >
8 < script >
9 $ ( function () {
10 $ ( '# enchainer ') . click ( function () {
11 $ ( ' img ') . animate ({ ' border - width ': ' 100 '} , 1500 )
12 . animate ({ ' width ': ' -=100 '} , 1500) ;
13 }) ;
14 $ ( '# nePasEnchainer ') . click ( function () {
15 $ ( ' img ') . animate ({ ' border - width ': ' 100 '} , { queue : false
, duration : 1500 })
16 . animate ({ ' width ': ' -=100 '} , 1500) ;
17 }) ;
18 $ ( '# executerEnMemeTemps ') . click ( function () {
19 $ ( ' img ') . animate ({ ' border - width ': ' 100 ' , ' width ': ' -=100
' } , 1500) ;
162
LES FILES D'ATTENTE JQUERY
20 }) ;
21 $ ( '# etatInitial ') . click ( function () {
22 $ ( ' img ') . css ({ ' border - width ': '2 px ' , width : ' 200 ' }) ;
23 }) ;
24 }) ;
25 </ script >
B
Essayer ce code
Code web : 128282
Le corps du document dénit quatre boutons ainsi qu'une image dont la bordure est
dénie par un style CSS.
Lorsque le premier bouton est cliqué par l'utilisateur, la bordure de l'image s'agrandit
jusqu'à 100 pixels en 1500 millisecondes :
1 $ ( ' img ') . animate ({ ' border - width ': ' 100 '} , 1500 )
Une fois cette première animation terminée, la largeur de l'image diminue de 100 pixels
en 1500 millisecondes :
1 . animate ({ ' width ': ' -=100 '} , 1500) ;
Achez cette page dans un navigateur et cliquez sur le premier bouton. Comme vous
pouvez le voir, la bordure de l'image est modiée, puis l'image est redimensionnée.
Lorsque le deuxième bouton est cliqué, la bordure de l'image s'agrandit jusqu'à 100
pixels en 1500 millisecondes. Comme la propriété queue est initialisée à false, la
deuxième animation est exécutée en même temps que la première. Étant donné que les
deux animations ont la même durée, elles s'exécuteront exactement en même temps :
1 $ ( ' img ') . animate ({ ' border - width ': ' 100 '} , { queue : false ,
duration : 1500 })
2 . animate ({ ' width ': ' -=100 '} , 1500) ;
Achez cette page dans un navigateur et cliquez sur le deuxième bouton. La modi-
cation de la bordure et le redimensionnement de l'image se font en parallèle.
Lorsque le troisième bouton est cliqué, les deux animations sont exécutées en parallèle :
1 $ ( ' img ') . animate ({ ' border - width ': ' 100 ', ' width ': ' -=100 ' } ,
1500) ;
Achez cette page dans un navigateur et essayez de trouver une diérence entre les
animations associées au deuxième et au troisième bouton. . . Vous avez du mal à les
diérencier ? Cela est tout à fait normal, puisqu'elles produisent le même eet.
Mais alors, pourquoi utiliser le code du deuxième bouton ? Il est bien plus
complexe et il produit le même eet !
Vous avez raison, à un détail près : si les deux traitements produisent le même eet, c'est
parce que les deux animations ont une durée identique. Essayez de modier la valeur
163
CHAPITRE 11. FILES D'ATTENTE ET TIMER
9 < script src = " jquery . js " > </ script >
10 < script >
11 $ ( function () {
12 $ ( '# droite ') . click ( function () {
13 $ ( ' img ') . animate ({ left : ' +=50 '} , 2000) ;
14 }) ;
15 $ ( '# gauche ') . click ( function () {
16 $ ( ' img ') . animate ({ left : ' -=50 '} , 2000) ;
17 }) ;
18 $ ( '# bas ') . click ( function () {
19 $ ( ' img ') . animate ({ top : ' +=50 '} , 2000) ;
164
MANIPULER LA FILE D'ATTENTE
20 }) ;
21 $ ( '# haut ') . click ( function () {
22 $ ( ' img ') . animate ({ top : ' -=50 '} , 2000) ;
23 }) ;
24 $ ( '# etatFile ') . click ( function () {
25 var n = $ ( ' img ') . queue () ;
26 $ ( '# infos ') . text ( ' Nombre d \' animations dans la file d\ '
attente : ' + n . length ) ;
27 }) ;
28 }) ;
29 </ script >
B
Essayer ce code
Code web : 812929
Le document contient cinq boutons, une balise <span> et une image positionnée en
relatif dans la page de façon à pouvoir être déplacée facilement. Très classiques, les
quatre premiers boutons appliquent une animation de 2 secondes à l'image en la dé-
plaçant respectivement vers la droite, vers la gauche, vers le bas et vers le haut. Par
exemple, lorsque le bouton #haut est cliqué, le code suivant s'exécute :
1 $ ( ' img ') . animate ({ top : ' -=50 '} , 2000) ;
Lorsque le cinquième bouton est cliqué, la méthode queue() est appelée an de connaître
le nombre d'animations dans la le d'attente. L'objet retourné par la méthode queue()
est stocké dans la variable n :
1 var n = $ ( ' img ') . queue () ;
165
CHAPITRE 11. FILES D'ATTENTE ET TIMER
1 < button id = " ajouter " > Ajouter animation </ button >
2 < button id = " annuler " > Annuler la file d ' attente </ button > < br / >
3 < button id = " remplacer " > Remplacer la file d ' attente </ button >
4 < button id = " retour " > Ajouter une fonction de retour </ button > < br
/>
5 < img src = " bon . gif " id = " bon " style = " position : relative ; " >
6 < img src = " mauvais . gif " id = " mauvais " style = " position : relative ; "
>
7
8 < script src = " jquery . js " > </ script >
9 < script >
10 $ ( function () {
11 $ ( '# ajouter ') . click ( function () {
12 $ ( '# bon ') . toggle (5000) . queue ( function () {
13 $ ( '# mauvais ') . animate ({ left : ' +=200 '} , ' slow ')
14 . animate ({ top : ' +=200 '} , ' slow ')
15 . animate ({ left : ' -=200 '} , ' slow ')
16 . animate ({ top : ' -=200 '} , ' slow ') ;
17 }) ;
18 }) ;
19 $ ( '# annuler ') . click ( function () {
20 $ ( ' img ') . clearQueue () ;
21 }) ;
22 $ ( '# remplacer ') . click ( function () {
23 $ ( '# mauvais ') . css ( ' left ', 200) . css ( ' top ' , 200) ;
24 $ ( '# mauvais ') . queue ( function () {
25 $ ( this ) . animate ({ top : ' -=200 '} , ' slow ')
26 . animate ({ top : ' +=200 ' , ' left ': ' -=200 '} , ' slow '
)
27 . animate ({ top : ' -=200 '} , ' slow ') ;
28 $ ( this ) . dequeue () ;
29 }) ;
30 }) ;
31 $ ( '# retour ') . click ( function () {
32 $ ( ' img ') . queue ( function () {
166
MANIPULER LA FILE D'ATTENTE
Lorsque le premier bouton (#ajouter) est cliqué, la méthode toggle est appliquée
à l'image d'identiant #bon pour la faire disparaître ou apparaître, selon qu'elle soit
visible ou non :
1 $ ( '# bon ') . toggle (5000)
Lorsque le troisième bouton est cliqué, la méthode css() est invoquée à deux reprises
pour déplacer l'image #mauvais en (200, 200) :
1 $ ( '# mauvais ') . css ( ' left ' , 200) . css ( ' top ', 200) ;
Une animation sur l'image #mauvais est placée dans la le d'attente :
1 $ ( '# mauvais ') . queue ( function () {
2 $ ( this ) . animate ({ top : ' -=200 '} , ' slow ')
3 . animate ({ top : ' +=200 ', ' left ': ' -=200 '} , ' slow ')
4 . animate ({ top : ' -=200 '} , ' slow ') ;
Enn, lorsque le quatrième bouton est cliqué, une fonction de retour est ajoutée à la
le d'attente via la méthode queue(). Cette fonction se contente d'acher une boîte
de message pour indiquer que l'animation est terminée :
167
CHAPITRE 11. FILES D'ATTENTE ET TIMER
14 < script src = " jquery . js " > </ script >
15 < script >
16 $ ( function () {
17 function bis () {
18 $ ( '# balle ') . animate ({ left : ' +=200 '} , ' slow ')
19 . animate ({ top : ' +=200 '} , ' slow ')
20 . animate ({ left : ' -=200 '} , ' slow ')
21 . animate ({ top : ' -=200 '} , ' slow ' , bis ) ;
22 };
23 bis () ;
24 }) ;
25 </ script >
B
Essayer ce code
Code web : 991961
Le corps du document contient une simple balise <div> d'identiant #balle. Cette ba-
lise est mise en forme par quelques instructions CSS. Sont ainsi dénies les dimensions,
168
ARRÊTER ET REPRENDRE UNE ANIMATION
Il ne sut pas de dénir la fonction bis() pour qu'elle soit exécutée. C'est
pourquoi la fonction bis() est appelée une première fois, juste avant la balise
</script>, an d'amorcer l'animation.
. . . où :
sel est un sélecteur jQuery ;
efface est une valeur booléenne qui indique si les animations en attente d'exécution
doivent être (true) ou non (false) supprimées de la le d'attente ;
fin est une valeur booléenne qui indique si l'animation doit prendre son état nal
(true) ou non (false). Si ce paramètre n'est pas spécié, l'animation reste dans
l'état où elle se trouvait au moment de son arrêt.
Dans l'exemple suivant, deux animations sont appliquées à une image : un décalage
vers la droite, puis un décalage vers le bas. À tout moment, l'utilisateur peut arrêter
l'animation en cours en cliquant sur un bouton de commande. Trois types d'arrêt sont
proposés :
Arrêt et positionnement à la n de l'animation en cours ;
Arrêt de l'animation en cours, annulation des animations en attente et déplacement
à la n de l'animation en cours ;
Simple arrêt de l'animation.
Un autre bouton permet de reprendre l'animation comme à l'ouverture de la page.
Voici le code utilisé :
169
CHAPITRE 11. FILES D'ATTENTE ET TIMER
1 < button id = " stopFin " > Stop et fin </ button >
2 < button id = " stopAnnuleFin " > Stop , annule et fin </ button >
3 < button id = " stop " > Stop </ button >
4 < button id = " reprise " > Reprise </ button > < br / > < br / >
5 < img src = " image . png " style = " position : relative ; " >
6
7 < script src = " jquery . js " > </ script >
8 < script >
9 $ ( function () {
10 $ ( ' img ') . animate ({ left : ' +=500 '} , 2000) . animate ({ top : '
+=300 '} , 2000) ;
11 $ ( '# stopFin ') . click ( function () {
12 $ ( ' img ') . stop ( false , true ) ;
13 }) ;
14 $ ( '# stopAnnuleFin ') . click ( function () {
15 $ ( ' img ') . stop ( true , true ) ;
16 }) ;
17 $ ( '# stop ') . click ( function () {
18 $ ( ' img ') . stop ( true , false ) ;
19 }) ;
20 $ ( '# reprise ') . click ( function () {
21 $ ( ' img ') . css ( ' left ' , 0) . css ( ' top ' , 0) ;
22 $ ( ' img ') . animate ({ left : ' +=500 '} , 2000) . animate ({ top : '
+=300 '} , 2000) ;
23 }) ;
24 }) ;
25 </ script >
L'utilisateur peut alors cliquer sur l'un des trois premiers boutons pour arrêter l'ani-
mation. Un clic sur le premier bouton met n à l'animation en cours, ne supprime pas
les animations dans la le d'attente (premier paramètre false) et place l'image dans
sa position nale (deuxième paramètre true) :
1 $ ( '# stopFin ') . click ( function () {
2 $ ( ' img ') . stop ( false , true ) ;
3 }) ;
Un clic sur le deuxième bouton met n à l'animation en cours, supprime les animations
dans la le d'attente (premier paramètre true) et place l'image dans sa position nale
(deuxième paramètre true) :
1 $ ( '# stopAnnuleFin ') . click ( function () {
2 $ ( ' img ') . stop ( true , true ) ;
3 }) ;
170
METTRE EN PLACE UN TIMER
Enn, un clic sur le troisième bouton met n à l'animation en cours, supprime les
animations dans la le d'attente (premier paramètre true) et laisse l'image dans sa
position actuelle (deuxième paramètre false) :
1 $ ( '# stop ') . click ( function () {
2 $ ( ' img ') . stop ( true , false ) ;
3 }) ;
. . . où :
nom est le nom de la fonction qui doit être exécutée périodiquement ;
durée est la période (c'est-à-dire le temps) entre deux exécutions consécutives des
instructions contenues dans la fonction.
3 < script src = " jquery . js " > </ script >
171
CHAPITRE 11. FILES D'ATTENTE ET TIMER
Lorsque le DOM est disponible, la fonction Horloge() est dénie. Après avoir créé l'ob-
jet Date, les heures, minutes et secondes sont récupérées via les fonctions getHours(),
getMinutes() et getSeconds(), et stockées dans la variable h :
1 function Horloge () {
2 var laDate = new Date () ;
3 var h = laDate . getHours () + " : " + laDate . getMinutes () + " : " +
laDate . getSeconds () ;
Le contenu de la balise <span> #heure est alors mis à jour en y achant la valeur qui
vient d'être stockée dans la variable h :
1 $ ( '# heure ') . text ( h ) ;
Pour que la fonction Horloge() s'exécute toutes les secondes, il sut maintenant d'uti-
liser la fonction setInterval() en passant Horloge en premier argument et 1000 en
deuxième argument :
1 setInterval ( Horloge , 1000) ;
172
METTRE EN PLACE UN TIMER
9 position : relative ;
10 }
11 </ style >
12
1 function bis () {
2 $ ( '# balle ') . animate ({ left : ' +=200 '} , ' slow ')
3 . animate ({ top : ' +=200 '} , ' slow ')
4 . animate ({ left : ' -=200 '} , ' slow ')
5 . animate ({ top : ' -=200 '} , ' slow ') ;
6 };
Si vous pensez qu'il n'y a rien de bien nouveau dans ce code, examinez la dernière
méthode animate() : la fonction de rappel a disparu !
Cela est tout à fait normal puisque l'exécution répétée de la fonction bis() ne va pas
se faire par la fonction de rappel de la dernière animation, mais par une instruction
setInterval(). Cette instruction suit la fonction bis(). Elle appelle la fonction bis()
toutes les 2400 millisecondes :
Rééchissez un peu. . . La valeur slow, passée en deuxième argument des quatre mé-
thodes animate, correspond à une durée de 600 millisecondes. Étant donné que l'on
enchaîne quatre animations, vous avez votre réponse.
173
CHAPITRE 11. FILES D'ATTENTE ET TIMER
En résumé
Les animations jQuery sont asynchrones. Si vous lancez plusieurs animations, elles
seront placées dans une le d'attente. La énième animation ne pourra être lancée
que lorsque la précédente sera terminée. . . à moins que vous n'agissiez sur la le
d'attente. Pour cela, vous utiliserez la deuxième syntaxe de la méthode animate()
pour déclencher simultanément plusieurs animations.
Pour connaître le nombre d'animations qui se trouvent dans la le d'attente, utilisez
la méthode queue() sans argument et testez sa propriété length.
Vous pouvez utiliser les méthodes queue(), dequeue() et clearQueue() pour mani-
puler la le d'attente : queue() ajoute une animation dans la le d'attente, dequeue()
joue puis supprime une animation de la le d'attente, clearQueue() vide la le d'at-
tente.
La méthode stop() met n à l'animation en cours. Selon les paramètres qui lui sont
passés, les animations suivantes sont ou ne sont pas eacées de la le d'attente et
l'animation est achée dans son état nal ou s'arrête simplement.
Deux techniques permettent de répéter une série d'animations sans n. Après avoir
inclus les animations dans une fonction, vous pouvez :
Utiliser la fonction de rappel de la dernière animation pour rappeler la fonction ;
Appeler la fonction en mettant en place un timer JavaScript.
174
Chapitre 12
Textes et images
Diculté :
D ans ce chapitre, nous allons voir quelques méthodes spécialisées dans le traitement
des chaînes de caractères et des images. Vous allez apprendre à supprimer des espaces
dans une chaîne, à faire des recherches et des remplacements, mais aussi à créer une
galerie d'images ou un diaporama.
175
CHAPITRE 12. TEXTES ET IMAGES
6 < script src = " jquery . js " > </ script >
7 < script >
8 $ ( function () {
9 $ ( '# action ') . click ( function () {
10 var leTexte = $ ( '# texte ') . val () ;
11 $ ( '# resultat ') . html ( ' Texte original : " ' + leTexte + '" '
+ '<br > Apr è s la fonction trim () : " ' + $ . trim ( leTexte )
+ '" ') ;
12 }) ;
13 }) ;
14 </ script >
176
LES CHAÎNES DE CARACTÈRES
7 < script src = " jquery . js " > </ script >
8 < script >
9 $ ( function () {
10 $ ( '# action ') . click ( function () {
11 var leTexte = $ ( '# texte ') . val () ;
12 var laPosition = $ ( '# position ') . val () ;
13 var leResultat = ' Le caract è re en position ' + laPosition
+ ' est un " ' + leTexte . charAt ( laPosition ) + '" ';
14 $ ( '# resultat ') . text ( leResultat ) ;
15 }) ;
16 }) ;
17 </ script >
177
CHAPITRE 12. TEXTES ET IMAGES
exemple, pour sélectionner toutes les balises <div> qui contiennent le mot rouge ,
vous utiliserez le sélecteur suivant :
1 $ ( ' div : contains (" rouge ") ')
Vous pourriez par exemple modier la couleur d'arrière-plan des <div> qui contiennent
le mot rouge en utilisant cette instruction :
1 $ ( ' div : contains (" rouge ") ') . css ( ' background - color ', ' red ') ;
. . . où sel est un sélecteur jQuery et contenu une chaîne HTML, un élément du DOM
ou un objet jQuery qui remplacera le ou les éléments sélectionnés. Regardez le code
suivant, tout deviendra limpide.
1 < img id = " un " src = " girafe . jpg " ><br >
2 < button id = " changement " > Remplacer l ' image </ button >
3
4 < script src = " jquery . js " > </ script >
5 < script >
6 $ ( function () {
7 $ ( '# changement ') . click ( function () {
8 $ ( '# un ') . replaceWith ( '< img id =" unbis " src =" chat . jpg " > ') ;
9 }) ;
10 }) ;
11 </ script >
178
LES IMAGES
Les images
Ce que nous allons voir ici ne sera pas forcément nouveau pour vous. J'ai voulu faire
un rappel et approfondir certaines techniques déjà vues.
Agrandissement au survol
Cet exemple est un grand classique : une vignette est achée sur la page. Lorsqu'elle est
survolée par la souris, elle est remplacée par une image de plus grande taille. Lorsque
la souris se déplace en dehors de l'image, la vignette est à nouveau achée. Voici le
code utilisé :
1 < img id = " montagne " src = " montagnepetit . jpg " >
2
3 < script type = " text / javascript " src = " jquery . js " > </ script >
4 < script type = " text / javascript " >
5 $ ( function () {
6 $ ( '# montagne ') . mouseover ( function () {
7 $ ( this ) . attr ( ' src ' ,' montagne . jpg ') ;
8 }) ;
9 $ ( '# montagne ') . mouseout ( function () {
10 $ ( this ) . attr ( ' src ' ,' montagnepetit . jpg ') ;
11 }) ;
12 }) ;
13 </ script >
Une vignette (ou une miniature, si vous préférez) est achée sur la page. Lorsque
l'utilisateur la survole avec la souris :
1 $ ( '# montagne ') . mouseover ( function () {
. . . elle est remplacée par une autre image. Cette action est accomplie en agissant sur
la propriété src de la vignette :
1 $ ( this ) . attr ( ' src ' ,' montagne . jpg ') ;
179
CHAPITRE 12. TEXTES ET IMAGES
. . . cette dernière est remplacée par la vignette. Ici encore, le passage de l'image à la
vignette se fait en agissant sur la propriété src de l'image :
1 $ ( this ) . attr ( ' src ', ' montagnepetit . jpg ') ;
12 < img id = " montagnePetit " src = " montagnepetit . jpg " >
13 < img id = " montagneGrand " src = " montagne . jpg " >
14
15 < script type = " text / javascript " src = " jquery . js " > </ script >
16 < script type = " text / javascript " >
17 $ ( function () {
18 $ ( '# montagnePetit ') . mouseover ( function () {
19 $ ( this ) . fadeOut (1000) ;
20 $ ( '# montagneGrand ') . fadeIn (1000) ;
21 }) ;
22 $ ( '# montagneGrand ') . mouseout ( function () {
23 $ ( this ) . fadeOut (1000) ;
24 $ ( '# montagnePetit ') . fadeIn (1000) ;
25 }) ;
26 }) ;
27 </ script >
180
LES IMAGES
Les deux images doivent se trouver au même emplacement pour que le passage de l'une
à l'autre se fasse en douceur. D'autre part, seule la vignette doit être achée. Toutes
ces mises en forme se font en CSS. Les deux images sont positionnées de façon absolue
en haut et à gauche de l'écran, puis l'image est dissimulée an que seule la vignette
soit achée.
Passons maintenant au code jQuery ! Lorsque le pointeur se trouve au-dessus de la
vignette :
1 $ ( '# montagnePetit ') . mouseover ( function () {
Galerie d'images
Vous voulez exposer des photos sur un site Web ? Rien de tel qu'une galerie d'images.
Voici le code utilisé :
1 < style type = " text / css " >
2 img
3 {
4 padding : 5 px ;
5 }
6 </ style >
7
8 < img src = " miniPaysage1 . jpg " id = " paysage1 . jpg " class = ' mini '>
9 < img src = " miniPaysage2 . jpg " id = " paysage2 . jpg " class = ' mini '>
10 < img src = " miniPaysage3 . jpg " id = " paysage3 . jpg " class = ' mini '>
11 < img src = " miniPaysage4 . jpg " id = " paysage4 . jpg " class = ' mini '>
12 < img src = " miniPaysage5 . jpg " id = " paysage5 . jpg " class = ' mini '>
13 <br >
14 < img id = " grand " src = " paysage1 . jpg " >
15
16 < script src = " jquery . js " > </ script >
17 < script >
18 $ ( function () {
19 $ ( '. mini ') . css ( ' border ', '5 px white solid ') ;
20 $ ( ' img : first ') . css ( ' border ', '5 px black solid ') ;
181
CHAPITRE 12. TEXTES ET IMAGES
Pour faire fonctionner ce programme, vous devez disposer de cinq images et des vi-
gnettes associées. Les vignettes sont achées sur une même ligne à l'aide de balises
<img>. Par défaut, la première vignette est sélectionnée et l'image de grande taille est
achée dans la partie inférieure de la page, comme à la gure 12.3.
182
LES IMAGES
Quelle étrange pratique ! Pourquoi acher une bordure blanche pour ensuite
la remplacer par une bordure noire ?
La première instruction ache une bordure blanche autour de tous les éléments de
classe mini. C'est-à-dire autour des cinq vignettes. Cet achage a un seul but : décaler
les vignettes horizontalement de telle sorte qu'elles restent à la même place lorsque
l'utilisateur cliquera par la suite sur l'une d'entre elles. Vous comprenez mieux main-
tenant le pourquoi de cette première instruction. Quant à la deuxième instruction, elle
encadre la première vignette. C'est en eet elle qui est achée par défaut à l'ouverture
de la page.
Lorsqu'une des miniatures est cliquée :
1 $ ( '. mini ') . click ( function () {
. . .il faut eacer le cadre aché autour de la vignette précédemment sélectionnée. Une
instruction se charge d'eacer tous les cadres :
1 $ ( ' img ') . css ( ' border ', '5 px white solid ') ;
L'instruction suivante ache un cadre autour de la vignette qui a été cliquée. Remar-
quez l'utilisation du mot-clé this :
1 $ ( this ) . css ( ' border ' ,'5 px black solid ') ;
Un peu plus haut, vous avez remarqué à quel point l'identiant des vignettes était
étrange. Il est temps de mettre à prot cette étrangeté. L'instruction suivante dénit
la variable nom et y stocke l'attribut de l'image qui a été cliquée :
1 var nom = $ ( this ) . attr ( ' id ') ;
Pour acher cette image, il sut de modier en conséquence l'attribut src de l'image
de grande taille :
1 $ ( '# grand ') . attr ( ' src ' , nom ) ;
Si vous vous sentez l'âme codeuse, n'hésitez pas à améliorer cette galerie en
utilisant les méthodes fadeIn() et fadeOut() pour que les images appa-
raissent en fondu-enchaîné. Une ou deux lignes de jQuery devraient sure !
Diaporama automatique
Dans un chapitre précédent, nous avions travaillé sur un diaporama basique, et je
vous avais dit que nous reviendrions dessus. Il est désormais temps ! Arrivés à ce point
dans la lecture de ce cours, vous en savez assez pour comprendre le code d'un vrai
diaporama.
183
CHAPITRE 12. TEXTES ET IMAGES
11 < img src = " paysage5 . jpg " id = " img5 " >
12 < img src = " paysage4 . jpg " id = " img4 " >
13 < img src = " paysage3 . jpg " id = " img3 " >
14 < img src = " paysage2 . jpg " id = " img2 " >
15 < img src = " paysage1 . jpg " id = " img1 " >
16
17 < script src = " jquery . js " > </ script >
18 < script >
19 $ ( function () {
20 var i =0;
21 affiche () ;
22
23 function affiche () {
24 i ++;
25 if ( i ==1) precedent = '# img5 '
26 else precedent = '# img ' + (i -1) ;
27 var actuel = '# img ' + i ;
28 $ ( precedent ) . fadeOut (2000) ;
29 $ ( actuel ) . fadeIn (2000) ;
30 if ( i ==5) i =0;
31 }
32
184
LES IMAGES
Pourquoi diérencier le cas i=1 des autres cas ? Tout simplement pour que la boucle
puisse boucler ou, en d'autres termes, pour que les images se succèdent de la première
à la cinquième, puis que la boucle soit à nouveau exécutée. La variable actuel est
initialisée avec #img suivi de l'index i. Elle vaudra consécutivement #img1, #img2,
#img3 et #img4 :
1 var actuel = '# img ' + i ;
Maintenant, on sait quelle image doit disparaître (precedent) et quelle image doit
apparaître (actuel). Il ne reste plus qu'à utiliser un fadeOut() et un fadeIn() :
1 $ ( precedent ) . fadeOut (2000) ;
2 $ ( actuel ) . fadeIn (2000) ;
Une dernière chose : pour que les images s'enchaînent automatiquement, il sut d'exé-
cuter la fonction affiche() à intervalles réguliers :
1 setInterval ( affiche , 2000) ;
En résumé
$.trim() supprime les espaces au début et à la n de la chaîne passée en argument.
charAt() retourne le caractère qui se trouve à une position donnée dans une chaîne.
Indiquez le nom de la chaîne suivi d'un point et de la fonction charAt(), et précisez
la position du caractère entre les parenthèses.
Pour sélectionner le ou les éléments qui contiennent un mot ou un texte particulier,
utilisez le pseudo-sélecteur :contains.
Enn, pour remplacer un texte par un autre ou un élément par un autre, utilisez la
méthode replaceWith().
185
CHAPITRE 12. TEXTES ET IMAGES
186
Chapitre 13
Les formulaires et les tableaux
Diculté :
D ans ce chapitre, nous allons nous intéresser aux formulaires et aux tableaux dans
jQuery. Je ne parle pas des tableaux HTML <table></table>, mais des tableaux
JavaScript, dénis par exemple en sérialisant des données ou encore retournés par la
méthode queue().
Vous verrez dans un premier temps comment gérer le focus ou la perte de focus d'un élément
de tableau ou encore comment vider un formulaire. Dans un second temps, vous verrez
diérentes méthodes associées au traitement des données contenues dans des tableaux.
187
CHAPITRE 13. LES FORMULAIRES ET LES TABLEAUX
Les formulaires
Certaines des techniques que nous allons voir sont possibles en HTML5 et
CSS3. Malheureusement, vos visiteurs n'auront pas forcément un navigateur
récent, aussi est-il bien de savoir comment les mettre en place en jQuery.
Pour que le point d'insertion s'ache dans cette zone de texte et que les frappes au
clavier y soient reportées, utilisez cette instruction jQuery :
1 $ ( '# user ') . focus () ;
9 < script src = " jquery . js " > </ script >
10 < script >
11 $ ( function () {
12 var leFocus ;
13 $ ( ' input , textarea ') . focus ( function () {
14 leFocus = $ ( this ) . attr ( 'id ') ;
15 $ ( '# status ') . text ( leFocus + ' a le focus ') ;
16 }) ;
188
LES FORMULAIRES
17 }) ;
18 </ script >
Une fois la variable leFocus dénie, le DOM est parcouru pour trouver quelle balise
<input> ou <textarea> a le focus :
1 $ ( ' input , textarea ') . focus ( function () {
Le nom de la balise qui a le focus est alors récupéré dans la fonction de retour. Le
mot-clé this correspond à l'élément qui a le focus. Ici, nous extrayons son attribut id
avec la méthode attr() :
1 leFocus = $ ( this ) . attr ( ' id ') ;
9 < script src = " jquery . js " > </ script >
10 < script >
11 $ ( function () {
12 var leFocus ;
13 $ ( ' input , textarea ') . focus ( function () {
14 leFocus = '# ' + $ ( this ). attr ( 'id ') ;
15 $ ( leFocus ) . css ( ' background - color ' , '# afc ') ;
16 }) ;
17 $ ( ' input , textarea ') . blur ( function () {
18 leFocus = '# ' + $ ( this ). attr ( 'id ') ;
189
CHAPITRE 13. LES FORMULAIRES ET LES TABLEAUX
La variable leFocus est alors initialisée avec l'identiant de cet élément, précédé du
signe # :
1 leFocus = '# ' + $ ( this ) . attr ( 'id ') ;
Comme dans la requête jQuery précédente, l'identiant de l'élément est mémorisé dans
la variable leFocus :
1 leFocus = '# ' + $ ( this ) . attr ( 'id ') ;
Il sut maintenant d'utiliser cette variable dans un sélecteur pour modier la couleur
d'arrière-plan de l'élément qui a perdu le focus :
1 $ ( leFocus ) . css ( ' background - color ' , '# fff ') ;
Vider un formulaire
Pour annuler les données saisies dans un formulaire, il sut d'utiliser un bouton reset :
1 < input type = " reset " id = " annuler " value =" Annuler " >
Si vous le souhaitez, cette action peut également être accomplie en jQuery. Mettez en
place un bouton de remise à zéro du formulaire :
1 < button id = " raz " > RAZ du formulaire </ button >
190
LES TABLEAUX
Un sélecteur jQuery sélectionne toutes les balises <input> du document, en dehors des
éléments button, submit, reset et hidden :
1 $ ( ': input ')
2 . not ( ': button , : submit , : reset , : hidden ')
Validation de formulaires
Vous voulez valider les données saisies par l'utilisateur dans un de vos formulaires ? En
testant par exemple que l'adresse e-mail entrée est bien formée, ou encore que la date
d'anniversaire est bien une date ? Le plus simple consiste à utiliser un plugin. Arrivés
à ce point dans le cours, vous ne savez pas encore comment utiliser des plugins dans
jQuery, mais gurez-vous que c'est justement le sujet d'une prochaine partie. Si vous
n'avez pas la patience d'attendre jusque-là, reportez-vous au premier chapitre de la
partie consacrée aux plugins.
Les tableaux
La fonction grep()
Cette fonction trouve les éléments du tableau qui satisfont un ou plusieurs critères.
Voici sa syntaxe :
191
CHAPITRE 13. LES FORMULAIRES ET LES TABLEAUX
. . . où :
tableau est le tableau qui contient les données à ltrer ;
élément et index sont les éléments et l'index des éléments du tableau ;
inv indique si le critère doit (true) ou ne doit pas (false ou n'est pas spécié) être
inversé.
Un peu de pratique serait vraiment bienvenue. Voici donc quelques lignes de code. Deux
balises <span> seront utilisées pour acher les résultats et trois boutons de commande
pour ltrer le tableau de départ selon diérents critères :
1 < span id = " un " > </ span >< br / > < br / >
2 < span id = " deux " > </ span > < br / > < br / >
3 < button id = " filtre1 " > Apr è s le cinqui è me </ button >
4 < button id = " filtre2 " > Diff é rent de Mathis , Hugo et Yanis </ button
>
5 < button id = " filtre3 " > Avant le cinqui è me </ button >
6
7 < script src = " jquery . js " > </ script >
8 < script >
9 $ ( function () {
10 var tableau = [ ' Luca ' , ' Emma ' , ' Mathis ' , ' Jade ', 'L é a ' , '
Enzo ', ' Chlo é ', ' Nathan ', ' Manon ' , ' Noah ' , ' Sarah ' , '
Louis ' , ' Luna ', ' Kylian ', ' Clara ' , ' Ethan ', ' Camille ' , '
Hugo ', ' Lylou ', ' Th é o ', ' Zo é ' , ' Yanis ', ' Ma é lys '];
11 var tableau2 ;
12 $ ( '# un ') . text ( ' Donn é es originales : ' + tableau . join ( ' , ') )
;
13 $ ( '# filtre1 ') . click ( function () {
14 tableau2 = $. grep ( tableau , function ( el , ind ) {
15 return ( ind > 4) ;
16 }) ;
17 $ ( '# deux ') . text ( ' Apr è s le cinqui è me : ' + tableau2 . join ( '
, ') ) ;
18 }) ;
19 $ ( '# filtre2 ') . click ( function () {
20 tableau2 = $. grep ( tableau , function ( el , ind ) {
21 return ( el != ' Mathis ' && el != ' Hugo ' && el != ' Yanis ')
;
22 }) ;
23 $ ( '# deux ') . text ( ' Diff é rent de Mathis , Hugo et Yanis : ' +
tableau2 . join ( ', ') ) ;
24 }) ;
25 $ ( '# filtre3 ') . click ( function () {
26 tableau2 = $. grep ( tableau , function ( el , ind ) {
27 return ( ind > 4) ;
28 } , true ) ;
192
LES TABLEAUX
29 $ ( '# deux ') . text ( ' Avant le cinqui è me : ' + tableau2 . join ( '
, ') ) ;
30 }) ;
31 }) ;
32 </ script >
B
Essayer ce code
Code web : 891723
Le code jQuery commence par dénir le tableau et y stocker quelques prénoms, puis
dénit le tableau dans lequel seront stockés les résultats :
1 $ ( function () {
2 var tableau = [ ' Luca ', ' ... ' 'Ma é lys ' ];
3 var tableau2 ;
L'instruction suivante lit les données stockées dans le tableau et les copie dans la
première balise <span> en les séparant par une virgule et une espace :
1 $ ( '# un ') . text ( ' Donn é es originales : ' + tableau . join ( ', ') ) ;
Le tableau mis à jour par la fonction grep() est alors aché dans la deuxième balise
<span> :
1 $ ( '# deux ') . text ( ' Apr è s le cinqui è me : ' + tableau2 . join ( ' , ') ) ;
Lorsque le deuxième bouton est cliqué, la fonction grep() est appliquée au tableau.
Seuls les éléments diérents de Mathis , Hugo et Yanis sont conservés :
1 tableau2 = $ . grep ( tableau , function ( el , ind ) {
2 return ( el != ' Mathis ' && el != ' Hugo ' && el != ' Yanis ') ;
3 }) ;
193
CHAPITRE 13. LES FORMULAIRES ET LES TABLEAUX
La fonction map()
Cette fonction recopie en partie ou en totalité un tableau en lui appliquant un traite-
ment. Voici sa syntaxe :
1 tableau2 = $ . map ( tableau , function ( el , ind ) { ... }) ;
. . . où :
tableau est le tableau qui contient les données à recopier ;
élément et index sont les éléments et l'index des éléments du tableau ;
tableau2 est le tableau dans lequel sont stockés les résultats de la fonction map().
An que ce soit plus clair, nous allons travailler sur un exemple concret. Deux balises
<span> sont utilisées pour acher les résultats et deux boutons de commande pour
recopier le tableau de départ en lui appliquant deux traitements diérents :
1 < span id = " un " > </ span >< br / > < br / >
2 < span id = " deux " > </ span > < br / > < br / >
3 < button id = " copie1 " > Pr é noms en majuscules </ button >
4 < button id = " copie2 " > Index et pr é noms en minuscules </ button >
5
6 < script src = " jquery . js " > </ script >
7 < script >
8 $ ( function () {
9 var tableau = [ ' Luca ' , ' Emma ' , ' Mathis ', ' Jade ', 'L é a ' ,
' Enzo ' , ' Chlo é '];
10 var tableau2 ;
11 $ ( '# un ') . text ( ' Donn é es originales : ' + tableau . join ( ' ,
') ) ;
12 $ ( '# copie1 ') . click ( function () {
13 tableau2 = $. map ( tableau , function ( el , ind ) {
14 return ( el . toUpperCase () ) ;
15 }) ;
16 $ ( '# deux ') . text ( ' Pr é noms en majuscules : ' + tableau2
. join ( ' , ') ) ;
17 }) ;
18 $ ( '# copie2 ') . click ( function () {
19 tableau2 = $. map ( tableau , function ( el , ind ) {
20 return ( ind + ' : ' + el . toLowerCase () ) ;
21 }) ;
22 $ ( '# deux ') . text ( ' Index et pr é noms en minuscules : ' +
tableau2 . join ( ', ') ) ;
23 }) ;
24 }) ;
25 </ script >
B
Essayer ce code
Code web : 963330
194
LES TABLEAUX
Lorsque le premier bouton est cliqué, la fonction map() est appliquée au tableau. Les
prénoms sont retournés en caractères majuscules et stockés dans tableau2 :
1 tableau2 = $ . map ( tableau , function ( el , ind ) {
2 return ( el . toUpperCase () ) ;
Lorsque le deuxième bouton est cliqué, la fonction map() est appliquée au tableau.
Chacun des éléments du tableau est transformé en une chaîne contenant l'index du
tableau suivi du séparateur : et du prénom converti en caractères minuscules :
1 tableau2 = $ . map ( tableau , function ( el , ind ) {
2 return ( ind + ' : ' + el . toLowerCase () ) ;
La fonction inArray()
Vous recherchez un élément dans un tableau ? La fonction inArray() est là pour vous.
Voici sa syntaxe :
1 var position = $ . inArray ( ' valeur ' , tableau , index )
. . . où :
valeur est la valeur recherchée ;
tableau est le tableau dans lequel doit se faire la recherche ;
index, s'il est précisé, est le numéro de la cellule à partir de laquelle doit commencer
la recherche (attention, la première cellule a pour index 0) ;
position est la première position de la valeur dans le tableau. Si la recherche est
infructueuse, inArray() retourne -1.
Supposons que la variable tableau soit dénie comme suit :
1 var tableau = [ ' Luca ', ' Emma ' , ' Mathis ' , ' Jade ' , 'L é a ', ' Enzo ',
' Chlo é '];
195
CHAPITRE 13. LES FORMULAIRES ET LES TABLEAUX
La fonction merge()
Il est parfois nécessaire de regrouper les informations qui se trouvent dans deux ta-
bleaux. La fonction merge() est là pour vous faciliter la tâche. Voici sa syntaxe :
1 $ . merge ( tableau1 , tableau2 ) ;
Figure 13.1 Le premier tableau contient ses propres données et celles du deuxième
tableau
En résumé
Pour donner le focus à un élément d'un formulaire, vous utiliserez l'instruction
$('élément').focus();.
Pour savoir quel élément a le focus dans un formulaire, commencez par parcourir le
DOM avec l'instruction $('input, textarea').focus( function() { ... });.
Utilisez ensuite l'instruction var idFocus = $(this).attr('id'); pour récupérer
l'identiant de l'élément qui a le focus.
196
LES TABLEAUX
Pour vider le contenu d'un formulaire, vous devez lui appliquer les méthodes val(),
removeAttr('checked') et removeAttr('selected'). Si la page ne contient qu'un
formulaire, vous pouvez la rafraîchir avec l'instruction location.reload();.
La fonction $.grep() sélectionne certains éléments dans un tableau et les copie dans
un autre tableau.
La fonction $.map() recopie les éléments d'un tableau dans un autre tableau en leur
appliquant un traitement.
La fonction $.inArray() recherche si un élément particulier est présent dans un
tableau.
La fonction $.merge() regroupe les informations qui se trouvent dans deux tableaux.
197
CHAPITRE 13. LES FORMULAIRES ET LES TABLEAUX
198
Chapitre 14
TP : Mise en forme d'une page Web
Diculté :
A vec ce TP, je vous propose de réviser les techniques de sélection et de mise en forme
étudiées dans cette partie mais également dans les parties précédentes. Il s'agit d'une
révision générale, en somme. Le but sera de modier une page Web via un formulaire.
199
CHAPITRE 14. TP : MISE EN FORME D'UNE PAGE WEB
Figure 14.1 Cette page n'attend plus que votre code jQuery
La page est composée de deux balises <div>. La première contient des informations
textuelles et une image. La deuxième contient un formulaire composé de plusieurs listes
déroulantes, d'une zone de texte et de deux boutons de commande. Lorsque l'utilisateur
agira sur les contrôles du formulaire, le contenu de la première balise <div> devra être
mis à jour en conséquence.
Rassurez-vous, je vous fais grâce du code HTML/CSS. Ce que je vous demande ici, c'est
de donner vie aux éléments du formulaire en eectuant les actions nécessaires en jQuery
lorsque l'utilisateur sélectionne une valeur dans une liste déroulante ou clique sur un
bouton. Le tableau suivant résume la fonction des diérents contrôles du formulaire.
Voici le code HTML/CSS sur lequel vous allez travailler :
1 <! DOCTYPE html >
2 < html >
3 < head >
4 < meta charset = " UTF -8 " >
5 < title > Mise en forme </ title >
6 < style type = " text / css " >
7 # contenu
8 {
200
INSTRUCTIONS POUR RÉALISER LE TP
9 width : 500 px ;
10 height : 450 px ;
11 border : 1 px black solid ;
12 float : left ;
13 margin - right : 10 px ;
14 overflow - y : auto ;
15 }
16 # controles
17 {
18 width : 300 px ;
19 height : 450 px ;
20 border : 1 px black solid ;
21 float : left ;
22 }
23 # controles div {
24 margin - bottom : 10 px ;
25 padding : 5 px ;
26 }
27 label {
28 float : left ;
29 width : 140 px ;
30 }
31 # image
32 {
33 width : 110 px ;
34 height : 110 px ;
35 margin - left : 100 px ;
36 }
37 p
38 {
201
CHAPITRE 14. TP : MISE EN FORME D'UNE PAGE WEB
39 padding - left : 5 px ;
40 padding - right : 5 px ;
41 font - family : ' Times New Roman ';
42 }
43 </ style >
44 </ head >
45 < body >
46 < div id = " contenu " >
47 <p > At vero eos et accusamus et iusto odio dignissimos
ducimus qui blanditiis praesentium voluptatum deleniti
atque corrupti quos dolores et quas molestias
excepturi sint occaecati cupiditate non provident ,
similique sunt in culpa qui officia deserunt mollitia
animi , id est laborum et dolorum fuga . </p >
48 < div id = " image " >< img src = " zozor . png " > </ div >
49 <p > Et harum quidem rerum facilis est et expedita
distinctio . Nam libero tempore , cum soluta nobis est
eligendi optio cumque nihil impedit quo minus id quod
maxime placeat facere possimus , omnis voluptas
assumenda est , omnis dolor repellendus . Temporibus
autem quibusdam et aut officiis debitis aut rerum
necessitatibus saepe eveniet ut et voluptates
repudiandae sint et molestiae non recusandae . </p >
50 <p > Itaque earum rerum hic tenetur a sapiente delectus , ut
aut reiciendis voluptatibus maiores alias consequatur
aut perferendis doloribus asperiores repellat . </p >
51 </ div >
52 < div id = " controles " >
53 <div >
54 < label for = " couleur - fond " > Couleur de fond </ label >
55 < select id = " couleur - fond " >
56 < option value = " # FFFFFF " > Blanc </ option >
57 < option value = " #9 FFEF1 " > Bleu </ option >
58 < option value = " #9 FFECE " > Vert </ option >
59 < option value = " # FAFE9F " > Jaune </ option >
60 </ select >
61 </ div >
62
63 <div >
64 < label for = " texte " > Texte </ label >
65 < select id = " texte " >
66 < option value = " Normal " > Normal </ option >
67 < option value = " Gras " > Gras </ option >
68 < option value = " Italique " > Italique </ option >
69 < option value = " Souligne " > Soulign é </ option >
70 </ select >
71 </ div >
72
73 <div >
74 < label for = " police " > Police </ label >
202
INSTRUCTIONS POUR RÉALISER LE TP
82 <div >
83 < label for = " police - prem - phrase " > Police 1 e phrase </ label
>
84 < select id = " police - prem - phrase " >
85 < option value = " Times New Roman " > Times New Roman </
option >
86 < option value = " Courier New " > Courier New </ option >
87 < option value = " Arial " > Arial </ option >
88 </ select >
89 </ div >
90
91 <div >
92 < label for = " prem - car - phrases " > Prem caract phrases </
label >
93 < select id = " prem - car - phrases " >
94 < option value = " Normal " > Normal </ option >
95 < option value = " Gras " > Gras </ option >
96 </ select >
97 </ div >
98
99 <div >
100 < label for = " mot " > Mot en rouge </ label >
101 < input type = " text " id = " mot " size = " 2 " >
102 < button id = " couleurMot " >OK </ button >
103 </ div >
104
119 < script src = " jquery . js " > </ script >
120 < script >
203
CHAPITRE 14. TP : MISE EN FORME D'UNE PAGE WEB
Correction
J'espère que tout s'est bien passé et que vous n'avez pas rencontré de diculté majeure
dans ce TP. Comme toujours, je vous propose une solution. Il se peut que vous soyez
partis dans une autre direction et que vos codes fonctionnent à la perfection. Dans ce
cas, considérez ce que je propose comme une solution alternative.
Pour faciliter la lecture de la correction, je l'ai scindée en autant de sous-sections que
de contrôles dans le formulaire. Vous pouvez tout lire ou vous reporter à la sous-section
qui correspond à un traitement qui vous en a particulièrement fait baver.
Couleur de fond
Cette fonctionnalité ne devrait pas vous avoir posé de problème. Voici le code que j'ai
utilisé :
1 $ ( '# couleur - fond ') . change ( function () {
2 var cf = $ ( '# couleur - fond option : selected ') . val () ;
3 $ ( '# contenu ') . css ( ' background - color ', cf ) ;
4 }) ;
204
CORRECTION
Cette instruction est essentielle. Elle sera utilisée tout au long de cette correction. Le
sélecteur est particulièrement remarquable à mon avis. Jugez un peu : #couleur-fond
option:selected signie l'élément d'identiant #couleur-fond dont la balise enfant
<option> est sélectionnée . Ce simple sélecteur fait référence à la balise <option>
choisie par l'utilisateur dans la liste déroulante. Pour connaître la valeur aectée à son
attribut value, il sut d'appliquer la méthode val() à ce sélecteur !
La valeur retournée est une couleur directement exploitable. Il sut donc de l'aecter
à la propriété background-color de la première balise <div> pour modier la couleur
de l'arrière-plan :
1 $ ( '# contenu ') . css ( ' background - color ', cf ) ;
Texte
L'aectation des attributs gras, italique et souligné au texte contenu dans la première
balise <div> n'est guère plus compliquée. Il vous sut de savoir quelles propriétés CSS
utiliser :
font-weight pour le gras ;
font-style pour l'italique ;
text-decoration pour le soulignement.
Voici le code utilisé :
1 $ ( '# texte ') . change ( function () {
2 var te = $ ( '# texte option : selected ') . val () ;
3 if ( te == ' Gras ') $ ( '# contenu p ') . css ( ' font - weight ' , ' bold ') ;
4 if ( te == ' Italique ') $ ( '# contenu p ') . css ( ' font - style ', '
italic ') ;
5 if ( te == ' Souligne ') $ ( '# contenu p ') . css ( ' text - decoration ' ,
' underline ') ;
6 if ( te == ' Normal ') {
7 $ ( '# contenu p ') . css ( 'font - weight ', ' normal ') ;
8 $ ( '# contenu p ') . css ( 'font - style ' , ' normal ') ;
9 $ ( '# contenu p ') . css ( 'text - decoration ' , ' none ') ;
10 }
11 }) ;
205
CHAPITRE 14. TP : MISE EN FORME D'UNE PAGE WEB
Enn, si l'entrée Normal a été sélectionnée, il faut réinitialiser les propriétés font-weight,
font-style et text-decoration :
1 if ( te == ' Normal ') {
2 $ ( '# contenu p ') . css ( ' font - weight ' , ' normal ') ;
3 $ ( '# contenu p ') . css ( ' font - style ', ' normal ') ;
4 $ ( '# contenu p ') . css ( ' text - decoration ' , ' none ') ;
5 }
Police
Si vous avez passé avec succès les deux étapes précédentes, la modication de la police
utilisée dans la première balise <div> sera un vrai jeu d'enfant. Un simple coup d'÷il au
code HTML permet de constater que l'attribut value des diérents <select> contient
le nom de la police à utiliser :
1 < select id = " police " >
2 < option value = " Times New Roman " > Times New Roman </ option >
3 < option value = " Courier New " > Courier New </ option >
4 < option value = " Arial " > Arial </ option >
5 </ select >
206
CORRECTION
Pour modier la police utilisée dans les paragraphes de la première balise <div>, il
sut d'aecter cette valeur à la propriété CSS font-family de toutes les balises <p> :
1 $ ( '# contenu p ') . css ( 'font - family ', ff ) ;
207
CHAPITRE 14. TP : MISE EN FORME D'UNE PAGE WEB
24 }) ;
Ne soyez pas impressionnés par le nombre d'instructions : je vais tout vous expliquer !
Lorsque l'utilisateur sélectionne une valeur dans la liste déroulante #prem-car-phrases :
1 $ ( '# prem - car - phrases ') . change ( function () {
208
CORRECTION
Dans le cas contraire, la fonction map() est appliquée au tableau pour mettre en gras
le premier caractère de chaque phrase. Le résultat de la fonction map() est stocké dans
la variable tableau2 :
1 else {
2 var tableau2 = $ . map ( tableau , function ( el , ind ) {
Si la valeur examinée n'est pas nulle, il s'agit d'une phrase qui doit être traitée. Dans
ce cas, le premier caractère est entouré des balises <b> et </b> et du reste de la phrase
diminué du premier caractère. Enn, un point et une espace sont ajoutés à la n de la
phrase, puisqu'ils avaient été supprimés par la méthode split() à l'étape précédente :
1 if ( el [0] != null ) return '<b > ' + ( el [0]) + ' </b > ' + el .
substring (1) + '. ';
Les éléments contenus dans tableau2 sont alors rassemblés et la chaîne HTML obtenue
remplace le paragraphe qui était sélectionné :
1 $ ( this ) . html ( tableau2 . join ( ' ') ) ;
Vous êtes toujours là ? Je l'espère, car seule la moitié du traitement a été eectuée.
Il faut encore écrire quelques lignes de code pour réagir à la sélection de la valeur
Normal dans la liste déroulante #prem-car-phrases. Je vous rassure tout de suite :
le code à écrire est bien plus simple à comprendre que celui qui vient d'être écrit.
Lorsque la valeur Normal est sélectionnée dans la liste déroulante :
1 if ( pcp == ' Normal ') {
Dans un premier temps, le code HTML du paragraphe est mémorisé dans la variable
unPar :
1 var unPar = $ ( this ) . html () ;
. . . cela signie qu'il contient du texte dans lequel le premier caractère de chaque
phrase a pu être mis en gras par l'utilisateur. Un traitement particulier doit donc
lui être appliqué. Nous allons utiliser une astuce de programmation : en aectant au
paragraphe sa version texte (et non HTML), toutes les balises HTML qu'il pourrait
contenir sont supprimées :
1 $ ( this ) . text ( $ ( this ) . text () ) ;
209
CHAPITRE 14. TP : MISE EN FORME D'UNE PAGE WEB
Mot en rouge
Il se peut que cette mise en forme vous ait également posé quelques problèmes. Cepen-
dant, si vous avez suivi ce que je viens de dire, tout vous semblera bien plus simple.
Je vous mets sur la voie : pour séparer les mots du premier paragraphe, la fonction
split() semble tout indiquée. . .
Voici le code que j'ai utilisé :
1 $ ( '# couleurMot ') . click ( function () {
2 var mot = $ ( '# mot ') . val () ;
3 var tableau = $ ( 'p : first ') . text () . split ( ' ') ;
4 var tableau2 = $ . map ( tableau , function ( el , ind ) {
5 if ( ind +1 == mot ) return ( ' < font color =" red " > ' + el + ' </
font > ')
6 else return ( el ) ;
7 }) ;
8 $ ( 'p : first ') . html ( tableau2 . join ( ' ') ) ;
9 }) ;
. . . le nombre tapé dans la zone de texte #mot est mémorisé dans la variable mot :
1 var mot = $ ( '# mot ') . val () ;
Les mots sont séparés entre eux par des espaces. C'est donc une espace que nous
utiliserons comme séparateur dans la fonction split(). Le résultat de la séparation
est stocké dans la variable tableau :
1 var tableau = $ ( 'p : first ') . text () . split ( ' ') ;
Il ne reste plus qu'à appliquer un traitement spécial au mot désigné par l'utilisateur en
utilisant la méthode map(). Le résultat est stocké dans la variable tableau2 :
1 var tableau2 = $ . map ( tableau , function ( el , ind ) {
Lorsque l'index de l'élément est égal à la valeur entrée dans la zone de texte #mot (à
un près puisque le décompte se fait à partir de 0), le mot est entouré par une balise
<font> dans laquelle l'attribut color est initialisé à red :
1 if ( ind +1 == mot ) return ( ' < font color =" red " > ' + el + ' </ font > '
)
S'il s'agit d'un autre mot, aucun traitement ne lui est appliqué :
1 else return ( el ) ;
Enn, le premier paragraphe est remplacé par le contenu de la variable tableau2, après
avoir assemblé ses éléments via la fonction join() :
1 $ ( 'p : first ') . html ( tableau2 . join ( ' ') ) ;
210
CORRECTION
Si la valeur Rien a été sélectionnée, une bordure blanche épaisse de 2 pixels est
achée autour de l'image. Si elle existait, la bordure précédente est eacée, car la
bordure blanche s'ache sur un arrière-plan de couleur blanche :
1 if ( bi == ' Rien ') $ ( ' img ') . css ( ' border ', '2 px solid white ') ;
211
CHAPITRE 14. TP : MISE EN FORME D'UNE PAGE WEB
1 $ ( function () {
2 // Couleur de fond
3 $ ( '# couleur - fond ') . change ( function () {
4 var cf = $ ( '# couleur - fond option : selected ') . val () ;
5 $ ( '# contenu ') . css ( ' background - color ', cf ) ;
6 }) ;
7
8 // Texte
9 $ ( '# texte ') . change ( function () {
10 var te = $ ( '# texte option : selected ') . val () ;
11 if ( te == ' Normal ') {
12 $ ( '# contenu p ') . css ( ' font - weight ' , ' normal ') ;
13 $ ( '# contenu p ') . css ( ' font - style ', ' normal ') ;
14 $ ( '# contenu p ') . css ( ' text - decoration ' , ' none ') ;
15 }
16 if ( te == ' Gras ') $ ( '# contenu p ') . css ( ' font - weight ', ' bold '
);
17 if ( te == ' Italique ') $ ( '# contenu p ') . css ( ' font - style ' , '
italic ') ;
18 if ( te == ' Souligne ') $ ( '# contenu p ') . css ( ' text - decoration '
, ' underline ') ;
19 }) ;
20
21 // Police
22 $ ( '# police ') . change ( function () {
23 var ff = '" ' + $ ( '# police option : selected ') . val () + '" ';
24 $ ( '# contenu p ') . css ( ' font - family ' , ff ) ;
25 }) ;
26
27 // Police 1 e phrase
28 $ ( '# police - prem - phrase ') . change ( function () {
29 var ppp = $ ( '# police - prem - phrase option : selected ') . val () ;
30 $ ( '# contenu p : first ') . css ( ' font - family ' , ppp ) ;
31 }) ;
32
212
CORRECTION
48 if ( tableau . length == 1) {}
49 else {
50 var tableau2 = $ . map ( tableau , function ( el , ind ) {
51 if ( el [0] != null ) return ' <b > ' + ( el [0]) + ' </b > '
+ el . substring (1) + '. ';
52 }) ;
53 $ ( this ) . html ( tableau2 . join ( ' ') ) ;
54 }
55 }) ;
56 }
57 }) ;
58
59 // Mot en rouge
60 $ ( '# couleurMot ') . click ( function () {
61 var mot = $ ( '# mot ') . val () ;
62 var tableau = $ ( 'p : first ') . text () . split ( ' ') ;
63 var tableau2 = $ . map ( tableau , function ( el , ind ) {
64 if ( ind +1 == mot ) return ( '< font color =" red " > ' + el + ' </
font > ')
65 else return ( el ) ;
66 }) ;
67 $ ( 'p : first ') . html ( tableau2 . join ( ' ') ) ;
68 }) ;
69
78 // RAZ du formulaire
79 $ ( '# raz ') . click ( function () {
80 location . reload () ;
81 }) ;
82 }) ;
B
Essayer ce code
Code web : 497657
213
CHAPITRE 14. TP : MISE EN FORME D'UNE PAGE WEB
214
Chapitre 15
Un jeu en jQuery
Diculté :
215
CHAPITRE 15. UN JEU EN JQUERY
Le document de base
Avant d'aller plus loin, je vais vous montrer à quoi va ressembler le jeu. Regardez la
gure 15.1 pour en avoir un petit aperçu.
216
LE DOCUMENT DE BASE
3 < img id = " fond1 " class = " fond " src = " route . png " >
4 < img id = " fond2 " class = " fond " src = " route . png " >
5 < img id = " vj " src = " vj . png " > <! - - La voiture jaune -->
6 < img id = " vr " src = " vr . png " > <! - - La voiture rouge -->
7 </ div >
Ces éléments sont mis en forme à l'aide de quelques instructions CSS. L'aire de jeu #jeu
est dimensionnée à 400 × 400 pixels. Elle est entourée d'une bordure noire continue
épaisse de 2 pixels. Étant donné que deux images vont être achées l'une en dessous
de l'autre, sa propriété overflow est initialisée à hidden pour dissimuler les barres de
délement. Le positionnement à l'intérieur de l'aire de jeu se fait de façon relative.
1 # jeu {
2 width : 400 px ;
3 height : 400 px ;
4 border : 2 px black solid ;
5 overflow : hidden ;
6 position : relative ;
7 }
Les images qui représentent la route sont positionnées de façon relative et leur z-index
est initialisé à 10. Quant aux images des voitures, elles sont positionnées de façon
absolue et leur z-index est initialisé avec d'autres valeurs. Vous comprendrez pourquoi
en lisant la suite.
1 . fond {
2 margin - bottom : -5 px ;
3 z - index : 10;
4 position : relative ;
5 }
6 # vj {
7 z - index : 100;
8 position : absolute ;
217
CHAPITRE 15. UN JEU EN JQUERY
9 top : 10 px ;
10 left : 48 px ;
11 }
12 # vr {
13 z - index : 80;
14 position : absolute ;
15 top : -200 px ;
16 left : 0 px ;
17 }
Dans les chapitres précédents, nous avons déjà croisé la propriété CSS z-index. Je vais
quand même rappeler que cette propriété permet d'empiler plusieurs éléments les uns
sur les autres. L'élément qui est le plus en avant-plan est celui qui a un z-index le plus
élevé. Inversement, l'élément qui est le plus en arrière-plan est celui qui a un z-index
le plus faible, comme le montre la gure 15.3.
Dans le code sur lequel nous sommes en train de travailler, la route a un z-index égal
à 10, la voiture rouge un z-index égal à 80 et la voiture jaune un z-index égal à 100.
La voiture jaune sera donc en avant-plan, la route en arrière-plan et la voiture rouge
sera achée au-dessus de la route, mais en dessous de la voiture jaune si vous ne savez
pas l'éviter.
Ça y est : la structure et la mise en forme du document sont maintenant en place !
Il ne reste plus ( !) qu'à écrire quelques lignes de jQuery pour mettre tout cela en
mouvement.
218
GÉRER LES DÉPLACEMENTS
Dans ce code, les deux images de la route sont déplacées de façon linéaire vers le haut
de 360 pixels en 1000 millisecondes. Lorsque ce déplacement est terminé, la fonction de
rappel est exécutée. Les images sont replacées à leur position d'origine et la fonction
deplace() est à nouveau exécutée.
La méthode animate() déplace de 360 pixels vers le haut la première image. En ajou-
tant une deuxième image identique à sa suite, on évite qu'une zone blanche n'apparaisse
dans la partie inférieure de l'aire de jeu, comme à la gure 15.4.
Il sut d'exécuter la fonction deplace() pour que la route se déplace sans n vers le
haut. Mais si vous ne l'activez pas une première fois, rien ne se passera sur l'écran.
Vous devez donc insérer l'instruction deplace(); un peu avant la balise </script>.
219
CHAPITRE 15. UN JEU EN JQUERY
220
GÉRER LES DÉPLACEMENTS
221
CHAPITRE 15. UN JEU EN JQUERY
222
DÉTECTER LES COLLISIONS
Simple et ecace !
Les premières lignes placent les coordonnées de la voiture jaune dans les variables
vjX et vjY et celles de la voiture rouge dans les variables vrX et vrY. Les lignes 7 et
8 représentent le test de collision. La première ligne traite des collisions sur le côté
gauche, comme à la gure 15.6.
Elle compare les coordonnées des deux voitures en supposant que la voiture rouge est
plus à droite que la voiture jaune sur l'aire de jeu. Si la voiture rouge entre en collision
par la gauche, le test est vérié et les lignes 10 à 12 s'exécutent. De la même manière, la
deuxième ligne compare les coordonnées des deux voitures en supposant que la voiture
rouge est plus à gauche que la voiture jaune sur l'aire de jeu. Si la voiture rouge entre
en collision par la droite, le test est vérié et les lignes 10 à 12 s'exécutent.
223
CHAPITRE 15. UN JEU EN JQUERY
À quoi correspond la variable ok dans les deux tests de collision et dans les
instructions exécutées en cas de collision ?
Sans cette variable, en cas de collision, plusieurs collisions seraient détectées au fur
et à mesure que la voiture rouge se déplace vers le haut. Pour que la variable ok
remplisse sa fonction, vous devez l'initialiser à 1 au tout début du code ainsi qu'en n
de déplacement de chaque voiture rouge :
1 $ ( function () {
2 var ok = 1;
3 ...
. . . et :
1 function deplace ()
2 {
3 $ ( '# vr ') . animate ({ top : ' -=600 '} , 2500 , ' linear ', function () {
4 var vrX = Math . floor ( Math . random () *194) +70;
5 var vrY = 400;
6 $ ( '# vr ') . css ( ' top ', vrY ) ;
7 $ ( '# vr ') . css ( ' left ' , vrX ) ;
8 ok = 1;
9 }) ;
10 ...
224
AJOUTER DES SONS
Comme vous pouvez le voir, on utilise deux formats de son : MP3 et OGG. Ceci
an d'assurer la compatibilité du code avec la plupart des navigateurs du marché.
Chaque navigateur utilisera le type de chier qu'il sait lire. Par exemple, Internet
Explorer choisira le chier MP3, Firefox et Google Chrome le chier OGG. Si vous
avez téléchargé les ressources, vous trouverez un son aux deux formats.
Pour jouer le son, utilisez l'instruction jQuery suivante :
1 $ ( '# son ') [0]. play () ;
Si vous placez cette instruction dans la fonction collision(), juste après le if qui
teste si une collision s'est produite, l'eet sonore se produira à chaque fois que les
voitures entrent en collision :
1 if ((( vrX > vjX ) && ( vrX < ( vjX +66) ) && ( vrY > vjY ) && ( vrY < (
vjY +150) ) && ( ok == 1) )
2 || (( vjX > vrX ) && ( vjX < ( vrX +66) ) && ( vrY > vjY ) && ( vrY < (
vjY +150) ) && ( ok == 1) ) )
3 {
4 $ ( '# son ') [0]. play () ;
5 ...
Le code complet
Je vous propose de tester le rendu nal. De plus, voici le code complet de l'application.
Amusez-vous bien !
B
Essayer le code
Code web : 741814
1 <! DOCTYPE html >
2 < html >
3 < head >
4 < meta charset = " utf -8 " >
5 < title > jeu </ title >
225
CHAPITRE 15. UN JEU EN JQUERY
44 < script src = " http :// ajax . googleapis . com / ajax / libs / jquery /1/
jquery . min . js " > </ script >
45 < script >
46 $ ( function () {
47 var ok = 1;
48 function deplace ()
49 {
50 $ ( '# vr ') . animate ({ top : ' -=600 '} , 2500 , ' linear ',
function () {
51 var vrX = Math . floor ( Math . random () *194) +70;
226
LE CODE COMPLET
78 function collision ()
79 {
80 vjX = parseInt ( $ ( '# voiture ') . css ( ' left ') ) ;
81 vrX = parseInt ( $ ( '# vr ') . css ( ' left ') ) ;
82 vjY = 10;
83 vrY = parseInt ( $ ( '# vr ') . css ( ' top ') ) ;
84 if ((( vrX > vjX ) && ( vrX < ( vjX +66) ) && ( vrY > vjY ) &&
( vrY < ( vjY +150) ) && ( ok == 1) )
85 || (( vjX > vrX ) && ( vjX < ( vrX +66) ) && ( vrY > vjY ) && (
vrY < ( vjY +150) ) && ( ok == 1) ) )
86 {
87 $ ( '# son ') [0]. play () ;
88 collision = parseInt ( $ ( '# info ') . text () ) + 1;
89 $ ( '# info ') . text ( collision ) ;
90 ok = 0;
91 }
92 }
93 deplace () ;
94 setInterval ( collision , 20) ;
95 }) ;
96 </ script >
97 </ body >
98 </ html >
227
CHAPITRE 15. UN JEU EN JQUERY
228
Chapitre 16
TP : Un jeu de collecte spatiale
Diculté :
P our terminer cette partie, je vous propose de réaliser un jeu en jQuery. Votre mission,
si vous l'acceptez, va consister à diriger un vaisseau spatial au pavé numérique et à
collecter des éléments qui apparaissent de façon aléatoire sur l'écran. Mais attention,
il y a deux types d'éléments : les bons (des vaches) et les mauvais (des voitures Men In
Black ). Les premiers ajoutent 5 points à votre score, alors que les seconds en enlèvent 5.
229
CHAPITRE 16. TP : UN JEU DE COLLECTE SPATIALE
230
INSTRUCTIONS POUR RÉALISER LE TP
231
CHAPITRE 16. TP : UN JEU DE COLLECTE SPATIALE
B
Télécharger les images
Code web : 911508
Le tableau suivant donne les codes ASCII des touches du pavé numérique. Il vous sera
utile lorsque vous écrirez la procédure événementielle keydown() :
Dans le chapitre précédent, vous avez appris à jouer un son lorsqu'une collision se
produit. Pour jouer une musique de fond, vous utiliserez le même principe, mais ici
vous activerez la musique dès l'ouverture de la page en aectant la valeur autoplay à
l'attribut autoplay de la balise <audio>. De même, vous aecterez la valeur loop à
l'attribut loop de la balise <audio> pour que la musique boucle sur elle-même :
1 < audio preload = " auto " id = " musiqueFond " autoplay = " autoplay " loop
= " loop " >
2 < source src = " BabyPleaseDontGo . mp3 " type = " audio / mp3 " >
3 < source src = " BabyPleaseDontGo . mp3 " type = " audio / ogg " >
4 </ audio >
Et maintenant, la balle est dans votre camp. À vos claviers, et amusez-vous bien !
Correction
J'espère que tout s'est bien passé. Pour faciliter la correction, nous allons procéder
par étapes successives. Assurez-vous que vous avez passé chaque étape avec succès et,
en cas de doute, comparez le code de la correction avec votre propre code. Comme
toujours en programmation, il n'y a pas une solution mais plusieurs qui donnent lieu à
plusieurs codes, parfois très diérents. Si votre code ne ressemble pas du tout au mien
mais fonctionne, ce n'est pas grave. Cela signie simplement que vous êtes partis dans
une autre direction. Ce qui compte avant tout, c'est qu'il fonctionne.
232
CORRECTION
45 < script src = " jquery . js " > </ script >
46 < script >
47 // Ins é rez le code jQuery ici
48 </ script >
49 </ body >
233
CHAPITRE 16. TP : UN JEU DE COLLECTE SPATIALE
Comme vous pouvez le voir, il n'y a rien d'exceptionnel dans ces lignes. L'aire de jeu
correspond à la balise <div id="jeu">. Cette balise héberge trois images : l'arrière-
plan (soucoupe.png), l'élément à collecter (bon.png) et l'élément qui ne doit pas être
collecté (mauvais.png).
Trois informations sont achées en dessous de l'aire de jeu :
1. Le nombre de bons objets collectés (#info1) ;
2. Le nombre de mauvais objets collectés (#info2) ;
3. Le score du joueur (#info3).
Enn, une balise <audio> est utilisée pour la musique de fond.
Le code CSS n'ore aucune diculté. L'aire de jeu est dimensionnée, encadrée et une
image y est achée en arrière-plan. La propriété z-index de la soucoupe volante est
initialisée à 200 an qu'elle soit toujours achée en avant-plan. Les images d'identiants
#bon et #mauvais ont un z-index égal à 100. Elles s'acheront donc entre l'image
d'arrière-plan et la soucoupe volante. Elles sont positionnées de façon absolue et leur
propriété display est initialisée à none an d'être invisibles à l'ouverture de la page.
Déplacement du vaisseau
Cette deuxième étape va donner vie aux touches du pavé numérique. Dans quelques
minutes, vous pourrez déplacer le vaisseau où bon vous semble.
Voici le code utilisé :
1 $ ( document ) . keydown ( function ( e ) {
2 if ( e . which == 39) // Vers la droite
3 {
4 posX = parseInt ( $ ( '# soucoupe ') . css ( ' left ') ) ;
5 if ( posX < 470)
6 $ ( '# soucoupe ') . css ( ' left ' , posX +30) ;
7 }
8 if ( e . which == 37) // Vers la gauche
9 {
10 posX = parseInt ( $ ( '# soucoupe ') . css ( ' left ') ) ;
11 if ( posX > 20)
12 $ ( '# soucoupe ') . css ( ' left ' , posX -30) ;
13 }
14 if ( e . which == 40) // Vers le bas
15 {
16 posY = parseInt ( $ ( '# soucoupe ') . css ( ' top ') ) ;
17 if ( posY < 230)
18 $ ( '# soucoupe ') . css ( ' top ', posY +30) ;
19 }
20 if ( e . which == 38) // Vers le haut
21 {
234
CORRECTION
Ne vous laissez pas impressionner par le nombre d'instructions contenues dans la mé-
thode keydown(). Si vous y regardez d'un peu plus près, vous verrez qu'elle contient
huit blocs de code consacrés au traitement des huit
touches du pavé numérique. Pre-
nons par exemple le code traitant de la touche 9 du pavé numérique. Cette touche
doit déplacer le vaisseau en diagonale, vers le haut et la droite.
1 if ( e . which == 33) // Vers le haut et la droite
2 {
3 posX = parseInt ( $ ( '# soucoupe ') . css ( ' left ') ) ;
4 posY = parseInt ( $ ( '# soucoupe ') . css ( ' top ') ) ;
5 if (( posY > 20) && ( posX < 470) )
6 $ ( '# soucoupe ') . css ( ' left ', posX +30) . css ( ' top ' , posY -30) ;
7 }
Les deux premières instructions initialisent les variables posX et posY avec les coordon-
nées de la soucoupe. Si ces coordonnées le permettent, le déplacement est eectué. Ici,
235
CHAPITRE 16. TP : UN JEU DE COLLECTE SPATIALE
la soucoupe ne doit pas être trop haut (posY > 20) ni trop à droite (posX < 470). Le
déplacement s'eectue en modiant les propriétés CSS left et top.
Une fois ces instructions saisies, vous pouvez vérier que la soucoupe est guidée avec
les touches échées du pavé numérique.
Si la soucoupe reste immobile, vériez que la touche Verr Num n'est pas active. Si
vous utilisez un ordinateur portable, il se peut que les touches échées soient absentes
du clavier. Dans ce cas, vous devrez choisir d'autres touches. Reportez-vous à la section
traitant de la gestion événementielle du clavier (page 121) pour avoir la liste des codes
ASCII des touches du clavier.
Les trois premières instructions utilisent la fonction Math.random() pour tirer des
nombres aléatoires. Le premier correspond à l'abscisse de l'élément qui va s'acher. Il
est compris entre 0 et 519. Le deuxième correspond à l'ordonnée de l'élément qui va
s'acher. Il est compris entre 0 et 319. Enn, le troisième détermine le type de l'élément
qui sera aché. Si elemType vaut 0, l'élément #bon est aché aux coordonnées (elemX,
elemY), puis l'élément #mauvais est dissimulé :
1 if ( elemType == 0)
236
CORRECTION
2 {
3 $ ( '# bon ') . css ( ' top ', elemY ) . css ( ' left ' , elemX ) ;
4 $ ( '# bon ') . show () ;
5 $ ( '# mauvais ') . css ( ' display ', ' none ') ;
6 }
Inversement, si elemType est diérent de 0, l'élément #mauvais est aché aux coor-
données (elemX, elemY), puis l'élément #bon est dissimulé :
1 else
2 {
3 $ ( '# mauvais ') . css ( ' top ', elemY ) . css ( ' left ' , elemX ) ;
4 $ ( '# mauvais ') . show () ;
5 $ ( '# bon ') . css ( ' display ', ' none ') ;
6 }
237
CHAPITRE 16. TP : UN JEU DE COLLECTE SPATIALE
Les deux premières instructions mémorisent les coordonnées de la soucoupe dans les
variables posX et posY :
1 posX = parseInt ( $ ( '# soucoupe ') . css ( ' left ') ) ;
2 posY = parseInt ( $ ( '# soucoupe ') . css ( ' top ') ) ;
. . . cela signie que l'élément #mauvais est aché. La chaîne mauvais est stockée
dans la variable elemType et les coordonnées de l'élément #mauvais le sont dans les
variables elemX et elemY :
1 elemType = ' mauvais ';
2 elemX = parseInt ( $ ( '# mauvais ') . css ( ' left ') ) ;
3 elemY = parseInt ( $ ( '# mauvais ') . css ( ' top ') ) ;
Dans le cas contraire, l'élément #bon est aché. La chaîne bon est stockée dans la
variable elemType et les coordonnées de l'élément #bon le sont dans les variables elemX
et elemY :
1 elemType = ' bon ';
2 elemX = parseInt ( $ ( '# bon ') . css ( ' left ') ) ;
3 elemY = parseInt ( $ ( '# bon ') . css ( ' top ') ) ;
Il ne reste plus qu'à tester si la soucoupe et l'élément aché aux coordonnées (elemX,
elemY) se chevauchent :
1 if (( elemX > posX -20) && ( elemX <( posX +125 -50+20) ) && ( elemY > posY
-20) && ( elemY <( posY +177 -116+20) ) )
238
CORRECTION
C'est vrai qu'il aurait été plus simple d'écrire posX+95 et posY+81. Si j'ai indiqué trois
nombres à la suite de posX et de posY, c'est uniquement dans un but pédagogique : le
vaisseau a une largeur de 125 pixels et les éléments à collecter une largeur d'environ
50 pixels. En vériant que l'abscisse de l'élément est supérieure à celle du vaisseau
et inférieure à celle du vaisseau + la largeur du vaisseau - la largeur de l'élément, on
s'assure que l'élément est entièrement couvert par le vaisseau.
Il en va de même en ce qui concerne les deux derniers tests : en vériant que l'ordonnée
de l'élément est supérieure à celle du vaisseau et inférieure à celle du vaisseau + la
hauteur du vaisseau - la hauteur de l'élément, on s'assure que l'élément est entièrement
couvert par le vaisseau.
Les 20 pixels ajoutés à posX et posY donnent une marge de sécurité autour du vaisseau
an que la collision soit plus facile à détecter. De la même façon, on enlève 20 pixels
dans le premier et le troisième test pour faciliter la détection des collisions. Sans cet
artice, il faudrait que les éléments soient entièrement masqués par le vaisseau pour
qu'une collision se produise.
Les lignes suivantes mettent à jour les balises <span> #info1, #info2 et #info3 en
fonction de la nature de l'élément qui est entré en collision avec le vaisseau. S'il s'agit
de l'élément #bon :
1 if ( elemType == ' bon ')
S'il s'agit de l'élément #mauvais, le nombre d'éléments #mauvais capturé est incré-
menté de 1, le score est décrémenté de 5 et l'élément #mauvais est dissimulé :
1 else
2 {
3 var nbMauvais = parseInt ( $ ( '# info2 ') . text () ) +1;
4 $ ( '# info2 ') . text ( nbMauvais ) ;
5 var score = parseInt ( $( '# info3 ') . text () ) -5;
6 $ ( '# info3 ') . text ( score ) ;
7 $ ( '# mauvais ') . css ( ' display ', ' none ') ;
8 }
Pour terminer, activez cette fonction à intervalles réguliers. Par exemple toutes les 200
millisecondes avec la fonction setInterval() :
239
CHAPITRE 16. TP : UN JEU DE COLLECTE SPATIALE
La variable stopDetection est dite globale car elle n'est pas liée à une méthode
ou à une fonction donnée. Sa portée sera donc globale dans tout le code JavaScript.
Lorsqu'une collision est détectée, la valeur 1 est stockée dans la variable stopDetection
pour indiquer qu'il ne faut plus détecter de collisions. Parallèlement, pour qu'une colli-
sion soit eective, la variable stopCollision doit être égale à 0. Le code de la fonction
collisions() devient donc le suivant :
1 if (( elemX > posX ) && ( elemX <( posX +233) ) && ( elemY > posY ) && (
elemY <( posY +127) ) && ( stopDetection == 0) )
2 {
3 $ ( '# son ') [0]. play () ;
4 stopDetection = 1;
Ça y est, le code est entièrement opérationnel. J'espère que sa mise au point ne vous
a posé aucun problème. N'hésitez pas à modier ou ajouter des choses (des sons par
exemple). Ce qui serait bien, c'est de permettre au joueur de mettre la musique en
pause ou en lecture.
B
Essayer le jeu
Code web : 764240
240
CORRECTION
41 < script src = " jquery . js " > </ script >
42 < script >
43 $ ( function () {
44 var stopDetection = 0;
45 $ ( document ). keydown ( function ( e ) {
46 if ( e . which == 39) // Vers la droite
241
CHAPITRE 16. TP : UN JEU DE COLLECTE SPATIALE
47 {
48 posX = parseInt ( $ ( '# soucoupe ') . css ( ' left ') ) ;
49 if ( posX < 470)
50 $ ( '# soucoupe ') . css ( ' left ' , posX +30) ;
51 }
52 if ( e . which == 37) // Vers la gauche
53 {
54 posX = parseInt ( $ ( '# soucoupe ') . css ( ' left ') ) ;
55 if ( posX > 20)
56 $ ( '# soucoupe ') . css ( ' left ' , posX -30) ;
57 }
58 if ( e . which == 40) // Vers le bas
59 {
60 posY = parseInt ( $ ( '# soucoupe ') . css ( ' top ') ) ;
61 if ( posY < 230)
62 $ ( '# soucoupe ') . css ( ' top ', posY +30) ;
63 }
64 if ( e . which == 38) // Vers le haut
65 {
66 posY = parseInt ( $ ( '# soucoupe ') . css ( ' top ') ) ;
67 if ( posY > 20)
68 $ ( '# soucoupe ') . css ( ' top ', posY -30) ;
69 }
70 if ( e . which == 36) // Vers le haut et la gauche
71 {
72 posX = parseInt ( $ ( '# soucoupe ') . css ( ' left ') ) ;
73 posY = parseInt ( $ ( '# soucoupe ') . css ( ' top ') ) ;
74 if (( posY > 20) && ( posX > 20) )
75 $ ( '# soucoupe ') . css ( ' left ' , posX -30) . css ( ' top ', posY
-30) ;
76 }
77 if ( e . which == 33) // Vers le haut et la droite
78 {
79 posX = parseInt ( $ ( '# soucoupe ') . css ( ' left ') ) ;
80 posY = parseInt ( $ ( '# soucoupe ') . css ( ' top ') ) ;
81 if (( posY > 20) && ( posX < 470) )
82 $ ( '# soucoupe ') . css ( ' left ' , posX +30) . css ( ' top ', posY
-30) ;
83 }
84 if ( e . which == 35) // Vers le bas et la gauche
85 {
86 posX = parseInt ( $ ( '# soucoupe ') . css ( ' left ') ) ;
87 posY = parseInt ( $ ( '# soucoupe ') . css ( ' top ') ) ;
88 if (( posX > 20) && ( posY < 230) )
89 $ ( '# soucoupe ') . css ( ' left ' , posX -30) . css ( ' top ', posY
+30) ;
90 }
91 if ( e . which == 34) // Vers le bas et la droite
92 {
93 posX = parseInt ( $ ( '# soucoupe ') . css ( ' left ') ) ;
242
CORRECTION
243
CHAPITRE 16. TP : UN JEU DE COLLECTE SPATIALE
244
Quatrième partie
jQuery et AJAX
245
Chapitre 17
Premiers pas avec AJAX
Diculté :
C e chapitre va aborder un sujet qui fait souvent peur aux programmeurs Web : AJAX.
Vous allez voir à quel point jQuery facilite les échanges de données AJAX et il y a
fort à parier que vous utiliserez sans aucune appréhension tout ce qui sera écrit dans
ce chapitre pour obtenir des pages Web dynamiques, vraiment réactives et qui soulageront
dans de grandes mesures les échanges avec le serveur.
247
CHAPITRE 17. PREMIERS PAS AVEC AJAX
Qu'est-ce qu'AJAX ?
Lorsque vous naviguez de page en page sur un site Web traditionnel (entendez par là
non-AJAX), les actions de l'internaute se traduisent par les actions suivantes :
1. Envoi d'une requête au serveur an d'obtenir une nouvelle page.
2. Calcul de la nouvelle page par le serveur et envoi des données HTML/CSS cor-
respondantes.
3. Achage de ces données dans le navigateur.
Cette technique fonctionne très bien dans la plupart des cas, mais parfois seule une
partie de la page nécessite d'être mise à jour. C'est là qu'intervient AJAX :
1. Dans un premier temps, envoi d'une requête au serveur an d'obtenir les données
qui seront achées dans une partie bien précise de la page actuelle.
2. Calcul des données demandées par le serveur et envoi de ces données au navigateur
au format XML.
3. Réception des données envoyées par le programme (on dit aussi moteur) AJAX
qui les a demandées et achage dans un endroit bien précis de la page actuelle
sans toucher au reste de la page.
La gure 17.1 résume ces deux modes de fonctionnement.
Figure 17.1 Les deux modes de fonctionnement d'un site Web : client-serveur et
AJAX
Si, dans la plupart des cas, un fonctionnement traditionnel est entièrement satisfaisant,
les performances d'achage peuvent être grandement améliorées dans certains cas par-
ticuliers, comme par exemple l'achage de données mises à jour à intervalles réguliers
248
QU'EST-CE QU'AJAX ?
(cours d'actions en bourse par exemple), la sauvegarde des données pendant la saisie
dans un formulaire, la mise à jour et/ou la vérication dynamique des champs d'un
formulaire en fonction des données saisies par l'utilisateur, la saisie prédictive (comme
le fait Google en proposant des réponses lorsque vous commencez à taper quelques
caractères dans la case de recherche), etc.
Mais au fait, savez-vous ce que signie le terme AJAX ? Que tous les joyeux drilles
qui ont fait un rapprochement avec la lessive de même nom se rassurent, ces deux
termes, quoique homonymes, n'ont aucun rapport entre eux. AJAX est l'acronyme
d'Asynchronous JavaScript and XML. Tous ces termes se comprennent aisément : le
langage JavaScript est utilisé pour demander des données au serveur. Ces données lui
sont retournées de façon asynchrone sous une forme XML.
Si vous faites du PHP, il est plus que probable que vous ayez déjà un serveur
Apache sur votre machine. En eet, des logiciels comme WAMP, MAMP,
XAMPP, etc. en possèdent déjà un. Si un serveur Apache est déjà installé sur
votre ordinateur, vous pouvez sauter cette étape.
L'installation d'un serveur Apache sur votre ordinateur n'a rien de sorcier : elle consiste
à télécharger et exécuter un chier. Rendez-vous sur le site ociel d'Apache et téléchar-
gez la dernière version en date du chier Apache. Une fois téléchargé, double-cliquez
sur ce chier pour installer le serveur Apache. Vous devriez rapidement arriver à la
fenêtre visible à la gure 17.2.
B
Site ociel d'Apache
Code web : 714866
Quelques précisions sur le paramétrage de cette boîte de dialogue :
249
CHAPITRE 17. PREMIERS PAS AVEC AJAX
250
QU'EST-CE QU'AJAX ?
251
CHAPITRE 17. PREMIERS PAS AVEC AJAX
Maintenant pour tester vos pages présentes dans le dossier Apache, il vous sut d'ouvrir
votre navigateur et de vous rendre sur la page http://localhost/nom_du_fichier.html.
Charger un chier
Je vais vous montrer comment charger des informations stockées sur le serveur et mettre
à jour un élément de la page actuelle (et juste cet élément) avec ces informations. Pour
cela, nous allons utiliser la méthode load(), dont voici la syntaxe :
1 $ ( ' sel ') . load ( ' nom_page ', function () {
2 // une ou plusieurs instructions
3 }) ;
. . . où :
sel est un sélecteur jQuery quelconque qui permet d'identier l'élément (ou les
éléments) à mettre à jour ;
nom_page est le nom d'une page Web quelconque dont le contenu sera utilisé pour
eectuer la mise à jour ;
Si elle est précisée, la fonction de rappel est, comme toujours, exécutée lorsque la
méthode a été exécutée, c'est-à-dire lorsque l'élément (ou les éléments) a (ont) été
mis à jour.
Passons tout de suite à la pratique. Dans ce premier exemple, un document ache
deux boutons de commande et quatre balises <div>. Trois d'entre elles contiennent du
texte et une contient une image. Le premier bouton va mettre à jour le contenu de la
première balise <div> et le deuxième le contenu de la deuxième. Et ce, bien entendu,
sans toucher au reste du document. Voici le code utilisé :
1 < style type = " text / css " >
2 div { width : 400 px ; height : 300 px ; float : left ; margin : 5 px ;
}
3 # premier { background - color : # F6E497 ; }
4 # troisieme { background - color : # CAF1EC ; }
5 # quatrieme { background - color : # F1DBCA ; }
6 </ style >
7
8 < button id = " majPremier " > Mise à jour premi è re zone </ button >
252
CHARGER UN FICHIER
9 < button id = " majDeuxieme " > Mise à jour deuxi è me zone </ button > < br
/ > < br / >
10 < div id = " premier " >
11 Lorem ipsum dolor sit amet , consectetur adipisicing elit , sed
do eiusmod tempor incididunt ut labore et dolore magna
aliqua . Ut enim ad minim veniam , quis nostrud exercitation
ullamco laboris nisi ut aliquip ex ea commodo consequat .
12 </ div >
13
26 < script src = " jquery . js " > </ script >
27 < script >
28 $ ( function () {
29 $ ( '# majPremier ') . click ( function () {
30 $ ( '# premier ') . load ( ' maj1 . html ', function () {
31 alert ( 'La premi è re zone a é t é mise à jour ') ;
32 }) ;
33 }) ;
34
Examinons le code jQuery. Lorsque le premier bouton est cliqué, la balise d'identiant
#premier (en d'autres termes, la première balise <div>) est mise à jour avec le contenu
du document maj1.html :
1 $ ( '# premier ') . load ( ' maj1 . html ' , function () {
253
CHAPITRE 17. PREMIERS PAS AVEC AJAX
Le texte compris entre les balises <body> et </body> sera utilisé pour mettre à jour la
première balise <div> de notre document. Le texte original Lorem ipsum dolor sit
amet. . . deviendra donc Ut enim ad minima veniam. . . .
Lorsque le deuxième bouton est cliqué, la même technique met à jour le contenu de la
deuxième balise <div>, avec le document maj2.html :
1 <! DOCTYPE html >
2 < html >
3 < head >
4 < meta charset = " UTF -8 " >
5 </ head >
6
254
CHARGER UNE PARTIE D'UN FICHIER
. . . où :
sel est un sélecteur jQuery quelconque qui permet d'identier l'élément (ou les
éléments) à mettre à jour ;
nom_page est le nom d'une page Web quelconque dont le contenu sera utilisé pour
eectuer la mise à jour ;
sel2 est un sélecteur jQuery quelconque, sans le signe $ ni les parenthèses, qui
permettra d'isoler certaines données dans la page nom_page ;
Si elle est précisée, la fonction de rappel est, comme toujours, exécutée lorsque la
méthode a été exécutée, c'est-à-dire lorsque l'élément (ou les éléments) a (ont) été
mis à jour.
À titre d'exemple, j'ai regroupé les données de mise à jour qui se trouvaient dans les
chiers maj1.html et maj2.html de l'exemple précédent, je les ai placées dans le chier
maj.html et je leur ai aecté un identiant pour qu'elles soient plus faciles à isoler en
jQuery :
1 <! DOCTYPE html >
2 < html >
3 < head >
4 < meta charset = " UTF -8 " >
5 </ head >
6
Ainsi, le texte à utiliser pour mettre à jour la première balise est facilement identiable
par l'identiant #modif1, et l'image à utiliser pour mettre à jour la deuxième balise est
facilement identiable par l'identiant #modif2. Voici comment doivent être modiées
les deux méthodes événementielles de l'exemple précédent pour n'utiliser qu'une partie
du chier lors de la mise à jour :
1 $ ( '# majPremier ') . click ( function () {
2 $ ( '# premier ') . load ( ' maj . html # modif1 ' , function () {
3 alert ( 'La premi è re zone a é t é mise à jour ') ;
4 }) ;
5 }) ;
255
CHAPITRE 17. PREMIERS PAS AVEC AJAX
. . . où :
sel est un sélecteur jQuery quelconque qui permet d'identier l'élément (ou les
éléments) à mettre à jour ;
url est le nom de la page PHP qui sera utilisée pour faire la mise à jour ;
param est une chaîne qui contient un ou plusieurs couples paramètres/valeurs. Par
exemple, si param vaut id=5, p=14 et url vaut http://site.fr/page.php, la
page utilisée pour la mise à jour sera http://site.fr/page.php?id=5&p=14.
Et maintenant, je vous propose de voir comment utiliser cette version de la méthode
load() sur un cas concret. Que diriez-vous d'acher des proverbes chinois en utilisant
quelques lignes de jQuery associées à un programme écrit en PHP ? Voici le code
HTML/jQuery utilisé :
1 <! DOCTYPE html >
2 < html >
3 < head >
4 < meta charset = " UTF -8 " >
5 < title > Ajax - Load </ title >
6 </ head >
7
256
PASSER DES PARAMÈTRES À UN PROGRAMME PHP
11 < div id = " r " > Entrez un nombre compris entre 1 et 10 pour
afficher un proverbe chinois </ div >
12
13 < script src = " jquery . js " > </ script >
14 < script >
15 $ ( function () {
16 $ ( '# action ') . click ( function () {
17 var param = 'l = ' + $ ( '# ref ') . val () ;
18 $ ( '# r ') . load ( ' http :// www . proverbes . php ' , param ) ;
19 }) ;
20 }) ;
21 </ script >
22 </ body >
23 </ html >
Lorsque le bouton est cliqué, le contenu de la zone de texte est lu avec la méthode
jQuery val() appliquée à la zone de texte #ref. La valeur ainsi obtenue est mémorisée
dans la variable param, précédée du texte l= :
1 var param = 'l = ' + $ ( '# ref ') . val () ;
Par exemple, si vous tapez 5 dans la zone de texte, la variable param contiendra la
chaîne l=5 après l'exécution de cette instruction.
La ligne suivante passe le paramètre que vous avez saisi au programme proverbes.php
et met à jour la balise <div id="r"> en conséquence :
1 $ ( '# r ') . load ( ' proverbes . php ' , param ) ;
Il ne vous manque plus que le traitement PHP. Je vais vous le donner, mais je ne vais
pas l'expliquer, ce n'est pas vraiment le but de ce cours. Sans plus attendre. . .
1 <? php
2 $proverbe = array (
3 " On ne rassasie pas un chameau en le nourrissant à la cuill è
re . " ,
4 " Conna î tre son ignorance est la meilleure part de la
connaissance . " ,
5 " Une maison en paille o ù l 'on rit , vaut mieux qu ' un palais o ù
l 'on pleure . " ,
6 " Le vrai voyageur ne sait pas o ù il va . " ,
7 " Point n ' est besoin d 'é lever la voix quand on a raison . " ,
8 " Un ami c ' est une route , un ennemi c ' est un mur . " ,
9 " Un peu de parfum demeure toujours sur la main qui te donne
des roses . " ,
10 " Si é lev é que soit l ' arbre , ses feuilles tombent toujours à
terre . " ,
11 " Si ce que tu as à dire n ' est pas plus beau que le silence ,
tais toi . " ,
12 " Trois coupes de vin font saisir une doctrine profonde . "
13 );
14
257
CHAPITRE 17. PREMIERS PAS AVEC AJAX
B
Essayer ce code
Code web : 639863
Seulement attention, comme je vous le disais précédemment, le PHP doit être placé sur
un serveur, local ou distant. Pour que votre page fonctionne, placez les deux chiers
sur un serveur.
Il est impossible d'acher des informations provenant d'un autre site. Votre
traitement PHP doit donc être sur le même hébergement que votre code
jQuery, sans ça rien ne fonctionnera.
1 $ ( ' sel ') . load ( ' http :// www . site . com / page . php ' ,{ id :50 , nom : '
durand '}) ;
Mais attention, dans ce cas, les valeurs sont passées par une requête HTTP POST. Elles
devront donc être récupérées de la sorte par le programme PHP.
258
REQUÊTES GET ET POST
. . . où :
adresse est le nom d'une page Web quelconque dont le contenu sera récupéré par
la fonction get() ;
données représente les données à passer à la page Web par une requête HTTP GET ;
Si elle est précisée, la fonction de rappel est, comme toujours, exécutée lorsque la
méthode a été exécutée, c'est-à-dire lorsque l'élément (ou les éléments) a (ont) été
mis à jour.
Passons à la pratique. À l'aide de la fonction get(), nous allons modier le code
précédent pour récupérer le code HTML retourné par une page PHP et l'acher dans
une boîte de message. Voici les instructions utilisées :
1 <! DOCTYPE html >
2 < html >
3 < head >
4 < meta charset = " UTF -8 " >
5 < title > Ajax - Get </ title >
6 </ head >
7
11 < script src = " jquery . js " > </ script >
12 < script >
13 $ ( function () {
14 $ ( '# action ') . click ( function () {
15 $ . get ( ' proverbes . php ? l =9 ', function ( data ) {
16 alert ( data );
17 }) ;
18 }) ;
19 }) ;
20 </ script >
21 </ body >
22 </ html >
B
Essayer ce code
Code web : 236871
259
CHAPITRE 17. PREMIERS PAS AVEC AJAX
La fonction post()
La fonction post() est toute indiquée si vous voulez envoyer des données de grande
taille et/ou sensibles (entendez par là qui contiennent des mots de passe ou d'autres
données du même type) au serveur. Par exemple, vous utiliserez la fonction post()
pour envoyer des données saisies dans un formulaire, qui doivent être stockées dans la
base de données du site. Voici le type d'instruction que vous pourriez utiliser :
1 $ . post ( ' traiteFormulaire . php ' , { nom : ' Pierre34 ' , heure : '2 pm ' ,
post = 'Un peu de texte r é cup é r é dans un formulaire HTML et
destin é à ê tre post é dans un forum . ' } ,
2 function ( data ) {
3 alert ( data );
4 }) ;
260
FAIRE PATIENTER L'UTILISATEUR AVEC UNE ANIMATION
Figure 17.6 L'image indique au visiteur qu'il doit attendre quelques secondes
Si vous désirez une image diérente, je vous conseille de vous rendre sur le
site http://ajaxload.info pour obtenir une image GIF en parfait accord
avec la charte graphique de votre site.
Pour gérer l'achage de cette image, il sut d'y faire référence lorsque la requête AJAX
est déclenchée, puis de l'eacer lorsque l'exécution de la requête AJAX est terminée.
À titre d'exemple, voici comment a été modié le code de l'exemple précédent pour
acher une image d'attente entre le début et la n de la requête AJAX :
1 <! DOCTYPE html >
2 < html >
3 < head >
4 < meta charset = " UTF -8 " >
5 < title > Ajax - Load </ title >
6 </ head >
7
13 < script src = " jquery . js " > </ script >
14 < script >
15 $ ( function () {
16 $ ( '# action ') . click ( function () {
17 $ ( '# r ') . html ( ' < img src =" http :// www . mediaforma . com / sdz
/ jquery / ajax - loader . gif " > ') ;
18 var param = 'l = ' + $ ( '# ref ') . val () ;
19 $ ( '# r ') . load ( ' http :// www . mediaforma . com / sdz / jquery /
data . php ', param ) ;
20 }) ;
21 }) ;
261
CHAPITRE 17. PREMIERS PAS AVEC AJAX
Qu'est-ce qui a changé, d'après vous ? Le code HTML est strictement identique. C'est
du côté jQuery qu'il faut chercher les diérences, ou plutôt la diérence, puisqu'une
seule instruction a été ajoutée, ligne 17 :
1 $ ( '# r ') . html ( '< img src =" http :// www . mediaforma . com / sdz / jquery /
ajax - loader . gif " > ') ;
Lorsque le bouton est cliqué par l'utilisateur, cette ligne ache l'animation dans la
balise <div>. Les lignes 18 et 19 lancent une requête AJAX qui met à jour le contenu
de la balise <div> et donc eace l'image GIF animée.
En résumé
Pour mettre à jour une zone du document avec une page Web (écrite en HTML
ou en PHP par exemple), le plus simple consiste à utiliser la méthode load(), en
précisant le nom de la page entre les parenthèses, éventuellement suivi d'une fonction
de rappel. Si elle est précisée, cette fonction sera appelée lorsque les données auront
été chargées.
En modiant légèrement la syntaxe de la méthode load(), il est possible d'utiliser
une partie seulement des données auxquelles donne accès la requête AJAX. Pour
cela, il sut de faire suivre le nom du chier par une espace et par un sélecteur
jQuery, sans le signe $, sans les parenthèses et sans les apostrophes.
Un ou plusieurs couples paramètres/valeurs peuvent être passés à la méthode load().
Indiquez-les sous la forme d'une chaîne dans le deuxième paramètre de la fonction.
Plusieurs fonctions jQuery vont vous permettre d'aller plus loin avec vos requêtes
AJAX. Vous pouvez en particulier envoyer des requêtes HTTP GET et POST au serveur
avec les fonctions $.get() et $.post(), charger et exécuter un script JavaScript avec
la fonction $.getScript() et des données JSON avec la fonction $.getJSON().
262
Chapitre 18
Plus loin avec AJAX
Diculté :
A rrivés à ce point dans la lecture du cours, vous savez mettre à jour une partie d'une
page Web en utilisant la méthode load(). Nous allons maintenant nous intéresser à
des fonctions jQuery complémentaires.
Les méthodes se diérencient des fonctions, car elles s'appliquent à des éléments obtenus
à travers un sélecteur jQuery. Dans $('sélecteur').meth(paramètres);, meth est une
méthode, alors que dans $.fonc(paramètres);, fonc est une fonction.
263
CHAPITRE 18. PLUS LOIN AVEC AJAX
Dans la deuxième syntaxe, une fonction de retour est précisée en deuxième paramètre
de la fonction. Cette fonction est exécutée lorsque le code JavaScript a été chargé et
exécuté :
1 $ . getScript ( ' adresse ' , function () {
2 // Une ou plusieurs instructions
3 }) ;
Comme vous pouvez le déduire en examinant ce code, un chier JSON est composé d'un
ensemble de paires 'nom':'valeur' organisées de façon hiérarchique. Ici par exemple,
les noms menu et commande se trouvent au même niveau hiérarchique. Quant aux noms
nomCde et action, il s'agit des enfants du nom commande.
264
CHARGER UN SCRIPT ET DES DONNÉES JSON
Dans vos vies de programmeurs jQuery, vous serez peut-être amenés à manipuler des
données au format JSON. Pour cela, vous chargerez le chier de données JSON avec
la fonction $.getJSON(), puis vous travaillerez sur les diérentes données qui le com-
posent en utilisant la fonction de rappel.
Pour bien comprendre comment accéder aux données d'un chier codé en JSON, nous
allons raisonner sur un exemple simple qui comporte quatre paires 'nom':'valeur' de
même niveau :
1 {
2 " nom " : " Pierre Durand " ,
3 " age " : " 27 " ,
4 " ville " : " Paris " ,
5 " domaine " : " HTML5 , CSS3 , JavaScript "
6 }
4 < script src = " jquery . js " > </ script >
5 < script >
6 $ ( function () {
7 $ ( '# charger ') . click ( function () {
8 $ . getJSON ( ' fichier . json ' , function ( donnees ) {
9 $ ( '# r ') . html ( ' <p > <b > Nom </b > : ' + donnees . nom + ' </p > ')
;
10 $ ( '# r ') . append ( ' <p > <b > Age </b > : ' + donnees . age + ' </p >
') ;
11 $ ( '# r ') . append ( ' <p > <b > Ville </ b > : ' + donnees . ville + '
</p > ') ;
12 $ ( '# r ') . append ( ' <p > <b > Domaine de comp é tences </ b > : ' +
donnees . domaine + ' </p > ') ;
13 }) ;
14 }) ;
15 }) ;
16 </ script >
Lorsque le bouton est cliqué, la fonction getJSON() est exécutée pour charger le chier
de données fichier.json :
1 $ . getJSON ( ' fichier . json ' , function ( donnees ) {
265
CHAPITRE 18. PLUS LOIN AVEC AJAX
#r. Comme nous passons par la méthode html() pour remplir la balise <div>, il est
possible d'utiliser des attributs de mise en forme. Ici, le mot Nom est mis en gras
avec la balise HTML <b> :
1 $ ( '# r ') . html ( '<p > <b > Nom </ b > : ' + donnees . nom + ' </p > ') ;
La fonction ajax()
J'ai gardé le meilleur pour la n : la fonction $.ajax() ! Tout comme les méthodes
et fonctions AJAX étudiées jusqu'ici, $.ajax() permet d'envoyer des requêtes HTTP
AJAX à un serveur Web. Ce qui la diérencie de ses collègues , c'est la nesse
266
LA FONCTION AJAX()
des paramètres qui peuvent lui être communiqués. N'ayez crainte, je vais tout vous
expliquer et vous jugerez en toute connaissance de cause si oui ou non vous avez besoin
de cette fonction. Deux syntaxes sont possibles :
1 $ . ajax ( adresse , { options }) ;
2
3 $ . ajax ({ options }) ;
. . . où adresse est l'adresse à laquelle la requête doit être envoyée, et options corres-
pond à une ou plusieurs des options suivantes :
type : type de la requête, GET ou POST (GET par défaut).
url : adresse à laquelle la requête doit être envoyée.
data : données à envoyer au serveur.
dataType : type des données qui doivent être retournées par le serveur : xml, html,
script, json, text.
success : fonction à appeler si la requête aboutit.
error : fonction à appeler si la requête n'aboutit pas.
timeout : délai maximum (en millisecondes) pour que la requête soit exécutée. Si ce
délai est dépassé, la fonction spéciée dans le paramètre error sera exécutée.
Beaucoup d'autres options peuvent être utilisées. Pour en avoir une liste exhaustive,
consultez la documentation ocielle.
B
La documentation ocielle
Code web : 767757
Que diriez-vous de passer à la pratique pour voir comment utiliser cette fonction ? Je
vous propose de reprendre l'exemple du chapitre précédent et de remplacer la fonction
$.get() par $.ajax(). Voici le code utilisé :
1 <! DOCTYPE html >
2 < html >
3 < head >
4 < meta charset = " UTF -8 " >
5 < title > Ajax - La fonction ajax () </ title >
6 </ head >
7
11 < script src = " jquery . js " > </ script >
12 < script >
13 $ ( function () {
14 $ ( '# action ') . click ( function () {
15 $ . ajax ({
16 type : ' GET ',
17 url : ' proverbes . php ? l =7 ',
18 timeout : 3000 ,
19 success : function ( data ) {
20 alert ( data ) ; } ,
21 error : function () {
267
CHAPITRE 18. PLUS LOIN AVEC AJAX
Le corps du document contient un bouton de commande qui sera utilisé pour exécuter
la requête AJAX. Lorsque ce bouton est cliqué, la fonction $.ajax() est lancée pour
exécuter la requête AJAX. Cette requête est de type GET (ce paramètre aurait pu être
omis, puisqu'il s'agit de la valeur par défaut). La page invoquée est dénie dans le
paramètre url et le délai maximal d'exécution l'est dans le paramètre timeout. Ici, un
délai de 3000 millisecondes est accordé au programme PHP pour fournir ce qui lui est
demandé.
Si la requête aboutit, les données renvoyées par le programme PHP sont achées dans
une boîte de message. Dans le cas contraire, un message d'erreur est aché. La gure
18.2 est un exemple d'exécution de cette page.
Figure 18.2 Exécution de la fonction $.ajax() pour récupérer des données sur le
serveur
268
ÉVÉNEMENTS ASSOCIÉS À UNE REQUÊTE AJAX
. . . où :
ev représente l'événement ;
req représente la requête ;
options contient les paramètres passés à la requête ;
erreur est le nom de l'erreur détectée par jQuery.
Voici un peu de code pour vous aider à comprendre comment utiliser ces méthodes
événementielles et dans quel ordre elles sont exécutées :
1 < button id = " action " > Lancer la requ ê te AJAX </ button > < br / > < br / >
2 < div id = " donnees " style = " background - color : yellow " > </ div > < br / >
3 < div id = " message " > </ div >
4
5 < script src = " jquery . js " > </ script >
6 < script >
7 $ ( function () {
8 $ ( '# action ') . click ( function () {
9 $ ( '# message ') . ajaxStart ( function () {
10 $ ( this ) . html ( 'M é thode ajaxStart ex é cut ée < br > ') ;
11 }) ;
12 $ ( '# message ') . ajaxSend ( function ( ev , req , options ) {
13 $ ( this ) . append ( 'M é thode ajaxSend ex é cut ée , ') ;
14 $ ( this ) . append ( ' nom du fichier : ' + options . url + '<br
> ') ;
15 }) ;
269
CHAPITRE 18. PLUS LOIN AVEC AJAX
Lorsque cet événement est déclenché, un texte est aché dans la balise <div> #message :
1 $ ( this ) . html ( 'M é thode ajaxStart ex é cut ée < br > ') ;
270
ÉVÉNEMENTS ASSOCIÉS À UNE REQUÊTE AJAX
Figure 18.3 Cette exécution montre l'ordre dans lequel sont levés les événements en
rapport avec la requête AJAX
En résumé
Plusieurs fonctions jQuery vont vous permettre d'aller plus loin avec vos requêtes
AJAX. Vous pouvez en particulier envoyer des requêtes HTTP GET et POST au serveur
avec les fonctions $.get() et $.post(), charger et exécuter un script JavaScript avec
la fonction $.getScript() et des données JSON avec la fonction $.getJSON().
La fonction $.ajax() pourra vous être utile si vous voulez paramétrer nement vos
requêtes AJAX. Elle permet de dénir plusieurs fonctions de rappel pour réagir à
diérents événements liés à la requête.
271
CHAPITRE 18. PLUS LOIN AVEC AJAX
Figure 18.4 Le chier inexistant.htm n'a pas été trouvé, ce qui a déclenché l'évé-
nement ajaxError
Enn, vous pouvez mettre en place des méthodes de gestion événementielle pour
capturer les événements : ajaxSend(), ajaxStart(), ajaxStop(), ajaxSuccess(),
ajaxComplete() et ajaxError().
272
Chapitre 19
TP : Un tchat en jQuery
Diculté :
J e vous propose un projet ambitieux : l'écriture d'un tchat en jQuery. Si vous pensez
que vous n'y arriverez jamais, relisez les titres des chapitres que vous avez lus jusqu'ici
et prenez un peu de recul. Laissez aller votre imagination et demandez-vous ce qu'est
un programme de tchat, ce qu'il implique et ce que vous devrez mettre en place en jQuery.
Une fois que vous aurez pris ce temps de réexion, poursuivez la lecture et je vous donnerai
toutes les instructions pour que vous arriviez à écrire ce programme.
273
CHAPITRE 19. TP : UN TCHAT EN JQUERY
Figure 19.1 D'une simplicité désarmante, ce programme est également très ecace
Voici quelques remarques pour partir du bon pied :
Vous pouvez tester ce programme localement, en utilisant un serveur Apache, mais
je vous conseille de le déposer sur un serveur Web an que tous vos amis puissent
l'utiliser.
Lorsqu'un internaute envoie un message, les données du formulaire doivent être en-
voyées au programme tchat.php. Ce programme met à jour le chier ac.htm que
vous utiliserez pour rafraîchir le contenu de la zone de conversation.
Le rafraîchissement de la conversation devra se faire toutes les 4 secondes. Vous
pouvez diminuer cette période, mais le serveur sur lequel sera placé le programme
risque de ne pas apprécier si de nombreuses personnes lancent une conversation.
274
CORRECTION
Le code PHP
Ce tchat fonctionne grâce à un code PHP que je vais vous donner an que vous puissiez
tester votre application au fur et à mesure. Si vous n'y comprenez rien, ce n'est pas
très grave, l'important est que cela fonctionne. Et pour ceux qui savent développer en
PHP, n'hésitez pas à améliorer le script.
1 <? php
2 $nom = $_POST [ ' nom ']; // On r é cup è re le pseudo et on le stocke
dans une variable
3 $message = $_POST [ ' message ']; // On fait de m ê me avec le
message
4 $ligne = $nom . ' > '. $message . ' <br > '; // Le message est cr éé
5 $leFichier = file ( 'ac . htm ') ; // On lit le fichier ac . htm et on
stocke la r é ponse dans une variable ( de type tableau )
6 array_unshift ( $leFichier , $ligne ) ; // On ajoute le texte calcul
é dans la ligne pr é c é dente au d é but du tableau
7 file_put_contents ( 'ac . htm ' , $leFichier ) ; // On é crit le contenu
du tableau $leFichier dans le fichier ac . htm
8 ?>
Je crois que j'ai tout dit. Alors, c'est à vous de jouer. Progressez pas à pas. N'écrivez
pas trop d'instructions à la fois et surtout faites des tests le plus fréquemment possible
pour valider ce que vous aurez écrit.
Correction
Je vais maintenant vous donner ma correction. Je dis bien ma correction et pas la
correction. Il existe en eet plusieurs façons de résoudre le problème. Si vous êtes
partis sur une tout autre technique et si cela fonctionne, je vous félicite. Par contre, si
vous êtes partis sur une autre technique et que vous n'arrivez pas à obtenir le résultat
escompté, je suis sûr que vous trouverez dans cette correction des éléments qui vous
feront progresser jusqu'à votre solution. . .
275
CHAPITRE 19. TP : UN TCHAT EN JQUERY
9 height : 400 px ;
10 border : black 1 px solid ;
11 background - color : # efecca ;
12 overflow - x : hidden ;
13 overflow - y : scroll ;
14 padding : 5 px ;
15 margin - left : 10 px ;
16 }
17 fieldset {
18 width : 330 px ;
19 background - color : # e6e2af ;
20 border : black 1 px solid ;
21 }
22 </ style >
23 </ head >
24
276
CORRECTION
13 function afficheConversation () {
14 $ ( '# conversation ') . load ( 'ac . htm ') ;
15 $ ( '# message ') . val ( ' ') ;
16 $ ( '# message ') . focus () ;
17 }
18 setInterval ( afficheConversation , 4000) ;
19 }) ;
20 </ script >
Quoi ? C'est tout ? Ces quelques lignes vont faire fonctionner le tchat ?
Cette simple instruction est responsable de tout ce qui est aché dans la balise <div>.
Merci jQuery !
Les lignes 5 à 11 représentent la méthode de gestion événementielle des clics sur le
bouton de commande. Lorsque le bouton est cliqué, le contenu des zones de texte
d'identiants #nom et #message est stocké dans les variables nom et message :
1 var nom = $ ( '# nom ') . val () ;
2 var message = $ ( '# message ') . val () ;
L'instruction suivante utilise la fonction jQuery post() pour poster ces données au
programme tchat.php. Lorsque les données ont été envoyées, la fonction de retour
afficheConversation() est exécutée, ce qui provoque l'achage du message qui vient
d'être posté dans la zone de conversation :
1 $ . post ( ' tchat . php ' , { ' nom ': nom , ' message ': message } , function
() {
2 afficheConversation ;
277
CHAPITRE 19. TP : UN TCHAT EN JQUERY
Il ne reste plus qu'une instruction pour terminer le TP. Elle est très importante, car
c'est elle qui va exécuter à intervalles réguliers la méthode afficheConversation()
et ainsi mettre à jour la zone de conversation lorsque d'autres personnes que vous
posteront un message. Bien entendu, cette instruction fait appel à la fonction JavaScript
setInterval() en précisant le nom de la fonction à exécuter, sans parenthèses ni
guillemets, le délai entre deux exécutions étant exprimé en millisecondes :
1 setInterval ( afficheConversation , 4000) ;
278
Cinquième partie
Les plugins jQuery
279
Chapitre 20
Trouver et utiliser un plugin
Diculté :
L a bibliothèque jQuery a été écrite de telle sorte qu'il est très simple de l'étendre en
installant des modules additionnels, connus sous le nom d'extensions ou de plugins.
De nombreux sites Web se sont spécialisés dans les plugins jQuery.
Dans ce chapitre, je vais vous indiquer deux sites internet répertoriant ces fameux plugins.
Je vous montrerai enn comment les utiliser.
281
CHAPITRE 20. TROUVER ET UTILISER UN PLUGIN
Utiliser un plugin
Vous allez voir qu'utiliser un plugin est la plupart du temps un jeu d'enfant. Nous
allons utiliser le plugin Websanova Color Picker , proposé sur le site The Ultimate
jQuery List. Rendez-vous donc sur ce site, allez dans la catégorie Color Pickers
et cliquez sur Websanova Color Picker, puis sur Visit Website. Une fois sur le site
en question, téléchargez le plugin (il s'agit d'un chier compressé, choisissez donc le
format qui vous convient).
Décompressez l'archive et copiez la version minimisée des chiers JavaScript et CSS
dans le dossier dans lequel vous faites vos développements jQuery. Vous êtes maintenant
prêts à utiliser le plugin. Il ne vous reste plus qu'à consulter la documentation. Dans
notre cas, elle se trouve en ligne. La gure 20.1 vous montre à quoi elle ressemble.
Il ne reste plus qu'à faire référence au plugin en utilisant une balise <script>, au code
CSS en utilisant une balise <link> dans l'en-tête, et à appliquer les consignes données
dans la documentation. Voici un exemple d'utilisation de ce plugin :
1 <! DOCTYPE html >
2 < html >
3 < head >
4 < meta charset = " UTF -8 " >
5 < title > Websanova Color Picker </ title >
6 < link rel = " Stylesheet " type = " text / css " href = " wColorPicker
.1.2. min . css " / >
7 </ head >
8 < body >
9 < div id = " wcp1 " >
10 < input id = " wcp - input " type = " text " / > < br / >
11 </ div >
282
TROUVER ET UTILISER UN PLUGIN JQUERY
283
CHAPITRE 20. TROUVER ET UTILISER UN PLUGIN
12
13 < script src = " jquery . js " > </ script >
14 < script src = " wColorPicker .1.2. min . js " > </ script >
15 < script >
16 $ ( function () {
17 $ ( " # wcp1 " ) . wColorPicker ({
18 initColor : '# ccf ' ,
19 onSelect : function ( color ) {
20 $ ( ' body ') . css ( ' background ', color ) ;
21 },
22 onMouseover : function ( color ) {
23 $ ( '# wcp - input ') . css ( ' background ', color ) . val (
color ) ;
24 }
25 }) ;
26 }) ;
27 </ script >
28 </ body >
29 </ html >
Le code jQuery est directement tiré de la documentation du plugin. Dans cet exemple,
la couleur d'arrière-plan de la zone de texte #wcp-input est modiée lorsque la souris
se trouve au-dessus d'une des couleurs du nuancier et la couleur correspondante est
achée dans la zone de texte :
Quand l'utilisateur clique sur une des couleurs du nuancier, la couleur d'arrière-plan
de la page est mise à jour en conséquence :
Et c'est tout ?
284
QUELQUES EXEMPLES DE PLUGINS
Parseur RSS/Atom
De nombreux sites Web proposent des ux de données au format RSS et/ou Atom. En
utilisant un parseur, vous pouvez récupérer ces ux de données et les intégrer à votre
site. Je vous propose d'utiliser le plugin jFeed qui excelle dans ce domaine.
Rendez-vous sur la page de téléchargement du plugin et cliquez sur Click here to
download. Décompressez le chier zrssfeed-116 et placez les chiers example.html,
jquery.rssfeed.js et jquery.zrssfeed.css dans le dossier dans lequel vous faites
vos développements jQuery.
B
Télécharger le plugin
Code web : 555059
Nous allons maintenant parser un des ux RSS proposés par le site lemonde.fr.
Rendez-vous sur la page http://www.lemonde.fr/rss, choisissez un des ux propo-
sés, cliquez du bouton droit sur l'icône XML correspondante et sélectionnez Copier
le raccourci dans le menu contextuel, comme le montre la gure 20.3.
Ouvrez le chier example.html et modiez le ux que vous voulez parser en collant
l'adresse du ux copié précédemment. Au besoin, modiez la référence au chier jQuery
ainsi qu'au chier jquery.zrssfeed.js. Il ne vous reste plus qu'à exécuter ce chier
dans votre navigateur pour acher les sujets contenus dans le ux du site lemonde.fr.
285
CHAPITRE 20. TROUVER ET UTILISER UN PLUGIN
286
QUELQUES EXEMPLES DE PLUGINS
À la gure 20.4 par exemple, ce sont les ux À la une qui s'achent.
Validation de formulaires
Vous voulez valider un formulaire avec jQuery ? Aucun problème, si ce n'est le temps
passé à imaginer toutes les saisies possibles et à diérencier celles qui sont valides de
celles qui ne le sont pas. Une autre solution s'ore à vous : utiliser le plugin Validate .
Si vous avez choisi la première solution, retroussez vos manches, je vous souhaite bon
courage. Si vous avez choisi la deuxième solution, vous pouvez poursuivre la lecture.
Télécharger le plugin Validate et copiez les chiers nécessaires (demo > example.html
et jquery.validate.js) dans votre espace de travail. Au besoin, modiez le chier
example.html an que les références aux chiers externes soient bonnes.
B
Télécharger le plugin
Code web : 113223
Pour utiliser le plugin Validate , il sut d'exécuter la méthode validate() lorsque
le DOM est disponible :
1 < script >
2 $ ( document ). ready ( function () {
3 $ ( " # commentForm " ) . validate () ;
4 }) ;
5 </ script >
287
CHAPITRE 20. TROUVER ET UTILISER UN PLUGIN
Ce code signie que le champ est obligatoire et doit contenir une adresse e-mail. Plutôt
facile à mettre en place, non ?
La gure 20.5 est un exemple d'exécution du script.
Figure 20.5 Des messages d'erreur sont achés sous les zones de texte lorsque les
informations entrées ne sont pas valides
Les messages d'erreur sont achés en anglais, mais peut-être les voudriez-vous en fran-
çais. Pour cela, vous devez franciser le chier jquery.validate.js. Tous les messages
d'erreur sont regroupés entre les lignes 268 et 284. À vous de les modier comme vous
l'entendez. Vous ne devriez avoir aucun mal à adapter les chiers example.html et
jquery.validate.js pour valider vos propres formulaires, avec des messages d'erreur
en français s'il vous plaît !
288
QUELQUES EXEMPLES DE PLUGINS
Figure 20.6 Un menu déroulant en quelques lignes de code HTML avec le plugin
Simple jQuery Dropdowns
B
Télécharger le plugin
Code web : 139335
Voyons ce qui se cache dans cette page. Le plugin utilisé est jquery.dropdownPlain.js.
Le simple fait d'exécuter ce script vous dédouane de tout autre code jQuery ! Pour
construire votre menu, il vous sura de dénir une liste <ul><li></li></ul> à un ou
plusieurs niveaux. Examinons les premiers éléments de la liste dénie dans le chier
index.html :
1 < ul class = " dropdown " >
2 <li > < a href = " # " > For Facilities </ a >
3 < ul class = " sub_menu " >
4 <li > < a href = " # " > Artificial Turf </ a > </ li >
5 <li >
6 <a href = " # " > Batting Cages </ a >
7 <ul >
8 <li > < a href = " # " > Indoor </ a > </ li >
9 <li > < a href = " # " > Outdoor </ a > </ li >
10 </ul >
11 </ li >
12 <li > < a href = " # " > Benches & amp ; Bleachers </ a > </ li >
13 <li > < a href = " # " > Communication Devices </ a > </ li >
14 <li > < a href = " # " > Dugouts </ a > </ li >
15 <li > < a href = " # " > Fencing & amp ; Windscreen </ a > </ li >
16 etc .
La première ligne crée une liste de classe dropdown. Cette classe correspond aux com-
mandes principales du menu. La balise <li> suivante dénit le titre du premier menu.
Vient ensuite une balise <ul> de classe sub_menu. Cette balise contient toutes les com-
mandes attachées au premier menu. Pour créer des commandes de menu secondaires,
289
CHAPITRE 20. TROUVER ET UTILISER UN PLUGIN
il sut d'imbriquer une autre liste <ul> composée d'autant de balises <li> que de
commandes de menu secondaires. Par exemple, la commande Batting Cages donne
accès aux commandes de menu secondaires Indoor et Outdoor . Rien de plus
compliqué !
Si vous devez mettre en place un menu sur un de vos sites Web, ce plugin devrait
vous faciliter grandement la tâche. Pensez simplement à insérer les chiers style.css
et jquery.dropdownPlain.js dans les dossiers css et js de votre site (ou d'adapter
selon vos besoins), et le tour sera joué !
Cartographie
Que diriez-vous d'acher sur votre site Web une carte géographique centrée sur un
point particulier ? C'est ce que je vous propose de faire avec le plugin gMap , qui
interface le système de cartographie Google Maps. Rendez-vous sur la page de télé-
chargement du plugin grâce au code web suivant et téléchargez la dernière version
compressée du plugin.
B
Télécharger le plugin
Code web : 674896
Voyons comment acher une carte du monde. Créez un nouveau document HTML et
insérez une balise <div> dans le corps du document. Donnez à cette balise la dimension
que vous voulez lui voir occuper dans la page et aectez la valeur hidden à son attribut
overflow :
1 < div id = " map1 " style = " width : 800 px ; height : 600 px ; border : 1 px
solid #777; overflow : hidden ; " > </ div >
Pour accéder à toute la puissance de Google Maps, utilisez trois balises <script>
pour faire référence à la bibliothèque jQuery, à l'API de Google Maps et au plugin
jquery.gmap-1.1.0-min.js :
1 < script type = " text / javascript " src = " jquery . js " > </ script >
2 < script type = " text / javascript " src = " http :// maps . google . com / maps
? file = api & amp ; v =2& amp ; sensor = false & amp ; key = ABQIAA [...]
tpz0ZCeuw & amp ; hl = fr " > </ script >
3 < script type = " text / javascript " src = " jquery . gmap -1.1.0 - min . js "
> </ script >
Pour acher la carte du monde dans la balise <div id="map1">, il vous sut de lui
appliquer la méthode gMap() dès que le DOM est disponible :
1 < script >
2 $ ( function () {
3 $ ( '# map1 ') . gMap () ;
4 }) ;
5 </ script >
290
QUELQUES EXEMPLES DE PLUGINS
291
CHAPITRE 20. TROUVER ET UTILISER UN PLUGIN
Pour avoir la liste complète des paramètres qui peuvent être passés à la
méthode gMap(), consultez la documentation en ligne.
B
Consulter la documentation
Code web : 645664
Pour connaître la latitude et la longitude d'une ville, allez sur le site de Google
Maps,
tapez le nom de la ville dans le champ de recherche et appuyez sur la touche Entrée
de votre clavier. La carte se centre sur la ville avec une icône. Faites un clic droit sur
cette icône et choisissez Plus d'infos sur cet endroit. Le champ de recherche est
alors mis automatiquement à jour avec la latitude et la longitude.
Pour terminer, voici un exemple concret d'utilisation. Nous allons acher une carte
centrée sur la ville d'Albi, située aux coordonnées (43.92, 2.14). Le texte Albi sera
aché dans une bulle, le facteur de zoom sera égal à 10 et la carte sera de type vue
en relief . Voici le code à utiliser :
1 $ ( " # map " ) . gMap ({ markers : [{
2 latitude : 43.92 ,
3 longitude : 2.14 ,
4 html : " Albi " ,
5 popup : true }] ,
6 maptype : G_SATELLITE_MAP ,
7 zoom : 10 }) ;
En résumé
Il est possible d'élargir les possibilités de jQuery en utilisant des plugins. Il en existe
beaucoup et ils vous rendront de grands services.
Pour faire référence à un plugin, il sut de l'appeler en utilisant une balise <script>.
Une fois le plugin référencé, vous pouvez l'appeler comme n'importe quelle autre
méthode jQuery. Par exemple : $('#monId').monPlugin(10, 'rouge').
292
Chapitre 21
jQuery UI
Diculté :
S i jQuery ore de très nombreuses méthodes pour gérer le DOM, les propriétés CSS,
AJAX et la gestion événementielle, jQuery UI le complète parfaitement en orant des
méthodes additionnelles appliquées à la réalisation de l'interface utilisateur ( UI ,
dans jQuery UI , signie user interface , soit interface utilisateur en français).
jQuery UI est en quelque sorte un vaste assemblage de plugins accessibles à travers un seul
chier JavaScript.
293
CHAPITRE 21. JQUERY UI
10 < span > D é placez les images et le div comme vous l ' entendez </ span
> < br / > < br / >
294
DÉPLACER ET REDIMENSIONNER DES ÉLÉMENTS
Après avoir fait référence aux bibliothèques jQuery et jQuery UI, il sut d'une ins-
truction jQuery pour rendre mobiles toutes les balises <img> et <div> :
1 $ ( function () {
2 $ ( 'img , div ') . draggable () ;
3 }) ;
La gure 21.1 vous montre un exemple d'exécution de ce code, avant et après le dépla-
cement des images et de la balise <div>.
Figure 21.1 Les trois images et la balise <div> peuvent être déplacées où bon vous
semble
Redimensionnement
La méthode resizable() permet de redimensionner un objet quelconque. Bien qu'elle
soit utilisable sur tous les objets du DOM, vous l'utiliserez surtout pour permettre
à l'utilisateur de redimensionner des images. Une fois encore, jQuery UI brille par
sa simplicité : pour rendre un élément redimensionnable, appliquez-lui simplement la
méthode resizable().
1 < link rel = " stylesheet " href = " http :// ajax . googleapis . com / ajax /
libs / jqueryui /1.8.12/ themes / base / jquery - ui . css " >
2
3 < img id = " redim " src = " visage . jpg " >
295
CHAPITRE 21. JQUERY UI
5 < script src = " http :// code . jquery . com / jquery . min . js " > </ script >
6 < script src = " http :// ajax . googleapis . com / ajax / libs / jqueryui /1.8/
jquery - ui . min . js " > </ script >
7 < script >
8 $ ( function () {
9 $ ( " # redim " ) . resizable () ;
10 }) ;
11 </ script >
Figure 21.2 L'image peut être redimensionnée en agissant sur les bords droit et
inférieur, et sur l'angle inférieur droit
Un accordéon
Imaginez un empilement de balises <div> dont le contenu d'une seule est visible à la fois
et vous aurez une idée assez précise de ce que peut produire la méthode accordion().
Pour mettre en ÷uvre cette méthode, commencez par dénir une balise <div> conteneur
composée de plusieurs balises de titre <h3> associées à des balises <div> dans lesquelles
vous placerez le contenu à acher. Regardez le code suivant, ce devrait être beaucoup
plus clair.
1 < div id = " accordeon " >
2 <h3 > < a href = " # " > Titre du bloc 1 </a > </ h3 >
3 <div > Contenu du bloc 1 </ div >
296
SÉLECTION DE DATE
4 <h3 > < a href = " # " > Titre du bloc 2 </a > </ h3 >
5 <div > Contenu du bloc 2 </ div >
6 etc .
7 </ div >
Faites référence à un chier CSS jquery-ui.css sur le CDN Google, puis exécutez la
méthode jQuery accordion() sur le <div> conteneur, comme dans le code suivant.
1 < html >
2 $ ( document ). ready ( function () {
3 $ ( " # accordeon " ) . accordion () ;
4 }) ;
5 </ html >
B
Essayer ce code
Code web : 871592
La gure 21.3 vous montre le résultat.
Sélection de date
La méthode datepicker() transforme une simple zone de texte <input type="text">
en un calendrier dans lequel l'utilisateur peut choisir une date. La date choisie est alors
297
CHAPITRE 21. JQUERY UI
copiée dans la zone de texte. Pour utiliser cette méthode, il sut de l'appliquer à une
zone de texte quelconque, après avoir fait référence à un thème et aux bibliothèques
jQuery et jQuery UI :
1 < link rel = " stylesheet " href = " http :// ajax . googleapis . com / ajax /
libs / jqueryui /1.8.12/ themes / base / jquery - ui . css " >
2
3 Date < input type = " text " id = " datepicker " >
4
5 < script src = " http :// code . jquery . com / jquery . min . js " > </ script >
6 < script src = " http :// ajax . googleapis . com / ajax / libs / jqueryui /1.8/
jquery - ui . min . js " > </ script >
7
298
DES BOÎTES DE DIALOGUE
8 dayNames : [ ' Dimanche ', ' Lundi ', ' Mardi ',' Mercredi ', ' Jeudi ', '
Vendredi ', ' Samedi '] ,
9 dayNamesShort : [ ' Dim . ' ,' Lun . ', ' Mar . ', ' Mer . ' ,' Jeu . ', ' Ven . ' ,'
Sam . '] ,
10 dayNamesMin : [ 'D ', 'L ', 'M ', 'M ','J ' ,'V ' ,'S '] ,
11 weekHeader : ' Sem . ' ,
12 dateFormat : 'dd / mm / yy ' ,
13 firstDay : 1 ,
14 isRTL : false ,
15 showMonthAfterYear : false ,
16 yearSuffix : ' '};
Puis indiquer que vous voulez utiliser ces données dans la méthode datepicker() :
1 $ . datepicker . setDefaults ( $ . datepicker . regional [ 'fr ' ]) ;
Ces instructions doivent être placées juste au-dessus de l'appel à la méthode datepicker().
Vous voilà avec un calendrier en français !
Si la boîte de dialogue doit être ouverte et fermée plusieurs fois, vous utiliserez d'autres
instructions :
1 $ ( ' sel ') . dialog ({ autoOpen : false ; }) ; // Cr é e une instance de
la bo î te de dialogue sans l ' ouvrir
2 $ ( ' sel ') . dialog ( ' open ') ; // Ouvre la bo î te de dialogue
3 $ ( ' sel ') . dialog ( ' close ') ; // Ferme la bo î te de dialogue
Voici quelques autres options utilisables dans les paramètres de la méthode dialog() :
Voici un exemple basique dans lequel une balise <div> est transformée en une boîte de
dialogue non modale, centrée et dont les dimensions sont celles par défaut :
1 < link rel = " stylesheet " href = " http :// ajax . googleapis . com / ajax /
libs / jqueryui /1.8.12/ themes / base / jquery - ui . css " >
2
299
CHAPITRE 21. JQUERY UI
Options Signication
height et width Hauteur et largeur de la boîte de dialogue à l'ouverture.
modal Initialisé à true, rend la boîte de dialogue modale (c'est-
à-dire interdit l'accès à la page). La valeur par défaut est
false.
position Position de la boîte de dialogue sur la page (elle est centrée
par défaut).
zindex Z-index de la boîte de dialogue (1000 par défaut).
buttons Un ou plusieurs boutons achés dans la boîte de dialogue.
10 < script src = " http :// code . jquery . com / jquery . min . js " > </ script >
11 < script src = " http :// ajax . googleapis . com / ajax / libs / jqueryui /1.8/
jquery - ui . min . js " > </ script >
12 < script >
13 $ ( function () {
14 $ ( " # dialog " ) . dialog () ;
15 }) ;
16 </ script >
300
AFFICHER DES ONGLETS
La gure 21.6 montre le résultat obtenu. Comme vous le voyez, la page est grisée et
inaccessible. Lorsque l'utilisateur clique sur le bouton Oui, l'arrière-plan de la page
devient jaune, puis la boîte de dialogue se ferme. Lorsqu'il clique sur le bouton Non,
l'arrière-plan reste inchangé et la boîte de dialogue se ferme. Ce qu'il faut surtout
retenir, c'est que vous pouvez dénir des fonctions.
301
CHAPITRE 21. JQUERY UI
Une fois ces instructions mises en place, appliquez la méthode tabs() à la balise <div>
parent (ici #onglets) :
1 < script >
2 $ ( function () {
3 $ ( '# onglets ') . tabs () ;
4 }) ;
5 </ script >
jQuery UI se charge alors du reste. Regardez la gure 21.7 pour en être convaincus.
Le contenu des diérents onglets peut également être obtenu en AJAX. Pour cela, préci-
sez l'adresse URL des pages à acher dans l'attribut href des diérents onglets. Ici par
exemple, le premier onglet est obtenu à partir de la balise <div> enfant #onglet-1, le
deuxième à partir de la page distante page2.htm et le troisième à partir du programme
PHP page3.php :
1 <ul >
2 <li > < a href = " # onglet -1 " > Titre onglet 1 </a > </ li >
302
ANIMATION : UNE IMPRESSION DE DÉJÀ-VU
Figure 21.7 La dénition d'onglets est un vrai jeu d'enfant avec jQuery UI
3 <li > < a href = " http :// www . site . com / page2 . htm " > Titre onglet 2 </a
> </ li >
4 <li > < a href = " http :// www . site . com / page3 . php " > Titre onglet 3 </
a > </ li >
5 </ ul >
. . . où :
effet est l'un des eets suivants : blind, clip, drop, explode, fold, puff, slide,
scale, size et pulsate.
303
CHAPITRE 21. JQUERY UI
18 < div id = " contenu " style = " width : 400 px ; " >
19 <h3 > Un titre </ h3 >
20 At vero eos et accusamus et iusto odio dignissimos ducimus
qui blanditiis praesentium voluptatum deleniti atque
corrupti quos dolores et quas molestias excepturi sint
occaecati cupiditate non provident , similique sunt in
culpa qui officia deserunt mollitia animi , id est
laborum et dolorum fuga .
21 </ div >
22
23 < script src = " http :// code . jquery . com / jquery . min . js " > </ script >
24 < script src = " http :// ajax . googleapis . com / ajax / libs / jqueryui
/1.8/ jquery - ui . min . js " > </ script >
25 < script >
26 $ ( function () {
27 $ ( '# contenu ') . show ( ' explode ') ;
28 }) ;
29 </ script >
B
Essayer ce code
Code web : 802404
Le code CSS n'est là que pour donner un peu de consistance à la balise <div> #contenu.
Cette dernière contient un titre <h3> et un peu de texte. Le code jQuery applique l'eet
304
ANIMATION DE COULEURS
Animation de couleurs
Dans la troisième partie du cours, vous avez appris à animer des éléments avec la
méthode animate(). jQuery UI étend cette méthode : vous pourrez désormais animer la
couleur des éléments ! Les propriétés sur lesquelles vous pouvez agir sont les suivantes :
backgroundColor
borderBottomColor
borderLeftColor
borderRightColor
borderTopColor
color
outlineColor
La syntaxe de la méthode animate() ne change pas :
1 $ ( ' sel ') . animate ({ prop1 : val1 , prop2 : val2 , prop3 : val3 , etc .
} , dur ée , mod è le , function () {
2 // Une ou plusieurs instructions
3 }) ;
. . . où :
sel est un sélecteur jQuery ;
prop1, prop2, prop3 sont des propriétés CSS et val1, val2, val3 les valeurs asso-
ciées ;
durée est la durée de l'animation ;
modèle est le modèle de progression de l'animation ;
function() contient une ou plusieurs instructions qui seront exécutées lorsque l'ani-
mation sera terminée.
Pour illustrer l'animation de couleurs, nous allons modier progressivement la couleur
d'arrière-plan et la couleur du texte dans une balise <div>, tout en combinant ces
animations avec une modication de la largeur et de la position horizontale de la
balise.
305
CHAPITRE 21. JQUERY UI
24 < script src = " http :// code . jquery . com / jquery . min . js " > </ script >
25 < script src = " http :// ajax . googleapis . com / ajax / libs / jqueryui /1.8/
jquery - ui . min . js " > </ script >
26 < script >
27 $ ( function () {
28 $ ( '# contenu ') . toggle (
29 function () {
30 $ ( '# contenu ') . animate ({
31 backgroundColor : '# fff ' ,
32 color : ' red ',
33 left : ' +=200 ' ,
34 width : 500
35 } , 1000 ) ;
36 },
37 function () {
38 $ ( '# contenu ') . animate ({
39 backgroundColor : '# aaeae1 ',
40 color : ' black ',
41 left : ' -=200 ' ,
42 width : 100
43 } , 1000 ) ;
44 }
306
MODÈLES DE PROGRESSION
45 );
46 }) ;
47 </ script >
B
Essayer ce code
Code web : 236366
Le code CSS dénit les caractéristiques de la balise <div> et du titre <h3> qui y est
inclus. La propriété position est initialisée avec la valeur relative pour permettre le
déplacement de la balise.
Le code jQuery applique la méthode toggle() à la balise <div id="contenu">. Lorsque
l'utilisateur clique sur cette balise, les deux fonctions dénies dans les paramètres de
la méthode toggle() sont exécutées alternativement.
La première fonction anime la couleur d'arrière-plan, la couleur des caractères, la posi-
tion horizontale (+=200) et la largeur (500) de la balise <div>. La deuxième fonction
redonne à la balise ses caractéristiques à l'ouverture de la page. Pour cela, elle anime
la couleur d'arrière-plan, la couleur des caractères, la position horizontale (-=200) et
la largeur (100) de la balise <div>.
Modèles de progression
Avec jQuery, vous n'avez accès qu'à deux modèles de progression pour vos animations :
swing et linear. La bibliothèque jQuery UI propose un bien plus grand nombre de
modèles de progression, listés dans le tableau suivant.
Après avoir fait référence à la bibliothèque jQuery UI, vous pouvez les utiliser dans
toutes les méthodes d'animation : show(), hide(), fadeIn(), fadeOut(), fadeTo(),
slideUp(), slideDown() et animate(). Pour avoir une idée de l'eet des modèles de
progression, rendez-vous sur la page dédiée (voir gure 21.8) et cliquez sur les vignettes.
B
Voir les diérents modèles
Code web : 103675
Voici un court exemple qui vous montre comment appliquer les modèles de progression
de jQuery UI sur une image :
1 < button id = " easeOutElastic " > Effet easeOutElastic </ button >
2 < button id = " easeInOutBack " > Effet easeInOutBack </ button > < br / >
3 < img src = " balle . png " style = " position : relative ; " >
307
CHAPITRE 21. JQUERY UI
308
MODÈLES DE PROGRESSION
5 < script src = " http :// code . jquery . com / jquery . min . js " > </ script >
6 < script src = " http :// ajax . googleapis . com / ajax / libs / jqueryui /1.8/
jquery - ui . min . js " ></ script >
7 < script >
8 $ ( function () {
9 $ ( '# easeOutElastic ') . click ( function () {
10 $ ( ' img ') . css ( ' left ', '0 px ') ;
11 $ ( ' img ') . animate ({ left : ' +=200 '} , 3000 , ' easeOutElastic '
);
12 }) ;
13 $ ( '# easeInOutBack ') . click ( function () {
14 $ ( ' img ') . css ( ' left ', '0 px ') ;
15 $ ( ' img ') . animate ({ left : ' +=200 '} , 3000 , ' easeInOutBack '
);
16 }) ;
17 }) ;
18 </ script >
B
Essayer ce code
Code web : 309486
Lorsque le premier bouton est cliqué, l'image est déplacée vers la droite de 200 pixels
en utilisant un modèle de progression easeOutElastic. Le deuxième bouton fait de
même, mais en utilisant le modèle de progression easeInOutBack.
En résumé
jQuery UI est le complément idéal de jQuery. Les très nombreuses méthodes propo-
sées dans cette bibliothèque vous permettront d'améliorer l'aspect et les possibilités
de vos pages.
Pour accéder à la totalité des méthodes contenues dans la bibliothèque jQuery UI,
il sut d'ajouter une balise <script> pour y faire référence.
Pour améliorer le rendu, la mise en forme des éléments manipulés par jQuery UI
peut s'appuyer sur des thèmes CSS accessibles sur un CDN.
Les méthodes show(), hide() et toggle() de la bibliothèque jQuery UI donnent
accès à de nombreux eets supplémentaires.
jQuery UI propose un très grand nombre de modèles de progression, utilisables dans
toutes les méthodes d'animation : show(), hide(), fadeIn(), fadeOut(), fadeTo(),
slideUp(), slideDown() et animate().
Avec jQuery UI, la méthode animate() de jQuery est étendue. Elle peut être utilisée
pour animer la couleur des éléments suivants : backgroundColor, borderBottomColor,
borderLeftColor, borderRightColor, borderTopColor, color et outlineColor.
309
CHAPITRE 21. JQUERY UI
310
Chapitre 22
Créer un plugin
Diculté :
V ous en savez maintenant bien assez pour apporter votre pierre à l'édice jQuery
en créant vos propres plugins. Surtout, ne sautez pas ce chapitre en vous disant que
l'écriture de plugins n'est pas faite pour vous car cela doit être horriblement compliqué.
Vous allez bientôt être convaincus du contraire !
311
CHAPITRE 22. CRÉER UN PLUGIN
Si vous sauvegardez ce code dans un chier d'extension .js et que vous y faites référence
dans une page Web à l'aide d'une balise <script>, vous pouvez directement l'utiliser
en faisant quelque chose comme ceci :
1 $ ( 'p ') . gis (5 , ' abc ' , 10) ;
Cette instruction applique la méthode gis() à toutes les balises <p> du document en
lui transmettant les trois paramètres spéciés entre les parenthèses. Bravo, vous venez
de créer votre premier plugin jQuery !
C'est tout ? Les autres plugins sont-ils vraiment construits sur ce modèle ?
Eh bien. . . oui ! À quelques petits détails près qui vont être abordés dans la suite.
Une fois cette instruction exécutée, il est possible d'utiliser le signe $ en accord avec
l'autre bibliothèque. Voici un exemple de code :
1 < script src = " uneBibliothequeJavaScript . js " > </ script >
2 < script src = " jquery . js " > </ script >
3 < script >
4 $ . noConflict () ;
5 // Ici , vous pouvez ins é rer une ou plusieurs instructions
6 // Qui utilisent le signe $ en accord avec les sp é cifications
312
LE SQUELETTE D'UN PLUGIN
En utilisant une instruction $.noConflict() dans vos plugins, vous les rendez utili-
sables avec d'autres bibliothèques JavaScript. C'est donc une bonne pratique à mettre
en ÷uvre systématiquement dans vos plugins.
Est-ce que cela veut dire qu'après avoir exécuté l'instruction $.noConflict()
dans un plugin je ne pourrai plus utiliser d'instructions jQuery ?
Bien sûr que non ! Cela signie simplement qu'au lieu d'utiliser le signe $ vous utiliserez
le mot jQuery . Cette situation est parfaitement tolérable si vous développez de
petits plugins qui ne dépassent pas une centaine de lignes de code. Mais elle devient
vite insupportable au-delà.
1 ( function ( $) {
2 // Entrez ici le code de votre plugin jQuery
3 }) ( jQuery ) ;
Prenez quelques instants pour examiner cette fonction. La syntaxe utilisée est quelque
peu inhabituelle, je vous l'accorde. Mais en y regardant d'un peu plus près, on comprend
sans peine le mécanisme : la fonction anonyme comporte un paramètre. Lors de son
appel, la valeur jQuery lui est transmise. Étant donné que, dans la dénition de
la fonction, le paramètre a pour nom $ , toutes les instructions situées à l'intérieur
de la fonction remplaceront automatiquement le signe $ par jQuery . Ce qui est
exactement l'eet recherché. Il est donc possible de continuer à utiliser l'alias $
dans le plugin si vous incluez son code à l'intérieur de la fonction anonyme. Dans notre
cas, le code devient le suivant :
1 ( function ( $) {
2 $ . fn . gis = function ( param è tres )
3 {
4 ...
5 };
6 }) ( jQuery ) ;
313
CHAPITRE 22. CRÉER UN PLUGIN
Cela vient du fait que la méthode css() retourne l'objet qui l'a appelée. Cette remarque
s'applique également à la plupart des autres méthodes jQuery. Lorsque vous écrivez
un plugin, vous devez respecter cette pratique en retournant l'objet sur lequel a été
appliquée votre méthode. Ceci est extrêmement simple, puisqu'une instruction sut :
1 return this ;
314
UN PREMIER PLUGIN
Un premier plugin
Maintenant, vous savez comment sont construits les plugins jQuery. Il est temps de
passer à la pratique en écrivant votre premier plugin. Pour commencer en douceur, je
vous propose de créer un plugin qui aecte les attributs gras, italique et souligné au
contenu des balises sur lesquelles il est appliqué. C'est le fameux plugin gis dont je
vous parle depuis le début du chapitre.
Ce plugin est très simple : il ne demande aucun paramètre et se contente d'appliquer
trois propriétés CSS au contenu des balises concernées. Voici le code utilisé :
1 ( function ( $) {
2 $ . fn . gis = function ()
3 {
4 this . each ( function () {
5 $ ( this ) . wrap ( ' <b > <i > <u > </u > </i > </b > ') ;
6 }) ;
7 return this ;
8 };
9 }) ( jQuery ) ;
315
CHAPITRE 22. CRÉER UN PLUGIN
11 <p > Ce texte devrait rester inchang é </p > < br / >
12 < button id = " action " > Cliquez ici pour utiliser le plugin gis </
button >
13
14 < script src = " http :// code . jquery . com / jquery . min . js " > </ script >
15 < script src = " gis . js " > </ script >
16 < script >
17 $ ( function () {
18 $ ( '# action ') . click ( function () {
19 $ ( '. grasItaliqueSouligne ') . gis () ;
20 }) ;
21 }) ;
22 </ script >
23 </ body >
24 </ html >
Je dois bien l'avouer, ce plugin n'est pas très intéressant. Que diriez-vous de quelque
chose de plus poussé ?
316
UN PLUGIN PLUS AMBITIEUX
Dans le code jQuery, l'accès aux valeurs passées au plugin se fera donc via les variables
amplX et amplY.
La première instruction qui suit la boucle this.each() dénit les variables qui seront
utilisées dans le plugin :
1 var x , y , affX , affY , initX , initY ;
317
CHAPITRE 22. CRÉER UN PLUGIN
La boucle for qui suit fait le gros du traitement. Elle fait varier l'abscisse entre π2 et
4 π par pas de 0,2 (rien ne vous empêche d'expérimenter d'autres valeurs pour obtenir
un rebond un peu diérent) :
1 for ( x = ( Math . PI ) /2; x < (4* Math . PI ) ; x = x +.2)
Les coordonnées d'achage sont obtenues en ajoutant les coordonnées de départ (initX
et initY) aux coordonnées calculées (x et y) pondérées par les paramètres fournis au
plugin (amplX et amplY) :
1 affX = initX + x * amplX ;
2 affY = initY - y * amplY ;
L'élément en cours de traitement est alors déplacé avec la méthode animate(). Les
propriétés left et top sont modiées pour atteindre (respectivement) les coordonnées
affX et affY. La durée du déplacement est xée à 10 millisecondes. Ici encore, rien ne
vous empêche d'expérimenter d'autres durées de déplacement :
1 $ ( this ) . animate ({ left : affX , top : affY } ,10) ;
318
UN PLUGIN PLUS AMBITIEUX
14 < button id = " action " > Cliquez ici pour utiliser le plugin
rebond </ button >
15
16 < script src = " jquery . js " > </ script >
17 < script src = " rebond . js " > </ script >
18 < script >
19 $ ( function () {
20 $ ( '# action ') . click ( function () {
21 $ ( ' img ') . rebond (10 , 100) ;
22 }) ;
23 }) ;
24 </ script >
25 </ body >
26 </ html >
B
Essayer ce code
Code web : 639784
Ce document contient une image d'identiant #bon et un bouton d'identiant #action.
Quelques instructions CSS positionnent l'image de façon absolue, aux coordonnées
(100, 100). Lorsque le bouton #action est cliqué, le plugin rebond est appelé en
lui transmettant les paramètres 10 et 100 :
1 $ ( '# action ') . click ( function () {
2 $ ( ' img ') . rebond (10 , 100) ;
3 }) ;
Vous en savez maintenant assez pour créer des plugins qui faciliteront vos développe-
ments et, pourquoi pas, ceux de la communauté des programmeurs jQuery. Si vous
voulez mettre vos créations à la disposition des autres développeurs jQuery, soignez
particulièrement la documentation. Montrez comment utiliser votre plugin, indiquez
comment fonctionnent ses paramètres et donnez plusieurs exemples d'appel.
En résumé
Écrire un plugin pour jQuery n'est pas bien dicile : il sut d'utiliser le bon sque-
lette et d'y insérer les instructions jQuery et JavaScript qui réaliseront les actions
souhaitées.
La fonction anonyme vous permet de continuer à utiliser l'alias $ de jQuery dans
le code du plugin. Y compris si la page qui appelle le plugin fait référence à une autre
bibliothèque JavaScript qui utilise le signe $ en interne.
319
CHAPITRE 22. CRÉER UN PLUGIN
320
Sixième partie
Annexe
321
Chapitre 23
Déboguer le code jQuery
Diculté :
L orsqu'une page Web ne contient que quelques instructions jQuery, la phase de dé-
boguage est généralement réduite à sa plus simple expression : vous achez la page
et vous constatez que tout fonctionne. Si vous écrivez des programmes plus volumi-
neux, contenant plusieurs centaines d'instructions jQuery, il en va parfois tout autrement.
Ce chapitre va vous montrer plusieurs techniques et outils pour débusquer les bogues qui
pourraient s'être glissés dans votre code.
323
CHAPITRE 23. DÉBOGUER LE CODE JQUERY
Figure 23.1 La valeur des variables x et y est achée dans une boîte de message
Si votre code n'atteint jamais une instruction donnée, vous pouvez utiliser la fonction
alert() pour savoir quelle est la dernière instruction exécutée :
1 alert ( ' pass é ici : 01 ') ;
2 // Une ou plusieurs instructions
3 alert ( ' pass é ici : 02 ') ;
4 // Une ou plusieurs instructions
5 alert ( ' pass é ici : 03 ') ;
6 // Une ou plusieurs instructions
7 etc .
En déplaçant ces instructions dans votre code, vous pouvez assez rapidement savoir
quelle instruction est fautive.
Try et catch
Lorsque vous mettez au point un code particulièrement sensible , c'est-à-dire que
vous soupçonnez d'être à l'origine de bogues, vous pouvez le placer dans une structure
try ... catch :
1 try
2 {
3 // Instructions sensibles
4 }
5 catch ( err )
6 {
7 // Gestion des erreurs
8 }
324
CAPTURER TOUTES LES ERREURS
Un petit exemple va vous montrer comment utiliser ces instructions. Dans le code
suivant, la fonction alort() ne fait pas partie du langage JavaScript et n'est pas une
méthode jQuery. Étant donné que l'instruction mise en cause a été placée sous la
surveillance d'un try, les instructions qui suivent le mot catch vont être exécutées.
1 var message = ' ';
2 try
3 {
4 alort ( 'un message ') ;
5 }
6 catch ( err )
7 {
8 message = ' Une erreur s \' est produite .\ n \ n ';
9 message += ' Description : ' + err . message + '\ n \ n ';
10 message += ' Cliquez sur OK pour poursuivre . ';
11 alert ( message )
12 }
Dans cet exemple, comme le montre la gure 23.2, une boîte de message ache la
propriété err.message, indiquant ainsi quelle est la cause de l'erreur.
325
CHAPITRE 23. DÉBOGUER LE CODE JQUERY
Utiliser la console
La fonction JavaScript alert() est certes très pratique, mais elle a l'inconvénient d'af-
cher une boîte de message que l'utilisateur doit refermer pour poursuivre l'exécution
du code. En utilisant la console de Firefox, accessible via l'onglet Console de Fire-
bug, vous allez pouvoir acher des données comme avec la fonction alert(), mais
326
DÉBOGUER AVEC FIREBUG
Figure 23.4 Cette icône (et le menu associé) donne accès à Firebug et à ses com-
mandes principales
327
CHAPITRE 23. DÉBOGUER LE CODE JQUERY
sans interrompre l'exécution du code. Pour cela, vous utiliserez la fonction JavaScript
log().
Dans l'exemple suivant, la fonction log() est utilisée pour connaître les diérentes
valeurs calculées dans la variable y :
1 for ( x = ( Math . PI ) /2; x < (4* Math . PI ) ; x = x +.2)
2 {
3 y = ( Math . abs ( Math . sin ( x ) ) ) / x ;
4 window . console . log ( 'y = ' + y ) ;
5 ...
6 }
Figure 23.5 Les diérentes valeurs ont été achées dans la console
328
DÉBOGUER AVEC FIREBUG
désactivé, cliquez sur la èche à droite de l'icône Firebug et sélectionnez Activer tous
les panneaux dans le menu. Le code JavaScript apparaît dans la partie gauche du volet
de Firebug. Cliquez sur un numéro de ligne pour dénir un point d'arrêt. L'exécution
se poursuit jusqu'à cette ligne, puis le programme se met en pause. Plusieurs informa-
tions apparaissent dans la partie droite du volet de Firebug. Diérentes informations
s'achent, à vous maintenant de voir si tout est correct.
Figure 23.6 Pour connaître la valeur d'une variable ou d'une propriété, pointez-la
dans le code
329
CHAPITRE 23. DÉBOGUER LE CODE JQUERY
Raccourci
Fonction
F8
Continuer
Maj + F8 Exécuter à nouveau jusqu'au point d'arrêt
F10 Pas à pas
F11 Pas à pas approfondi
Ctrl + L Aller à la ligne spéciée
Pour avoir un aperçu global de tous les raccourcis clavier utilisables dans Firebug,
rendez-vous sur la page dédiée grâce au code web suivant.
B
Tous les raccourcis
Code web : 499762
330
Index
A concaténation . . . . . . . . . . . . . . . . . . . . . . . . . 47
AJAX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5, 248 :contains . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
ajax() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266 contenu
alias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 déplacer . . . . . . . . . . . . . . . . . . . . . . . . . . 84
animation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 insérer . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
délai . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156 CSS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
le d'attente. . . . . . . . . . . . . . . . . . . . .162 propriété . . . . . . . . . . . . . . . . . . . . . . . . . 17
modèle de progression . . . . . . . . . . . 151 sélecteur. . . . . . . . . . . . . . . . . . . . . . . . . .17
opacité . . . . . . . . . . . . . . . . . . . . . . . . . . 154
personnalisée . . . . . . . . . . . . . . . . . . . . 157 D
timer . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171 dbclick() . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
Apache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249 débogage . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
apparition . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 dialog() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299
ASCII . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 disparition . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
attr() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .54 documentation . . . . . . . . . . . . . . . . . . . . . . . . . 6
attribut . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 DOM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
audio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225 disponibilité . . . . . . . . . . . . . . . . . . . . . . 22
draggable() . . . . . . . . . . . . . . . . . . . . . . . . .294
B DTD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
balise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
block . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 E
blur() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 each() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .46
:button . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 eet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
élément
C déplacer . . . . . . . . . . . . . . . . . . . . . . . . . 294
callback . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 dupliquer . . . . . . . . . . . . . . . . . . . . . . . . . 85
CDN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 entourer . . . . . . . . . . . . . . . . . . . . . . . . . . 93
chaînage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 insérer . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
change() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 redimensionner . . . . . . . . . . . . . . . . . . 295
charAt() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 remplacer . . . . . . . . . . . . . . . . . . . . . . . . 80
:checkbox . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 sélection . . . . . . . . . . . . . . . . . . . . . . . . . . 28
:checked . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 supprimer . . . . . . . . . . . . . . . . . . . . . . . . 96
click() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 :empty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .38
Client/Serveur . . . . . . . . . . . . . . . . . . . . . . . . . 4 :enabled . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
331
INDEX
:eq() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 jQuery() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
:even . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
K
F keydown() . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
fadeTo() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 keypress() . . . . . . . . . . . . . . . . . . . . . . . . . . 121
feuille de styles . . . . . . . . . . . . . . . . . . . . . . . . 17 keyup() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
Firebug . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
:first . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .38 L
:first-child . . . . . . . . . . . . . . . . . . . . . . . . 38 :last . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
:first-letter . . . . . . . . . . . . . . . . . . . . . . . 18 :last-child . . . . . . . . . . . . . . . . . . . . . . . . . . 38
:focus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .42 load() . . . . . . . . . . . . . . . . . . . . . . . . . . 130, 252
focus() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 load()/PHP. . . . . . . . . . . . . . . . . . . . . . . . .256
focusin() . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 :lt() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
focusout() . . . . . . . . . . . . . . . . . . . . . . . . . . 126
fonction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 M
fonction de rappel . . . . . . . . . . . . . . . . . . . . . 31 map() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
fondu enchaîné . . . . . . . . . . . . . . . . . . . . . . . 153 merge() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
formulaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 méthode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
modèle de progression . . . . . . . . . . . . . . . . 307
G mousedown() . . . . . . . . . . . . . . . . . . . . . . . . .116
gestion événementielle mouseenter() . . . . . . . . . . . . . . . . . . . . . . . 116
clavier . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 mouseleave() . . . . . . . . . . . . . . . . . . . . . . . 116
page. . . . . . . . . . . . . . . . . . . . . . . . . . . . .130 mousemove() . . . . . . . . . . . . . . . . . . . . . . . . .116
personnalisée . . . . . . . . . . . . . . . . . . . . 134 mouseout() . . . . . . . . . . . . . . . . . . . . . . . . . . 116
souris . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 mouseover() . . . . . . . . . . . . . . . . . . . . . . . . .116
get() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
mouseup() . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
getter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
grep() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
:gt() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
N
noConflict() . . . . . . . . . . . . . . . . . . . . . . . 312
H :not . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
:header . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 :nth-child . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
:hidden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
hide() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 O
HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 objet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
:odd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
I offset() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
:image . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .42 :only-child . . . . . . . . . . . . . . . . . . . . . . . . . . 38
inArray() . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 optimisation . . . . . . . . . . . . . . . . . . . . . . . . . . 21
inline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .17
inline-block . . . . . . . . . . . . . . . . . . . . . . . . 17 P
:input . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .42 :password . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
plugin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
J création . . . . . . . . . . . . . . . . . . . . . . . . . 311
JavaScript. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .5 utilisation . . . . . . . . . . . . . . . . . . . . . . . 282
jQuery . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 position() . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
jQuery UI. . . . . . . . . . . . . . . . . . . . . . . . . . . .293 post() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
332
INDEX
R
:radio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .42
:reset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .42
resizable() . . . . . . . . . . . . . . . . . . . . . . . . .295
resize() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
S
scroll() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
:selected . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
sélecteur
attribut . . . . . . . . . . . . . . . . . . . . . . . . . . 36
CSS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
hiérarchique . . . . . . . . . . . . . . . . . . . . . . 38
pseudo-sélecteur . . . . . . . . . . . . . . . . . . 40
setter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
show() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
slideDown() . . . . . . . . . . . . . . . . . . . . . . . . .155
slideToggle() . . . . . . . . . . . . . . . . . . . . . . 155
slideUp() . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
:submit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
T
tableau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
:text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
timer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
trigger() . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
trim() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
V
val() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
:visible . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
W
W3C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
333
Notes
Notes
Dépôt légal : octobre 2012
ISBN : 979-10-90085-25-1
Code éditeur : 979-10-90085
Imprimé en France
Mentions légales :
Conception couverture : Fan Jiyong
Illustrations chapitres : Fan Jiyong
Images des jeux jQuery : Fan Jiyong