Sujet 6

  1. Bienvenue au 6e sujet
  2. Révisions-1
    1. Boucle for
    2. addEventListener
    3. addEventListener
    4. DOM
    5. Sélecteurs CSS
    6. Sélecteur 2
    7. Sélecteur composé
    8. pageX
    9. Créer un élément
    10. Remplir paragraphe
    11. Insérer
    12. Position
  3. Révisions-2
    1. querySelector : plusieurs
    2. querySelectorAll
    3. Fonction anonyme
    4. Class
    5. class
  4. Révisions-3
    1. Ordre d’exécution
    2. Web client / serveur
    3. Objet
    4. Tableau
  5. Révisions-4,5
    1. Regexp
    2. Regexp 2
    3. String
    4. Concaténation
    5. Portée
    6. Portée 2
    7. Élément DOM
    8. Élément DOM 2
    9. Programme entier
  6. Diaporama
    1. Diapos : analyze
    2. Déplacement dans le CSS
    3. Déplacement en JS dans la console
    4. diapos.js
    5. Correction: diapos.js
    6. Déplacer
    7. Correction
    8. Flèche gauche
    9. Correction
    10. Conditions d'arrêt
    11. Correction
    12. Transition
  7. Programmes courts
    1. Rouge vert
    2. Correction
    3. Liste
    4. Correction
    5. class
    6. Correction
    7. Champs texte
    8. Correction
    9. Ajouter ligne
    10. Correction

1. Bienvenue au 6e sujet

1.1 Bienvenue au 6e sujet

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.


2. Révisions-1

2.1 Révisions-1

Commençons par une révision des notions introduites au Sujet-1


Révisions-1

2.2 Boucle for

Écrivez une boucle for, sur la variable i, qui affiche dans la console toutes les valeurs du tableau tab:

let tab=['chien','chat','souris','escargot'];

Révisions-1

2.3 addEventListener


let para=document.querySelector('p');
para.addEventListener('click', abcdef );

Quel est le type du deuxième paramètre abcdef de addEventListener ?
Répondez par un seul mot.


Révisions-1

2.4 addEventListener


let para=document.querySelector('p');
para.addEventListener('click', abcdef );
Que fait addEventListener ?

Révisions-1

2.5 DOM

Le navigateur reçoit ce HTML:

<body>
<p>Bonjour</p>
<h2></h2>
</body> 

Et, à partir de ce HTML, construit l'arbre DOM suivant:

Quelles affirmations sont vraies ?

Révisions-1

2.6 Sélecteurs CSS

<p>
   <span>Pomme</span>
   <span id="abc">Fraise</span>
   <span>Poire</span>
</p>

Que faut-il écrire dans un fichier CSS pour afficher « Fraise » en rouge ?

Révisions-1

2.7 Sélecteur 2

<p>
   <span class="ghi">Pomme</span>
   <span>Fraise</span>
   <span class="ghi">Poire</span>
</p>

Que faut-il écrire dans un fichier CSS pour afficher « Pomme » et « Poire » en rouge ?


Révisions-1

2.8 Sélecteur composé

<p id="p">
   <span class="ghi">Pomme</span>
   <span>Ajouter</span>
</p>
<p id="q">
<span class="ghi">Fraise</span>
<span>Ajouter</span>
</p

Que faut-il écrire dans un fichier CSS pour afficher « Pomme » en rouge ?


Révisions-1

2.9 pageX

<p>Bonjour</p>
...
document.querySelector('p').addEventListener('click',exemple);

Écrivez, en une seule ligne, la fonction exemple. Celle-ci permettra d'afficher sur la console, la coordonnée X de l'endroit ou l'utilisateur à cliqué.
Indices:
pageX est une propriété d'un objet.


Révisions-1

2.10 Créer un élément

