Exercices / TP
Mise en place
Ce TP est disponible sur gitlab. Vous pouvez le cloner avec la commande suivante :
git clone https://sources.univ-jfc.fr/techno-web-2/tp-2.git
Utilisez les identifiants de votre compte universitaire pour vous connecter.
Pour sauvegarder votre travail sur votre compte Gitlab, vous devez d’abord créer une bifurcation (fork) du repo.
Cliquez ici pour créer une bifurcation.
Une fois le repo créée, vous pourrez le cloner en utilisant l’URL fournie par Gitlab (bouton bleu « Code »).
Ouvrez le dossier tp-2
dans votre éditeur de code (VSCode par exemple).
Ce projet contient un fichier index.html
.
Ouvrez le fichier index.html
dans votre navigateur (double-cliquez sur le fichier) pour voir le résultat de votre travail.
Exercice 1 : modifier un élément avec la console
Pour commencer, nous allons nous familiariser avec la modification du DOM en utilisant la console du navigateur.
Faire un clique droit sur la page et sélectionner « Inspecter » dans le menu contextuel. Cela ouvre l’inspecteur du navigateur et affiche le code HTML correspondant.
Cliquez sur l’onglet console et tapez la commande suivante :
$0;
Que contient la variable
$0
? Cliquez sur un autre élément dans l’inspecteur et de taper la commande$0
à nouveau. Que remarquez-vous ?Corrigé
Faire en sorte que
$0
pointe vers le noeud DOM<p>
qui contient le texte « Bonjour tout le monde ! ». Vous pouvez vous aider du bouton « selection » en haut à gauche de l’inspecteur (sous forme de pointeur de souris). Il vous permet de selectionner un élement directement depuis la page web.Dans la console, tapez la commande suivante pour changer le texte de l’élément sélectionné :
$0.textContent = 'Bonjour les amis !';
Changez la couleur du texte en rouge en utilisant la propriété
style
de l’élément (comme vu dans le cours).Supprimer le noeud de la page en utilisant la méthode
remove()
.
Exercice 2 : modifier un élément avec du code JavaScript
Nous allons réaliser une diapositive d’images qui changent toutes les 2 secondes.
Pour commencer, créer un fichier
script.js
, et faire en sorte qu’il soit exécuté au chargement de la page. Pour cela, il faudra ajouter un lien grâce à la balise<script>
dans le<head>
du fichierindex.html
.<script defer src="./script.js"></script>
L'attribut `defer`defer
est un attribut booléen qui indique au navigateur de différer l’exécution du script après le chargement de la page. Cela permet de garantir- que le script ne bloque pas le rendu de la page
- que les éléments du DOM sont bien chargés avant l’exécution du script
Sans cet attribut, le script est exécuté au moment où il est rencontré dans le fichier HTML, ce qui peut poser des problèmes si le script est placé dans le
<head>
.Pourquoi ?
CorrigéDans le fichier
script.js
, récuperez le l’élément DOM existant de l’image dans une variableimageNode
. Le noeud HTML est une imageimg
avec pour iddiapo
.Créez une fonction
changeImage()
qui change l’attributsrc
de l’image pour pointer vers image aléatoire.Dans la fonction, générez un id aléatoire entre 1 et 500 et utilisez cet id pour construire l’url de l’image. Par exemple, si l’id aléatoire est 3, l’url vers la nouvelle image sera
https://picsum.photos/id/3/400/400
.Changez l’attribut
src
de l’image pour pointer vers cette nouvelle url.Appelez la fonction
changeImage()
toutes les 2 secondes en utilisant la fonctionsetInterval
.setInterval(changeImage, 2000);
Exercice 3 : Modifier le style d’éléments avec du code JavaScript
Écrire un script qui cache tous les éléments avec la class hidden
par un rectangle noir (on pourra utiliser l’attribut style
pour changer la couleur de fond).
Exercice 4 : Un memory en JavaScript
Nous allons développer un petit jeu de mémoire.
Le but est de faire apparaitre 5 cartes contenant des emojis aléatoires pendant 10 secondes. Ensuite, les emojis disparaissent et on pose la question à l’utilisateur : « Sous quelle carte se trouve l’emoji X ? ».
1. Selections des emojis
Créez une fonction getRandomEmojis()
qui retourne un tableau de 5 emojis aléatoires. Pour cela vous pourrez utiliser le tableau de base suivant :
// prettier-ignore
const emojis = [ '⛔️', '❇️', '🏰', '🐺', '⚜', '😅', '🚳', '🕞', '❣', '🏬', '🛎', '🌕', '🌃', '🏡', '🎑', '🍯', '🐍', '🔕', '🐿', '💮', '😹', '↕️', '🌵', '♒️', '🚽', '🕋', '📔', '🛂', '🎒', '🐼', '♏️', '⏸', '🅰️', '🌈', '🌂', '🚣', '🎇', '❄️', '👙', '🌹', '🍸', '🛳', '🎟', '😱', '👳', '😑', '⌚️', '💛', '🆚', '🔼', '🈯️', '☀️', '😳', '♊️', '🌖', '♋️', '🚀', '🚱', '🚊', '📿', '⏫', '9️⃣', '🗾', '🏜', '🍦', '✋', '🍀', '🗿', '🙎', '✖️', '🆕', '🎮', '🔒', '💸', '👲', '🏢', '🔑', '🐶', '👪', '😻', '🌼', '👠', '🧀', '👎', '🙌', '🐻', '👯', '😺', '😈', '💴', '🎾', '🚙', '❤️', '♑️', '🌲'];
Cette fonction peut être implémentée de la manière suivante :
- Créer un tableau vide
randomEmojis
- Tant que la longueur de
randomEmojis
est inférieure à 5 :- Générer un index aléatoire entre 0 et la longueur du tableau
emojis
- Récupérer l’emoji correspondant à cet index
- Si l’emoji n’est pas déjà dans
randomEmojis
, l’ajouter
- Générer un index aléatoire entre 0 et la longueur du tableau
- Une fois que
randomEmojis
contient 5 emojis, retourner le tableau
Testez cette fonction en l’appelant avec console.log(getRandomEmojis())
, et vérifiez que 5 emojis différents sont affichés dans la console du navigateur.
2. Affichage des emojis
Creer une fonction displayCards(emojis)
qui prend en paramètre un tableau d’emojis et qui les affiche dans le navigateur, en les ajoutant à la liste ordonnée (ol
) avec l’id emoji-game
.
- Selectionnez cet élément dans une variable
emojisContainer
grâce à la fonctiondocument.querySelector
. - Réinitialisez le contenu de cet élément avec la propriété
innerHTML
à une chaîne vide. - Pour chaque emoji du tableau passé en argument
- créer un élément
li
avecdocument.createElement
- modifier son contenu avec la propriété
textContent
- ajouter cet élément à
emojisContainer
avec la méthodeappendChild
- créer un élément
Testez cette fonction en appelant displayCards(getRandomEmojis())
. Vous devriez voir les emojis s’afficher dans le navigateur.
3. Cacher les emojis
Créer une fonction hideCards
qui cache le contenu en modifiant la couleurd de chacune des cartes à transparent
.
Pour sélectionner les cartes, on pourra utiliser la méthode querySelectorAll
avec le sélecteur CSS approprié.
Testez cette fonction en appelant hideEmojis
après avoir affiché les emojis.
4. Poser une question à l’utilisateur
Créer une fonction askQuestion
avec les spécifications suivantes : , et pose la question à l’utilisateur : « Quelle est le numéro de la carte avec l’emoji
- Cette fonction prend en paramètre le tableau des emojis affichés.
- Un emoji est choisi aléatoirement dans ce tableau.
- On pose à l’utilisateur la question « Quelle est le numéro de la carte avec l’emoji
? ». (avec l’emoji choisie). On pourra utiliser la fonction prompt
pour cela. - Si l’utilisateur répond correctement, la fonction affiche un message de félicitation :
- Ajoutez une classe
success
à la liste ordonnée contenant les emojis (cela lancera une animation CSS). - Ajouter un message de félicitation dans la
div
avec l’idemoji-game-message
(par exemple : « Bravo 🎉 ! »).
- Ajoutez une classe
- Si l’utilisateur répond incorrectement, alors réafficher tous les emojis et afficher un message d’échec dans la
div
avec l’idemoji-game-message
(par exemple : « Perdu 😔 »).
Testez que la fonction askQuestion
fonctionne en l’appelant avec un tableau d’emojis (vous pouvez afficher la solution dans le texte de la question pour tester le cas où l’utilisateur répond correctement).
5. Assemblage du jeu
Créer une fonction
startGame
qui appelle successivement les fonctionsgetRandomEmojis
etdisplayEmojis
.Utilisez la fonction
setTimeout
pour appeler la fonctionhideEmoji
après 5 secondes.setTimeout(hideEmoji, 5000);
Utilisez la fonction
setTimeout
pour appeler la fonctionaskQuestion
après 5 secondes et 100 millisecondes.Appelez la fonction
startGame
pour lancer le jeu.
6. Pour aller plus loin
Faire en sorte que le jeu boucle tant que l’utilisateur ne trouve pas la bonne réponse, en affichant les emojis pendant 5 secondes puis en posant une nouvelle question.
Faire en sorte que le jeu augmente en difficulté à chaque fois que l’utilisateur trouve la bonne réponse, en ajoutant un emoji supplémentaire à chaque tour. Afficher un compteur de niveau. Si l’utilisateur se trompe, le niveau est réinitialisé à 1.