Pour votre progression, c'est très important de finir le sujet précédent avant de commencer celui-ci.
Vous devez travailler connectés (lien « Connexion » en haut à droite de la page). Sinon, vous rencontrerez des problèmes d'avancement et vous risquez d'être comptés absent. En étant connectés vous retrouverez l'endroit où vous en étiez à la séance suivante.
Le JS a une particularité: on exécute des choses de manière « asynchrone ».
On va apprendre ce que ça veut dire et comment l'utiliser.
Sur cette page, une image avec un chat est affichée. Une animation CSS bouge l'image horizontalement.
Créez le fichier chat.html et ouvrez-le:
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8"/>
<title>Chat</title>
<style>
body { max-width: 40em; }
#bouton { font-size: 20px; }
#chat {
position: absolute;
left: 0px;
top: 0px;
width: 200px;
animation-duration: 5s;
animation-name: chatbouge;
animation-iteration-count: infinite;
animation-direction: alternate;
animation-timing-function: linear;
}
@keyframes chatbouge {
from { left: 0px; }
to { left: 400px;}
}
</style>
</head>
<body>
<h1>Ceci est une page</h1>
<p>Bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla </p>
<p><img id="chat" src="https://moodle.iutv.univ-paris13.fr/img/bjs2/chat.png"/></p>
<p>Bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla </p>
<button id="bouton">Bouton</button>
<p>Bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla </p>
<script>
</script>
</body>
</html>
Quand l'utilisateur clique sur le bouton, affichez "click" dans la console.
Écrivez votre code dans la balise <script>
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8"/>
<title>Chat</title>
<style>
body { max-width: 40em; }
#bouton { font-size: 20px; }
#chat {
position: absolute;
left: 0px;
top: 0px;
width: 200px;
animation-duration: 5s;
animation-name: chatbouge;
animation-iteration-count: infinite;
animation-direction: alternate;
animation-timing-function: linear;
}
@keyframes chatbouge {
from { left: 0px; }
to { left: 400px;}
}
</style>
</head>
<body>
<h1>Ceci est une page</h1>
<p>Bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla </p>
<p><img id="chat" src="https://moodle.iutv.univ-paris13.fr/img/bjs2/chat.png"/></p>
<p>Bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla </p>
<button id="bouton">Bouton</button>
<p>Bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla </p>
<script>
document.getElementById('bouton').addEventListener('click',()=>{
console.log('click');
});
</script>
</body>
</html>
On va voir ce qui se passe si on bloque l’exécution du JS.
Dans la fonction anonyme qui est appelée quand on appuie sur le bouton, ajoutez une boucle infinie après console.log('click') :
while(true);
La condition du while est toujours vraie. Le point-virgule juste après indique qu'il n'y a rien à faire.
Le JS exécute ce code en boucle et reste bloqué à cet endroit du code.
Que se passe-t-il quand on clique sur le bouton ?
L'animation du chat continue normalement
Je peux encore sélectionner du texte sur la page.
Je peux recharger la page
Au bout de quelque temps, le navigateur propose d’arrêter.
Si le JS bloque, la page devient inutilisable.
C'est un principe important: dans le navigateur, le JS ne doit jamais bloquer. Il doit être « non-bloquant »
Enlevez la boucle infinie.
Ajoutons un peu de code pour voir combien de temps notre code met à être exécuté:
Vous devriez avoir ceci:
<script>
let debut=Date.now();
window.getComputedStyle(document.getElementById('chat')).top;
document.getElementById('chat').style.left='400px';
document.getElementById('bouton').addEventListener('click',()=>{
console.log('click');
});
console.log('Durée:',(Date.now()-debut)+'ms');
</script>
Ouvrez la console et rechargez la page.
Quelles affirmations sont vraies ?
Mon code s’exécute en moins de 100 millisecondes.
Mon code s’exécute au chargement de la page
Mon code attend que l'utilisateur clique sur le bouton.
Mon code s’exécute en plus d'une seconde
On voit donc que le code JS s’exécute très vite, en quelques millisecondes.
L'utilisateur ne s’aperçoit pas de ce blocage très court.
A la fin de notre code JS (fin du <script>), on rend la main au navigateur.
Que fait le navigateur ensuite ?
Le navigateur passe la plupart de son temps dans la « boucle d'événements »... à ne rien faire.
De temps en temps (au plus toutes les 16 millisecondes), il se rend compte que quelque-chose à changé (par exemple, le chat animé a bougé) et qu'il est temps de mettre à jour l'affichage.
Alors, il met à jour l'affichage.
Quelles affirmations sont vraies ?
En général, le navigateur ne fait rien.
Le navigateur met à jour l'affichage immédiatement, dès que quelque chose change (comme la position d'un élément)
Non. Le navigateur ne met à jour l'affichage que quand ça lui semble utile et qu'il se trouve dans la boucle d'événements.
Il ne mettra pas à jour l’affichage plus de 60 fois par seconde (vitesse de rafraîchissement de l'écran).
Normalement, le navigateur passe la plupart de son temps dans la boucle d'événements.
Lorsqu'on appuie sur le bouton, le navigateur ajoute une tache JS à exécuter dans la liste (à gauche de l'animation ci-dessous).
Lorsque ce code JS a fini de s'exécuter il rend la main au navigateur, qui retourne dans la boucle d'événements.
Plus tard, il rafraîchit l'affichage si nécessaire (l'image du chat bouge).
Lorsque le JS bloque, le navigateur reste coincé et ne retourne pas à la boucle d'événements.
Remettons la boucle infinie:
while(true);
Dans le HTML, juste après le chat, ajoutez l'image suivante en utilisant id="souris":
Dans la partie CSS ajoutez:
#souris {
position: absolute;
top: 100px;
left: 400px;
}
Dans la partie JS, lorsque l'utilisateur clique sur le bouton, ajoutez:
const souris=document.getElementById('souris');
souris.style.top='150px';
souris.style.top='300px';
souris.style.top='400px';
Lisez le JS et regardez l'affichage.
Que voyez vous à l'écran quand vous cliquez sur le bouton ?
La souris se déplace immédiatement en bas.
La souris se déplace en 3 étapes, d'abord en haut, au milieu, puis en bas.
La souris reste en haut, près du chat (la pauvre).
Essayons de comprendre le déplacement de l'image de la souris.
Dans les pages suivantes, on va creuser la notion d’exécution différée.
Supposons qu'on veuille attendre 5 secondes avant d'afficher « bonjour » sur la console.
Quelles affirmations sont vraies ?let d=Date.now();
while(Date.now()<d+5000);
console.log('bonjour')
Ce code bloque le navigateur pendant 5 secondes.
Ce code affiche bonjour dans la console après 5 secondes.
Ce code rend la main au navigateur pendant 5 secondes.
Ce code est une bonne solution.
Le code précédent n'est pas une bonne solution. Il bloque le navigateur.
Essayons une autre approche, avec setTimeout :
console.log('début');
setTimeout(()=>{
console.log('bonjour');
}, 5000);
console.log('fin')
setTimeout dit au navigateur d'appeler une fonction après une durée donnée (ici 5000ms)
Quelles affirmations sont vraies ?
(N’hésitez pas à essayer le code)
Ce code affiche bonjour dans la console après 5 secondes.
Ce code bloque le navigateur pendant 5 secondes.
Ce code est une bonne solution.
Ce code rend la main au navigateur pendant 5 secondes.
console.log('début');
setTimeout(()=>{
console.log('bonjour');
}, 5000);
console.log('fin')
Quel est l'ordre d'affichage ?
début, fin, bonjour
début, bonjour, fin
Explications:
console.log('début'); setTimeout(()=>{ console.log('bonjour'); }, 5000); console.log('fin')
Le code suivant
setTimeout(xyz, 1234)
permet de dire au navigateur « Tiens, prends cette fonction xyz et exécute-là plus tard » (dans 1234 ms).
On a fourni au navigateur une action qu'il doit faire plus tard.
Le code suivant
document.addEventListener('click',xyz);
permet de dire au navigateur « Tiens, prends cette fonction xyz et exécute-là plus tard » (quand l'utilisateur clique)
On a fourni au navigateur une action qu'il doit faire plus tard.
En JS, on cherche souvent à faire exécuter des actions plus tard. Ces actions sont des fonctions.
C'est pour ça qu'on a autant besoin de manipuler des fonctions. Les fonctions anonymes sont une manière pratique (mais pas indispensable) de le faire.
Une fonction qu'on fournit pour être appelée plus tard s’appelle un « callback »
Créez le fichier course.html suivant:
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8"/>
<title>Course</title>
<style>
#chat {
position: absolute;
left: 0px;
top: 0px;
width: 200px;
transition: left 1s,top 1s;
}
#souris {
position: absolute;
left: 400px;
top: 100px;
transition: left .5s,top .5s;
}
</style>
</head>
<body>
<img id="chat" src="https://moodle.iutv.univ-paris13.fr/img/bjs2/chat.png"/>
<img id="souris" src="https://moodle.iutv.univ-paris13.fr/img/bjs2/souris.svg"/>
<script>
</script>
</body>
</html>
Dans la balise <script>, écrivez le code pour qu'une seconde après le chargement de la page, le chat se déplace aux coordonnées (300,100) et la souris à (400,300).
Les coordonnées correspondent à (left,top). N'oubliez pas les 'px'.
Écrivez le code, vérifiez qu'il fonctionne dans votre navigateur,
puis copiez-le ici pour que votre enseignant puisse le relire plus tard:
<script>
const chat =document.getElementById('chat' );
const souris=document.getElementById('souris');
setTimeout(()=>{
chat.style.left='300px';
chat.style.top ='100px';
souris.style.left='400px';
souris.style.top ='300px';
},1000);
</script>
<script>
const chat =document.getElementById('chat' );
const souris=document.getElementById('souris');
setTimeout(()=>{
chat.style.left='300px';
chat.style.top ='100px';
souris.style.left='400px';
souris.style.top ='300px';
setTimeout(()=>{
chat.style.left='250px';
chat.style.top ='200px';
souris.style.left='200px';
souris.style.top ='400px';
},1000);
},1000);
</script>
Faites en sorte qu'après le deuxième déplacement, le chat et la souris se déplacent à nouveau.
Cette fois le chat se déplace aux coordonnées (360,450) et la souris à (500,600).
Même contrainte: n'utilisez setTimeout qu’avec la valeur 1000.
<script>
const chat =document.getElementById('chat' );
const souris=document.getElementById('souris');
setTimeout(()=>{
chat.style.left='300px';
chat.style.top ='100px';
souris.style.left='400px';
souris.style.top ='300px';
setTimeout(()=>{
chat.style.left='250px';
chat.style.top ='200px';
souris.style.left='200px';
souris.style.top ='400px';
setTimeout(()=>{
chat.style.left='360px';
chat.style.top ='450px';
souris.style.left='500px';
souris.style.top ='600px';
},1000);
},1000);
},1000);
</script>
Pour enchaîner dans le temps des opérations, on a dû emboîter des fonctions. Ce n'est pas très lisible.
Ici, on n'en a emboîté que 3, mais en pratique, ça peut être bien pire.
Cette situation arrive souvent en JS quand on veut enchaîner des opérations qui sont décalées dans le temps.
Cette situation a un nom: « Callback Hell ».
Pour résoudre ce problème et faciliter la vie des développeurs, le JS propose deux outils, liés:
Créez le fichier range-ta-chambre.html suivant:
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8"/>
<title>Range ta chambre</title>
</head>
<body>
<img src="https://moodle.iutv.univ-paris13.fr/img/bjs2/chambre.jpg"/>
<script src="https://moodle.iutv.univ-paris13.fr/img/bjs2/bjs2-js-lib.js"></script>
<script>
</script>
</body>
</html>
Dans <script> appelez la fonction range_ta_chambre avec comme paramètre un nom.
Observez ce qu'il se passe dans la console. Rechargez la page plusieurs fois.
A la fin, la chambre est toujours rangée.
A la fin, la chambre n'est jamais rangée.
Le rangement prend quelques secondes.
Le non-rangement prend quelques secondes.
La fonction range_ta_chambre('Tom') retourne une valeur.
Mettez cette valeur dans une nouvelle variable appelée "p" et affichez-là dans la console.
Quel est le type de "p" ?
(regardez dans la console)
Oui, c'est vrai, p est un objet... mais quel type d'objet ?
Presque! Regardez la console pour vérifier l'orthographe et les majuscules / minuscules.
Presque! On demande juste le type de l'objet.
const p=range_ta_chambre('Tom');
console.log(p);
(Essayez dans votre <script> ou dans la console avant de répondre)
(utilisez une fonction fléchée, sans paramètre, et avec des accolades {...} )
Il n'y a pas d'accolades dans votre réponse.
L'énoncé dit:
(utilisez une fonction fléchée, sans paramètre, et avec des accolades {...} )
Vous avez mis un paramètre à la fonction passée à .then
L'énoncé dit:
utilisez une fonction fléchée, sans paramètre, et avec des accolades {...}
Vous êtes sur la bonne voie. Le début est correct:
p.then(()=>{
Le problème est après.
Vous êtes sur la bonne voie. La fin est correcte:
... {console.log('Trés bien!');});
Le problème est avant.
Votre réponse commence par « then ». Vous avez oublié quelque-chose.
Indice: l''énoncé dit:
« Pour ça, l'objet « p » a une méthode appelée « then ». »
Vous avez écrit « fulfilled ». On ne manipule pas directement les états des promesses.
On va utiliser .then, a qui on fourni une fonction qui sera appelée quand la promesse arrive à l'état « fulfilled ».
Comment faire pour réagir si la promesse n'est pas tenue ?
Comme la méthode then(...), les promesses ont une méthode catch(...), qui prend une fonction en paramètre:
const p=range_ta_chambre('Tom');Essayez dans votre navigateur.
p.catch(()=>{console.log('Tu es vilain!');});
La méthode p.then(...) renvoie une nouvelle promesse.
On pourrait la mettre dans une nouvelle variable « p2 », comme ceci:
let p=range_ta_chambre('Tom');
let p2=p.then(()=>{console.log('Trés bien!');});
Mais, le plus souvent, on l'utilisera directement, pour enchaîner avec catch:
p.then(()=>{console.log('Trés bien!');}).catch(()=>{console.log('Tu es vilain!');});
La même chose en 2 lignes:
p.then( ()=>{console.log('Trés bien!');})
.catch(()=>{console.log('Tu es vilain!');});
Très souvent, on ne met pas non plus la première promesse (p) dans une variable. Ce qui donne:
range_ta_chambre('Tom')Essayez le code précédent. Vous ne devriez plus avoir de message d’erreur.
.then( ()=>{console.log('Trés bien!');})
.catch(()=>{console.log('Tu es vilain!');});
Effacez tout le code dans <script>
Appelez 3 fois la fonction range_ta_chambre avec des noms différents.
Qu'est-ce qui se passe ?
Chacun commence à ranger sa chambre avant que les autres aient fini.
Chacun attend que le précédent ait fini de ranger sa chambre.
Effacez tout le code dans <script>
On veut que deux personnes rangent leur chambre.
La deuxième ne doit commencer à ranger sa chambre qu'après que la première ait réussi à ranger la sienne.
Écrivez le code, vérifiez qu'il fonctionne dans votre navigateur,
puis copiez-le ici pour que votre enseignant puisse le relire plus tard:
Maintenant, on veut que 3 personnes rangent leur chambre successivement.
La fonction range_ta_chambre peut prendre un 2e paramètre, la probabilité de réussite.
Mettez-le à 1, pour faciliter la lecture.
Écrivez le code, vérifiez qu'il fonctionne dans votre navigateur,
puis copiez-le ici pour que votre enseignant puisse le relire plus tard:
range_ta_chambre('Tom',1).then(()=>{
range_ta_chambre('Paul',1).then(()=>{
range_ta_chambre('Jean',1);
})
});
range_ta_chambre('Tom',1).then(()=>{
range_ta_chambre('Paul',1).then(()=>{
range_ta_chambre('Jean',1);
})
});
On se retrouve dans la situation du chat poursuivant la souris: des fonctions, dans des fonctions, dans des fonctions...
Si la fonction (ici anonyme) fournie à .then() retourne une promesse, alors on peut enchaîner les appels à .then() :
range_ta_chambre('Tom',1)
.then(()=>{return range_ta_chambre('Paul',1);})
.then(()=>{return range_ta_chambre('Jean',1);})
C'est plus propre.
La fonction attendre(d) renvoie une promesse, qui est toujours tenue (elle n'échoue jamais). Elle aboutit après une durée de « d » millisecondes. Par exemple: attendre(5000) aboutit après 5000 ms.
Que faut-il écrire pour afficher « ok » après 2 secondes, en utilisant « attendre » ?
(Utilisez une fonction fléchée, sans paramètre, avec des accolades. N'utilisez pas setTimeout)
Essayez avant de répondre.
C'est vrai qu'on pourrait utiliser « await », mais, pour l'instant, on cherche à comprendre comment utiliser les promesses directement.
Non. On ne veut pas utiliser setTimeout ici. On veut utiliser la fonction attendre()
Vous êtes sur la bonne voie. Le début est correct:
attendre(2000).then(...
Le problème est après.
Indice: Votre réponse devrait commencer par « attendre »
Affichez successivement ok1, ok2, ok3 et ok4 sur la console, avec 2 secondes de délai.
Écrivez le code, vérifiez qu'il fonctionne dans votre navigateur,
puis copiez-le ici pour que votre enseignant puisse le relire plus tard:
attendre(2000)
.then(()=>{console.log('ok1');return attendre(2000);})
.then(()=>{console.log('ok2');return attendre(2000);})
.then(()=>{console.log('ok3');return attendre(2000);})
.then(()=>{console.log('ok4');return attendre(2000);})
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8"/>
<title>Course promesses</title>
<style>
#chat {
position: absolute;
left: 0px;
top: 0px;
width: 200px;
transition: left 1s,top 1s;
}
#souris {
position: absolute;
left: 400px;
top: 100px;
transition: left .5s,top .5s;
}
</style>
</head>
<body>
<img id="chat" src="https://moodle.iutv.univ-paris13.fr/img/bjs2/chat.png"/>
<img id="souris" src="https://moodle.iutv.univ-paris13.fr/img/bjs2/souris.svg"/>
<script>
const chat =document.getElementById('chat' );
const souris=document.getElementById('souris');
setTimeout(()=>{
chat.style.left='300px';
chat.style.top ='100px';
souris.style.left='400px';
souris.style.top ='300px';
setTimeout(()=>{
chat.style.left='250px';
chat.style.top ='200px';
souris.style.left='200px';
souris.style.top ='400px';
setTimeout(()=>{
chat.style.left='360px';
chat.style.top ='450px';
souris.style.left='500px';
souris.style.top ='600px';
},1000);
},1000);
},1000);
</script>
</body>
</html>
Re-écrivez le code dans <script> en utilisant la fonction attendre() et sans utiliser setTimeout()
Pour pouvoir utiliser attendre(), ajoutez la ligne suivante avant le <script> principal:
<script src="https://moodle.iutv.univ-paris13.fr/img/bjs2/bjs2-js-lib.js"></script>
Écrivez le code, vérifiez qu'il fonctionne dans votre navigateur, puis copiez-le ici pour que votre enseignant puisse le relire plus tard:
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8"/>
<title>Course promesses</title>
<style>
#chat {
position: absolute;
left: 0px;
top: 0px;
width: 200px;
transition: left 1s,top 1s;
}
#souris {
position: absolute;
left: 400px;
top: 100px;
transition: left .5s,top .5s;
}
</style>
</head>
<body>
<img id="chat" src="https://moodle.iutv.univ-paris13.fr/img/bjs2/chat.png"/>
<img id="souris" src="https://moodle.iutv.univ-paris13.fr/img/bjs2/souris.svg"/>
<script src="https://moodle.iutv.univ-paris13.fr/img/bjs2/bjs2-js-lib.js"></script>
<script>
const chat =document.getElementById('chat' );
const souris=document.getElementById('souris');
attendre(1000)
.then(()=>{
chat.style.left='300px';
chat.style.top ='100px';
souris.style.left='400px';
souris.style.top ='300px';
return attendre(1000);
})
.then(()=>{
chat.style.left='250px';
chat.style.top ='200px';
souris.style.left='200px';
souris.style.top ='400px';
return attendre(1000);
})
.then(()=>{
chat.style.left='360px';
chat.style.top ='450px';
souris.style.left='500px';
souris.style.top ='600px';
return attendre(1000);
})
</script>
</body>
</html>
Don't trust javascript programmers
All they do is promises but they never callback.
Les promesses aident à simplifier le code, mais restent lourdes à utiliser.
Ceci étant, elles permettent (parfois) l'utilisation de « await »... qui simplifie énormément le code 😀
« await » permet de faire comme si on attendait, sans réellement bloquer le JS, donc en rendant la main au navigateur.
console.log('bonjour');
await attendre(5000);
console.log("ceci s'affiche vraiment 5s après !!! :-)");
Explication:
await est vraiment très pratique... et a un coté un peu « magique »
await fait des choses « bizarres ». Il arrête l’exécution en plein milieu d'une fonction, pour la reprendre, plus tard, au même endroit.
Pour que ça puisse marcher, la fonction qui contient await doit être un peu particulière. Elle doit être déclaré comme « async »:
async function exemple() {
console.log('bonjour');
await attendre(5000);
console.log("ceci s'affiche vraiment 5s après !!! :-)");
}
<script>
await attendre(5); // erreur !
</script>
<script type="module">ATTENTION: 2023:
await attendre(5); // ok
</script>
<script>
(async function(){
// votre code
await exemple();
})();
</script>
Voyons le déroulement de « await »:
Créez le fichier course-await.html suivant:
(pour l'instant c'est une copie de course-promesses.html)
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8"/>
<title>Course promesses</title>
<style>
#chat {
position: absolute;
left: 0px;
top: 0px;
width: 200px;
transition: left 1s,top 1s;
}
#souris {
position: absolute;
left: 400px;
top: 100px;
transition: left .5s,top .5s;
}
</style>
</head>
<body>
<img id="chat" src="https://moodle.iutv.univ-paris13.fr/img/bjs2/chat.png"/>
<img id="souris" src="https://moodle.iutv.univ-paris13.fr/img/bjs2/souris.svg"/>
<script src="https://moodle.iutv.univ-paris13.fr/img/bjs2/bjs2-js-lib.js"></script>
<script>
const chat =document.getElementById('chat' );
const souris=document.getElementById('souris');
attendre(1000)
.then(()=>{
chat.style.left='300px';
chat.style.top ='100px';
souris.style.left='400px';
souris.style.top ='300px';
return attendre(1000);
})
.then(()=>{
chat.style.left='250px';
chat.style.top ='200px';
souris.style.left='200px';
souris.style.top ='400px';
return attendre(1000);
})
.then(()=>{
chat.style.left='360px';
chat.style.top ='450px';
souris.style.left='500px';
souris.style.top ='600px';
return attendre(1000);
})
</script>
</body>
</html>
Presque. Réécrivez toute la balise ouvrante.
Indice: Votre réponse devrait commencer par <script
Re-écrivez le code dans <script> en utilisant await et sans utiliser .then()
Écrivez le code, vérifiez qu'il fonctionne dans votre navigateur, puis copiez-le ici pour que votre enseignant puisse le relire plus tard:
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8"/>
<title>Course promesses</title>
<style>
#chat {
position: absolute;
left: 0px;
top: 0px;
width: 200px;
transition: left 1s,top 1s;
}
#souris {
position: absolute;
left: 400px;
top: 100px;
transition: left .5s,top .5s;
}
</style>
</head>
<body>
<img id="chat" src="https://moodle.iutv.univ-paris13.fr/img/bjs2/chat.png"/>
<img id="souris" src="https://moodle.iutv.univ-paris13.fr/img/bjs2/souris.svg"/>
<script src="https://moodle.iutv.univ-paris13.fr/img/bjs2/bjs2-js-lib.js"></script>
<script type="module">
const chat =document.getElementById('chat' );
const souris=document.getElementById('souris');
await attendre(1000);
chat.style.left='300px';
chat.style.top ='100px';
souris.style.left='400px';
souris.style.top ='300px';
await attendre(1000);
chat.style.left='250px';
chat.style.top ='200px';
souris.style.left='200px';
souris.style.top ='400px';
await attendre(1000);
chat.style.left='360px';
chat.style.top ='450px';
souris.style.left='500px';
souris.style.top ='600px';
</script>
</body>
</html>