Que faut-il écrire pour créer un nouveau paragraphe et le mettre dans une nouvelle variable appelée "para" ?
(pour l'instant, on veut juste le créer en mémoire, sans le modifier, ni l’insérer dans le document)

Révisions-1

2.11 Remplir paragraphe

On a crée un paragraphe avec :

let para=document.createElement('p');

Que faut-il écrire pour que ce paragraphe devienne <p>bonjour</p> ?

Révisions-1

2.12 Insérer

<div>
<p>Hello</p>
<p>Hola</p>
AAAA
</div>

let para=document.createElement('p');
para.textContent='bonjour';
let d=document.querySelector('div');
XYZ
Que faut-il écrire à la place de XYZ pour insérer le paragraphe para dans le document à l'endroit indiqué par "AAAA" ?

Révisions-1

2.13 Position

...
<body>
   <img src="photo.jpg" ... />
</body>

On veut afficher l'image aux coordonnées x=100 y=200 de la page.
Que faut-il écrire dans le fichier CSS ?
Indications:

3. Révisions-2

3.1 Révisions-2

Continuons par une révision des notions introduites au Sujet-2

Révisions-2

3.2 querySelector : plusieurs

<p>Fraise</p>
<p>Poire</p>
<p>Pomme</p>

La fonction document.querySelector('p') permet d'obtenir le premier élément correspondant au sélecteur: ici, le paragraphe <p>Fraise</p>

Il existe une autre fonction, similaire, permettant d'obtenir tous les éléments correspondant à un sélecteur.

Que faut-il écrire pour obtenir tous les paragraphes ?

Révisions-2

3.3 querySelectorAll

<p>Fraise</p>
<p>Poire</p>
<p>Pomme</p>

let q=document.querySelectorAll('p') 

Que faut-il écrire pour afficher le contenu du 3e paragraphe dans la console ("Pomme") ?

Révisions-2

3.4 Fonction anonyme

let z=document.querySelector('h1')

Récrivez, en une ligne, le code suivant en utilisant une fonction anonyme.

z.addEventListener('click',abcdef);
function abcdef()
{
    console.log('hello');
}

Révisions-2

3.5 Class

Que faut-il écrire pour transformer ceci

<p id="fraise">Fraise</p>
<p id="pomme">Pomme</p>
<p id="poire">Poire</p>

en ceci:

<p id="fraise">Fraise</p>
<p id="pomme" class="promo">Pomme</p>
<p id="poire">Poire</p>

Révisions-2

3.6 class

Que faut-il écrire pour transformer ceci

<p id="fraise">Fraise</p>
<p id="pomme" class="promo important">Pomme</p>
<p id="poire">Poire</p>

en ceci:

<p id="fraise">Fraise</p>
<p id="pomme" class="promo">Pomme</p>
<p id="poire">Poire</p>
On vous demande d'enlever la classe "important". On suppose que votre programme ne sait pas à priori quelles autres classes il y a sur l'élément.

4. Révisions-3

4.1 Révisions-3

Continuons par une révision des notions introduites au Sujet-3

Révisions-3

4.2 Ordre d’exécution


<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8"/>
<title>Exemple</title>
</head>
<body>
<p>Bonjour!</p>
<script>
console.log('A');
var para=document.querySelector('p');
console.log('B');
para.addEventListener('click',exemple);
console.log('C');
function exemple()
{
console.log('D');
}
console.log('E');
</script>
</body>
</html>

Quel est l'ordre ?

Révisions-3

4.3 Web client / serveur

Quelles affirmations sont vraies ?

Révisions-3

4.4 Objet

Appelez la fonction afficher_position avec un objet contenant les coordonnées (x,y) 100 et 200.


function afficher_position(pos)
{
    console.log(pos.x,pos.y);
}

Révisions-3

4.5 Tableau

let t=[500,300];

Que faut-il écrire pour ajouter la valeur 800 à la fin du tableau ?

5. Révisions-4,5

5.1 Révisions-4,5

Continuons par une révision des notions introduites au Sujet-4 et au Sujet-5

Révisions-4,5

5.2 Regexp

Donnez une expression régulière correspondant aux chaînes suivantes:

La dernière lettre ne peut être que A ou X

Révisions-4,5

5.3 Regexp 2

Donnez une expression régulière correspondant aux chaînes suivantes:


Révisions-4,5

5.4 String

let s="123 joueurs on marqué plus de 20 points";

Que faut-il écrire pour remplacer les nombres par X dans la variable s ?

Le résultat souhaité dans s est:
"X joueurs on marqué plus de X points"


Révisions-4,5

5.5 Concaténation

La variable n contient un nombre.
Affichez dans la console le nombre n suivi de « joueurs ».

Par exemple si n vaut 100, on voudrait afficher « 100 joueurs »

Révisions-4,5

5.6 Portée

let x=123;
if(true){
   x=456;
}
console.log(x);

Qu'est affiché sur la console ?

Révisions-4,5

5.7 Portée 2

let x=123;
if(true){
   let x=456;
}
console.log(x);

Qu'est affiché sur la console ?

Révisions-4,5

5.8 Élément DOM

<p id="abc">bonjour</p>
let t=document.getElementById('abc');
XYZ

Que faut-il écrire à la place de XYZ pour obtenir « hello » à la place de « bonjour » ?

Révisions-4,5

5.9 Élément DOM 2

<input id="def" type="text"/>
let t=document.getElementById('def');
XYZ

Que faut-il écrire à la place de XYZ pour afficher dans la console ce que l'utilisateur a tapé dans le champs texte ?


Révisions-4,5

5.10 Programme entier

<p>Haha</p>

Écrivez, en une seule ligne, sans créer de variable, un programme qui affiche « coucou » dans la console chaque fois que l'utilisateur clique sur le paragraphe.
(c'est un peu long)

6. Diaporama

6.1 Diaporama

On veut créer un affichage où plusieurs images peuvent défiler à l'aide de deux flèches, comme ceci:

Pour ça, on créez les fichiers HTML et le CSS suivants:

diapos.html

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>diapos</title>
<link type="text/css" rel="stylesheet" href="diapos.css"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
</head>
<body>
<!--------------------->
<div id="dia">
<div id="dia-images">
<img src="http://moodle.iutv.univ-paris13.fr/img/js/montagne-small.jpg" />
<img src="http://moodle.iutv.univ-paris13.fr/img/js/oiseau-small.jpg" />
<img src="http://moodle.iutv.univ-paris13.fr/img/js/escargot-small.jpg" />
<img src="http://moodle.iutv.univ-paris13.fr/img/js/marmotte-small.jpg" />
</div>
<div id="dia-fleches">
<span id="dia-gauche">&lt;</span>
<span id="dia-droite">&gt;</span>
</div>
</div>
<!--------------------->
<script src="diapos.js"></script>
</body>
</html>

diapos.css

/* Le cadre principal. */
#dia
{
/* On le restreint exactement à la taille d'une seule image. */
width: 600px;
height: 450px;
/* Tout ce qui déborde est caché. Donc, une seule image n'est visible. */
overflow: hidden;
/* Ceci sert uniquement pour créer un containing block */
/* qui permet de positionner les flêches avec position: absolute */
position: relative;
}

/* Un div très très large */
/* Il contient toutes les images disposées horizontalement */
/* Il déborde de son parent */
#dia-images
{
/* La largeur des 4 images */
width: 2400px;
/* Trés important: c'est ce qui permet de décaler ce div en JS avec "left: ...px;" */
position: relative;
/* Les images sont affichées de gauche à droite, sans espaces */
display: flex;
/* Décalage: coordonnée x de dia-images */
left: 0px;
}

/* Commun aux deux flêches */
#dia-fleches span
{
position: absolute;
top: 200px;
font-size: 30px;
font-family: sans;
background-color: rgba(0,0,0,.4);
color: #bbb;
padding: .1em;
/* Le pointeur de la souris */
cursor: pointer;
}
#dia-gauche
{
left: 0;
}
#dia-droite
{
right: 0;
}
#dia-fleches span:hover
{
color: #fff;
}


Vérifiez que ceci s'affiche bien et prenez le temps de comprendre en détail cette mise en page.

Lisez les commentaires du CSS.

Utilisez l'inspecteur (outils de développement) pour voir où sont les images.

On va ensuite voir ensemble comment faire fonctionner le défilement.


Diaporama

6.2 Diapos : analyze

<div id="dia"> est ajusté exactement à la taille d'une image (600x450).

<div id="dia-images"> contient toutes les images horizontalement. Il est beaucoup plus large que <div id="dia" >

Grâce à "overflow: hidden;"  tout ce qui déborde de <div id="dia"> est caché.

Dans le CSS, pour #dia, ajoutez ceci:

    border: 5px solid red;

Dans le CSS, pour #dia-images, ajoutez ceci:

    border: 5px solid green;

Regardez le résultat.

Maintenant, dans le CSS, mettez en commentaire overflow: hidden

Combien d'images voyez-vous ?
(vous devrez peut-être faire défiler un peu la page à droite)

Diaporama

6.3 Déplacement dans le CSS

Maintenant, dans le fichier CSS, remplacez « left: 0px; » par « left: 100px; »
Remarquez dans quel sens bouge dia-images.

left: XYZpx;

Dans le CSS, que faut-il écrire à la place de XYZ pour que l'escargot soit affiché dans #dia (le cadre rouge) ?
(Essayez avant de répondre ici)

Diaporama

6.4 Déplacement en JS dans la console

En modifiant le CSS, on a réussi à bouger #dia-images !
Remettez "overflow: hidden" et enlevez les "border: 5 px solid ..."
Dans le CSS, essayez à nouveau différentes valeurs de "left: ...px" pour #dia-images.

Ce que vous faites à la main dans le CSS, c'est ce qu'on veut faire en JS.
En JS, on ne modifie pas le fichier CSS, mais on modifie la propriété "style" de l'élément concerné.
Remettez "left: 0px" dans le fichier CSS.

On veut afficher l'escargot en JS.
Il faut donc:

Essayez dans la console. Une fois que ça marche, copiez la réponse ici.


Diaporama

6.5 diapos.js

Créez le fichier diapos.js

Faites en sorte d'afficher "Flèche droite"  dans la console, quand l'utilisateur clique sur la flèche droite.
(N'hésitez pas à vous inspirer de ce que vous avez fait dans d'autres exercices)


Écrivez le code, vérifiez qu'il fonctionne dans votre navigateur, puis copiez-le ici pour que votre enseignant puisse le relire plus tard:

Diaporama

6.6 Correction: diapos.js


let diaDroite=document.getElementById('dia-droite');
diaDroite.addEventListener('mousedown',function(){
console.log('Flèche droite');

});

Diaporama

6.7 Déplacer

En tout début de fichier JS, ajoutez la ligne suivante, pour initialiser à 0 la position de dia-images:

document.getElementById('dia-images').style.left='0px';

Pour déplacer les images sur l'escargot, on avait utilisé:

document.getElementById('dia-images').style.left='-1200px'

Décomposons:

let diaImages=document.getElementById('dia-images')
diaImages.style.left='-1200px'

Pour pouvoir déplacer les images, il faut d'abord connaître leur position (comme on avait déplacé le pingouin dans jeu.js au Sujet-3).
On va lire sa position avec:

let pos=parseInt(diaImages.style.left);

Ensuite, il faut changer la valeur numérique dans "pos" et mettre à jour diaImages.style.left

Faites en sorte qu'on puisse faire défiler les diapos en cliquant sur la flèche droite.
(N’hésitez pas à vous inspirer de jeu.js du Sujet-3)


Écrivez le code, vérifiez qu'il fonctionne dans votre navigateur, puis copiez-le ici pour que votre enseignant puisse le relire plus tard:

Diaporama

6.8 Correction

diapos.js

document.getElementById('dia-images').style.left='0px';

let diaDroite=document.getElementById('dia-droite');
diaDroite.addEventListener('click',function(){
console.log('Flèche droite');
let diaImages=document.getElementById('dia-images');
let pos=parseInt(diaImages.style.left);
pos-=600;
diaImages.style.left=pos+'px';

});

Diaporama

6.9 Flèche gauche

Faites en sorte que la flèche gauche fonctionne aussi.


Écrivez le code, vérifiez qu'il fonctionne dans votre navigateur, puis copiez-le ici pour que votre enseignant puisse le relire plus tard:

Diaporama

6.10 Correction


document.getElementById('dia-images').style.left='0px';

let diaDroite=document.getElementById('dia-droite');
diaDroite.addEventListener('click',function(){
console.log('Flèche droite');
let diaImages=document.getElementById('dia-images');
let pos=parseInt(diaImages.style.left);
pos-=600;
diaImages.style.left=pos+'px';
});

let diaGauche=document.getElementById('dia-gauche');
diaGauche.addEventListener('click',function(){
console.log('Flèche gauche');
let diaImages=document.getElementById('dia-images');
let pos=parseInt(diaImages.style.left);
pos+=600;
diaImages.style.left=pos+'px';
});


Diaporama

6.11 Conditions d'arrêt

Ajoutez des conditions sur pos pour que le défilement s’arrête quand on arrive aux bouts.


Écrivez le code, vérifiez qu'il fonctionne dans votre navigateur, puis copiez-le ici pour que votre enseignant puisse le relire plus tard:

Diaporama

6.12 Correction

document.getElementById('dia-images').style.left='0px';

let diaDroite=document.getElementById('dia-droite');
diaDroite.addEventListener('click',function(){
console.log('Flèche droite');
let diaImages=document.getElementById('dia-images');
let pos=parseInt(diaImages.style.left);
pos-=600;
if(pos<-600*3){pos=-600*3;}
diaImages.style.left=pos+'px';
});

let diaGauche=document.getElementById('dia-gauche');
diaGauche.addEventListener('click',function(){
console.log('Flèche gauche');
let diaImages=document.getElementById('dia-images');
let pos=parseInt(diaImages.style.left);
pos+=600;
if(pos>0){pos=0;}
diaImages.style.left=pos+'px';
});

Diaporama

6.13 Transition

On veut que le passage d'une diapos à l'autre soit plus fluide.
Dans des programmes précédents on a utilisé la propriété CSS transition.
Dans le fichier CSS il suffit d'ajouter une ligne dans #dia-image
Cette ligne va dire que tout changement de la propriété CSS left doit prendre 0.5 secondes.


Ecrivez ici la ligne qu'il faut ajouter.
Inspirez vous de ce qui a été vu pour l'animation du splat vert, ou du pingouin Tux dans le jeu ...
(voir documentation)

7. Programmes courts

7.1 Programmes courts

Au cours des 5 derniers sujets, on a appris a écrire des programmes JS simples. Vous devez maintenant être en mesure d'en écrire, seul.
C'est ce qu'on va faire maintenant.

Programmes courts

7.2 Rouge vert

<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8"/>
<title>Rouge vert</title>
</head>
<body>
<p><span id="fraise">Fraise</span> <span id="pistache">Pistache</span></p>
<script>
...
</script>
</body>
</html>

Quand l'utilisateur clique sur « Fraise », « Fraise » devient rouge.
Quand l'utilisateur clique sur « Pistache », « Pistache » devient verte.

Écrivez le code, vérifiez qu'il fonctionne dans votre navigateur, puis copiez-le ici pour que votre enseignant puisse le relire plus tard:

Programmes courts

7.3 Correction

<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8"/>
<title>Rouge vert</title>
</head>
<body>
<p><span id="fraise">Fraise</span> <span id="pistache">Pistache</span></p>
<script>
let f=document.getElementById('fraise');
f.addEventListener('click',function(){
f.style.color='red';
});
let p=document.getElementById('pistache');
p.addEventListener('click',function(){
p.style.color='red';
});
</script>
</body>
</html>


Programmes courts

7.4 Liste

liste.html

<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8"/>
<title>Liste</title>
</head>
<body>
<ul>
<li>Karim</li>
<li>Paul</li>
<li>Leila</li>
<li>Tom</li>
<li>Steve</li>
</ul>
<script>
...
</script>
</body>
</html>

Quand l'utilisateur clique sur un nom, il devient rouge.

Écrivez le code, vérifiez qu'il fonctionne dans votre navigateur, puis copiez-le ici pour que votre enseignant puisse le relire plus tard:

Programmes courts

7.5 Correction

<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8"/>
<title>Liste</title>
</head>
<body>
<ul>
<li>Karim</li>
<li>Paul</li>
<li>Leila</li>
<li>Tom</li>
<li>Steve</li>
</ul>
<script>
let lis=document.querySelectorAll('li');
for(let i=0;i<lis.length;i++){
lis[i].addEventListener('click',function(){
this.style.color='red';
});
}
</script>
</body>
</html>

Programmes courts

7.6 class

class.html

<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8"/>
<title>Rouge vert</title>
</head>
<style>
.ok{
color: white;
background-color: green;
text-shadow: 1px 1px 1px black;
box-shadow: 1px 1px 1px black;
}
.lumiere
{
padding: .5em;
margin: .5em;
}
</style>
<body>
<p><span class="lumiere">Départ</span></p>
<script>
...
</script>
</body>
</html>

Quand l'utilisateur clique sur Départ, il est affiché avec ce qui est indiqué dans .ok {...}.
Si l'utilisateur clique dessus alors que c'est déjà affiché avec .ok, alors, on revient à la situation initiale.

Rappel: classList

Programmes courts

7.7 Correction

<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8"/>
<title>Rouge vert</title>
</head>
<style>
.ok{
color: white;
background-color: green;
text-shadow: 1px 1px 1px black;
box-shadow: 1px 1px 1px black;
}
.lumiere
{
padding: .5em;
margin: .5em;
}
</style>
<body>
<p><span class="lumiere">Départ</span></p>
<script>
let s=document.querySelector('span');
s.addEventListener('click',function(){
if(s.classList.contains('ok')){s.classList.remove('ok');}
else {s.classList.add('ok');}
});
</script>
</body>
</html>

Programmes courts

7.8 Champs texte


<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8"/>
<title>Champs texte</title>
</head>
<body>
<p><input type="text"/></p>
<script>
...
</script>
</body>
</html>

Quand l'utilisateur tape du texte, le texte du champs texte devient rouge si ce que l'utilisateur a tapé est plus court que 10 caractères. Il devient noir sinon.

Écrivez le code, vérifiez qu'il fonctionne dans votre navigateur, puis copiez-le ici pour que votre enseignant puisse le relire plus tard:

Programmes courts

7.9 Correction


<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8"/>
<title>Champs texte</title>
</head>
<body>
<p><input type="text"/></p>
<script>
let t=document.querySelector('input');
t.addEventListener('keyup',function(){
if(t.value.length<10){t.style.color='red' ;}
else {t.style.color='black';}
});
</script>
</body>
</html>


Programmes courts

7.10 Ajouter ligne


<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8"/>
<title>Ajouter ligne</title>
</head>
<body>
<p>
<input id="nom" type="text"/>
<input id="ajouter" type="button" value="ajouter"/>
</p>
<ul>
<li>Karim</li>
<li>Fatoumata</li>
</ul>
<script>
...
</script>
</body>
</html>

Quand l'utilisateur rentre un nom puis appuie sur le bouton, le nom est ajouté à la liste.


Écrivez le code, vérifiez qu'il fonctionne dans votre navigateur, puis copiez-le ici pour que votre enseignant puisse le relire plus tard:

Programmes courts

7.11 Correction

 
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8"/>
<title>Ajouter ligne</title>
</head>
<body>
<p>
<input id="nom" type="text"/>
<input id="ajouter" type="button" value="ajouter"/>
</p>
<ul>
<li>Karim</li>
<li>Fatoumata</li>
</ul>
<script>
let bouton=document.getElementById('ajouter');
bouton.addEventListener('click',function(){
let ligne=document.createElement('li');
ligne.textContent=document.getElementById('nom').value;
document.querySelector('ul').append(ligne);
});
</script>
</body>
</html>