Développeur web freelance depuis 5 ans
Expérience en agence web, E-Commerce (annonceur)
Formation Informatique et Autodidacte
Formateur et fan des OSS, contributeur à mes heures perdues
Solutions phares : Wordpress, Symfony, Magento, Prestashop, Angular
Langages : PHP, MySQL, HTML, CSS, JS
- Langage de programmation de scripts
- Exécuté dans un navigateur web
- Permet de dynamiser les pages web
- Manipulation HTML/CSS
- Ne surtout pas confondre avec Java
Créé en 1995 par NetScape
LiveScript devient JavaScript (!= Java)
Standard ECMAScript
ES1 : 1997 - ES2 : 1998
ES3 : 1999 - ES5 : 2009
ES6 : 2015 - ES7 : 2016
ES8 : 2017
Guide officiel du JS : https://developer.mozilla.org/fr/docs/Web/JavaScript
Côté client (90%) :
Interactions avec le navigateur
Animations (Slider), Événements (Souris)
Single Page Application (Spotify)
AJAX (WebServices)
Côté serveur (10%) :
NodeJS
<!DOCTYPE html>
<html>
<head>
<link href="css/style.css" />
</head>
<body>
<!-- Le JavaScript toujours avant la fermeture de body -->
<script src="js/script.js"></script>
</body>
</html>
console.log('Affiche quelque chose');
alert('Affiche quelque chose');
prompt('Demande quelque chose');
var age; // Initialise une variable
var age = 26; // Initialise une variable et lui affecte la valeur 26
var mon_age = 26; // Underscore
var monAge = 26; // lowerCamelCase
Une variable est une boîte avec une étiquette contenant une donnée.
var string = 'Une chaine de caractères'; // ""
var number = 10; // integer
var float = 10.321; // float
var boolean = true;
var array = [1, 2, "Toto"];
var object = {key: "valeur"};
Attention au typage faible !
var prenom = "Matthieu"; // Je déclare et initialise la variable prenom
console.log(prenom); // J'affiche la variable prenom dans la console
alert(prenom); // J'affiche une boite avec le contenu de la variable prénom
// Commentaire sur une seule ligne
/*
Commentaire sur plusieurs lignes
*/
Exercice simple:
Concaténakwa ?
Les opérations les plus basiques :
var a = 10;
a + 30; // Addition 40
10 - 5; // Soustraction 5
3 * 2; // Multiplication 6
a = 3 + 3; // on peut modifier une variable en cours de route
a / 2; // Division 3 car a vaut 6
10 % 3; // Modulo (Reste de la division) 1
La concaténation
var concat = 'Hello ' + 'world !';
var prenom = 'Matthieu';
console.log('Hello ' + prenom);
// 0 1 2 3
var tableau = [1, 3, 5, 'toto'];
console.log(tableau[0]); // Affiche 1
console.log(tableau[1] + tableau[2]); // Affiche 8
console.log(tableau[3] + tableau[0]); // Affiche toto1
var personn = {
nom: 'Mota',
prenom: 'Matthieu',
birthday: [18, 11, 1991]
};
console.log(personn.nom); // Affiche Mota
console.log('Né en ' + personn.birthday[2]);
// Né en 1991
En JS, tout est objet !
if (age > 18) {
console.log('Tu peux voir le fil... Plutôt voter :)');
}
10 > 5; // Plus grand que
1 < 0; // Plus petit que
18 >= 18 // Plus grand ou égal
10 <= 11; // Plus petit ou égal à
'bonjour' == 'bonjour'; // Égal à
'bonjour' != 'au revoir'; // Différent de
45 === 45;
// Strictement égal à (compare la valeur et aussi le type de donnée)
'bonjour' !== 2; // Strictement différent de
// false && false;
1 > 2 && 1 > 3; // ET
age > 18 || age == 18; // OU
!false == true; // Renvoie ... ?
var quelquechose = true;
if (quelquechose) { // quelquechose est idem que quelquechose == true
// Si quelquechose est à true
} else {
// Sera toujours executé si quelquechose renvoie false
}
if (quelquechose === false) { // !quelquechose est idem que quelquechose == false
// Si quelquechose est à false
} else if (quelquechose === true) {
// Si quelque chose est true
} else {
// Sera executé dans quel cas ?
}
1. Reprendre le script de l'âge.
Si l'utilisateur a moins de 13 ans : Afficher "Interdit"
Si l'utilisateur a entre 13 et 17 ans : Afficher "Bientôt"
Si l'utilisateur a 18 ans ou plus : Afficher "Autoriser"
2. Imaginons un frigo (qui pourrait être un objet JS). Mon frigo contient 3 tomates, 4 oeufs, 1 pain, 2 jambons, 1 poulet et 1 fromage.
Ce soir, je veux manger quelque chose. Je peux faire 1 sandwich
SI j'ai un 1 pain ET 1 jambon ET une tomate OU un fromage. Attention, dans cette condition il faut absolument un pain ET un jambon et soit une tomate OU un fromage.
SINON, SI j'ai un poulet, je peux manger le poulet.
SINON,
Si j'ai 3 oeufs, je peux manger une omelette
SINON je mange des chips.
3. BONUS (boucles) : Ecrire l'algorithme du PGCD en JavaScript.
Procéder par étape, on a d'abord 2 nombres (Soit 2 variables).
On peut les définir directement dans le JS ou alors les demander à l'utilisateur grâce à prompt.
var i = 1;
i++; // Equivaut à i = i + 1 et renvoie 1, mais i vaut 2
++i; // Equivaut à i = i + 1 et renvoie 3, et i vaut 3
// Fonctionne aussi avec les autres opérateurs
heure = 5;
heure++; // heure devient 6
heure += 2; // heure devient 8
heure /= 2; // heure devient 4
heure %= 3; // heure devient 1
for (var i = 0; i < 5; i++) {
console.log(i);
}
personn = ['Théo', 'Jean', 'Eric'];
for (var i = 0; i < personn.length; i++) {
console.log(personn[i]);
}
var i = 0;
while (i < 5) {
console.log(i++);
}
personn = {
name: 'Matthieu',
age: 26
}
for (key in personn) {
console.log(personn[key]);
}
1. Grâce à la boucle for, écrire les nombres de 1 à 10.
2. Grâce à la boucle for, écrire les nombres de 10 à 2.
3. Grâce à la boucle for, afficher les nombres de 1 à 100 mais uniquement les nombres pairs.
4. Grâce au while, demandez à l'utilisateur s'il veut continuer sur le site, il doit répondre "oui", "non", "o" ou "n". Tant qu'il ne répond pas une de ces valeurs, lui reposer la question.
On veut créer un jeu du "C'est plus, c'est moins."
Le principe est simple.
L'utilisateur arrive sur la page web, on lui demande de saisir un nombre entre 1 et 100. Il doit trouver le bon nombre, tant qu'il ne l'a pas trouvé, on lui indique si le nombre à trouver est plus grand ou plus petit que celui qu'il a saisi.
S'il trouve le bon nombre, la partie s'arrête.
S'il retourne sur la page, le nombre doit changer.
On veut simuler un distributeur de boisson qui propose du thé, du café ou du chocolat. Chaque boisson peut être non sucrée, sucrée ou très sucrée avec une option de lait.
- Le café et le thé coûtent 40 centimes, le chocolat 60 centimes
- Une portion de sucre coûte 5 centimes (sucrée = 1 portion, très sucrée = 2 portions)
- Le lait coûte 15 centimes
L'utilisateur doit entrer caf, cho ou the (insensible à la casse) pour choisir sa boisson. Tant qu'il ne choisit pas une boisson valable, on lui repose la question. Il doit ensuite choisir la dose de sucre (0, 1 ou 2) et le lait (0 ou 1). Il ne pourra pas choisir de lait s'il a pris un chocolat.
On affichera ensuite les phrases suivantes :
- Vous devez payer 50 centimes.
- Votre café très sucré sans lait est prêt.
- Ajouter un bouton qui permet de lancer l'action de distribuer une boisson
- Créer un objet distributeur qui contiendra la monnaie du distributeur, les doses de café / thé / chocolat ainsi que les doses de sucre
- Chaque distribution réduira le nombre de doses (café, thé, chocolat et sucre) mais augmentera la tirelire
- Ajouter une action permettant de voir le montant dans la tirelire
- Ajouter une action permettant de remplir la machine, on demandera au technicien ce qu'il souhaite ajouter (café, thé, chocolat ou sucre) ainsi que la quantité
- Panne aléatoire: La machine tombe en panne aléatoirement (entre 15 et 20 distributions). Si c'est le cas, on ne peut plus se servir mais on ajoutera une action permettant de réparer la machine (Il faudra un booléen ? Et une valeur aléatoire ?)
On veut simuler un distributeur de billets qui propose des billets de 500, 200, 100, 50, 20, 10 et 5 euros. Il peut également donner des pièces de 2 ou 1 euro(s).
L'utilisateur doit saisir un montant puis le distributeur doit lui donner le bon compte de billets. On s'assurera que le montant soit bien un entier. Par exemple, si l'utilisateur veut retirer 1389 euros, on affichera :
- 2 billets de 500 euros - 1 billet de 200 euros
- 1 billet de 100 euros - 1 billet de 50 euros - 1 billet de 20 euros
- 1 billet de 10 euros - 1 billet de 5 euros - 2 pièces de 2 euros
N'oubliez pas le fameux modulo...
- Ajouter un bouton qui permet de lancer l'action de retirer de l'argent
- Ajouter la possibilité de choisir les coupures à retirer (uniquement 200, 50...)
- Ajouter un stock au distributeur (uniquement par le montant), une fois le stock atteint, on ne pourra plus retirer. Ajouter un bouton permettant de remplir le distributeur.
- Ajouter un stock pour chaque billet. Si un billet n'est pas disponible, on essaye de faire la distribution avec d'autres billets. Sinon, on ne peut pas faire la distribution.
- Créer un bouton achat, l'utilisateur saisit un montant. Ce montant s'ajoute dans un objet. Chaque action sur le bouton augmente le montant.
- On peut maintenant ajouter un bouton commander, on affiche le montant total à payer par l'utilisateur. S'il donne le montant exact, tout est ok. S'il donne moins, on lui demande le restant jusqu'à la somme exacte. S'il donne plus, on doit lui rendre la monnaie.
Exemple: Achat de 50 euros, Achat de 100 euros, Achat de 100 euros.
L'utilisateur doit payer 250 euros. S'il donne 200, on lui demande 50. S'il donne 100, on lui rend 5 fois 10 euros. On ne peut lui rendre que 10 euros, 5 euros ou 1 euro.
var tableau = [
['X', 'X', 'O'],
['X', 'O', 'X'],
['O', 'X', 'X']
];
console.log(tableau[1][1]); // Affiche O
console.log(tableau[0][2]); // Affiche O
console.log(tableau[2][1]); // Affiche X
var alphabet = ['d', 'e', 'f'];
alphabet.push('g'); // Ajoute g à la suite du tableau
alphabet.pop(); // Enlève g ou le dernier élément du tableau
alphabet.unshift('c'); // Ajoute c devant d
alphabet.shift(); // Enlève c
var numbers = [1, 2, 3];
numbers.map(function (n) {
return n * 2;
}); // Renvoie [2, 4, 6]
numbers.filter(function (n) {
return n > 2;
}); // Renvoie [4, 6]
[{ firstname: 'Fiorella', name: 'Mota' }]
. Transformer ensuite ce tableau d'objet en tableau de chaine ['Fiorella Mota']
.[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 4, 3, 4, 16, 5, 6, 36, 7, 8, 64, 9, 10, 100]
// Cette fonction attend un ingrédient comme paramètre et le transforme en farine
function moulin (ingredient) {
return 'Je transforme le ' + ingredient + ' en superbe farine !';
}
moulin('blé');
var addition = function (n1, n2) { // Plusieurs paramètres
return n1 + n2;
}
var resultat = addition(1, 3);
console.log(resultat); // Affiche 4
var globale = 'Je suis accessible de partout';
function myPreetyFunction () {
var locale = 'Je ne suis accessible que dans la fonction';
globale2 = 'Je serais accessible en dehors de la fonction';
console.log(globale); // Fonctionne
}
console.log(globale2); // Ne fonctionne pas
myPreetyFunction();
console.log(globale); // Fonctionne
console.log(locale); // Ne fonctionne pas
console.log(globale2); // Fonctionne
// Récupére le body
document.body;
// Récupère l'élément qui a l'id #header
document.getElementById('header');
// Récupère les éléments qui ont la class .container (tableau)
document.getElementsByClassName('container');
// Récupère toutes les div
document.getElementsByTagName('div');
// <div id="div" class="Classe">Contenu</div>
var div = document.getElementById('div'); // Je récupére la div #div
console.log(div.className); // Affiche la classe de la div
console.log(div.id); // Affiche l'id de la div
console.log(div.textContent); // Affiche le contenu de la div
div.textContent = 'Nouveau contenu'; // Change le contenu de la div avec du texte
div.innerHTML = '<p>Nouveau contenu</p>'; // Change le contenu de la div avec du HTML
// Créer un élément HTML en JS
var p = document.createElement('p');
p.textContent = 'Super p en javascript';
document.body.appendChild(p); // J'ajoute le p dans body
On peut manipuler le HTML
// <div id="div" class="Classe">Contenu</div>
var div = document.querySelector('#div'); // Je récupére la div #div
var sameDiv = document.querySelector('.Classe'); // Je récupére la div .Classe
// <span>A</span><span>B</span><span>C</span>
var spans = document.querySelectorAll('span');
for (span of spans) {
console.log(span.textContent);
}
On peut manipuler le HTML avec une alternative qui ressemble au CSS
1. Créer une variable title où on va stocker le h1 qui a l'id #title
Modifier le contenu du h1 par "Hey, j'ai changé mon titre en JavaScript"
2. Créer une balise p en JavaScript, ajouter dans son contenu "Un super paragraphe en JS". Ajouter la balise p dans la première div qui a la classe .container. Ajouter un id sur le p.
3. Créer 3 divs avec les nombres 1, 2 et 3 dans chacune des divs. Remplacer ce nombre par son carré.
// <div id="div" class="Classe">Contenu</div>
// On prend la première div de celles qui ont la classe .Classe
var div = document.getElementsByClassName('Classe')[0];
div.style.fontSize = '18px'; // Je modifier la font-size à 18px
div.style.backgroundColor = '#000'; // Je change le fond en noir
console.log(div.style.backgroundColor); // Affiche rgb(0, 0, 0)
1. Changer la couleur de fond de body avec #d5b9b9 en JavaScript
2. Augmenter la taille des paragraphes à 21px
3. Créer une balise a, ajouter un lien via l'attribut href (en js) vers https://developer.mozilla.org/
4. Changer la couleur du a en couleur #ffffff et non souligné (en js)
BONUS: créer une fonction qui génére un code couleur aléatoire.
On peut intercepter les événements se produisant sur une page web et exécuter une fonction à ce moment.
Comment écouter un événement ? Avec un écouteur !
// Ancienne syntaxe - DOM-0
elementHTML.onclick = function () {
console.log('Je clique');
}
// Nouvelle syntaxe - DOM-2
elementHTML.addEventListener('click', function () {
console.log('Je clique');
});
elementHTML.addEventListener('mouseenter', function () {
console.log('Je survol');
});
elementHTML.addEventListener('keydown', function (event) {
// L'action par défaut ne sera pas exécutée
// (pour un lien ou un formulaire par exemple)
event.preventDefault();
console.log(event.key); // Affiche la touche enfoncée
});
1. Créer une page HTML, ajouter une balise img avec une image. Au survol, sur l'image, changer le src de l'image par une autre image.
2. Ajouter une balise h1, lors du click sur celle-ci, changer la couleur du h1.
3. Ajouter un bouton. Lors du click sur celui-ci, changer le background color du body
4. Créer un formulaire avec un input text et un bouton. Lors du clic sur le bouton, faire une alerte avec la valeur saisie dans le input
// <div id="div" class="a b">Contenu</div>
var div = document.querySelector('#div'); // Je récupére la div #div
console.log(div.classList); // On voit toutes les classes de la div
div.classList.add('c'); // Ajoute la classe c à la div
div.classList.remove('b'); // Retire la classe b à la div
div.classList.add('d', 'e'); // Ajoute les classes d et e à la div
// Ajoute ou retire la classe foo en fonction de sa présence
div.classList.toggle('foo');
// Renvoie true si la div contient la classe foo
console.log(div.classList.contains('foo'));
// Remplace la classe foo par la classe bar
div.classList.replace('foo', 'bar');
On peut manipuler facilement les classes HTML
1. Créer 3 cartes en HTML / CSS avec une bordure grise
2. Au clic sur l'une des cartes, ajouter une classe "selected" sur cette carte. Appliquer le CSS suivant à cette classe : bordure noire, ombre et fond gris.
3. Si on clique sur une nouvelle carte, on doit retirer la classe "selected" de toutes les autres cartes avant de l'ajouter sur cette carte.
4. On doit pouvoir désélectionner une carte.
1. Reprendre l'exercice du paragraphe avec le mot en vert (Slide 43).
2. Ajouter un input où on va pouvoir saisir le mot. Par défaut, ce sera Lorem.
3. On ajoute un bouton "Filtrer", au clic, on va donc chercher le mot qui a été saisi et c'est lui que l'on affichera en vert.
4. Modifier le code existant pour que cela fonctionne. Il faut un écouteur d'événement et il faut remplacer le "lorem" par quelque chose.
let t = setTimeout(function () {
alert('Je m\'affiche dans 3 secondes');
}, 3000);
let i = setInterval(function () {
alert('Je m\'affiche toutes les 1 secondes');
}, 1000);
// On peut arrêter le setTimeout ou le setInterval
// en les stockant dans des variables
clearTimeout(t);
clearInterval(i);
1. Ecrire un script qui change le contenu d'un h1 toutes les 5 secondes avec les valeurs suivantes: Intégrateur, Développeur, Administrateur système.
2. Ecrire un script qui change la couleur de fond du body au bout de 5 secondes avec une transition
3. Renseignez vous sur la classe Date et essayez d'afficher l'heure sur une page au format HH:MM:SS
Exemple : new Date().getFullYear()
4. Rafraichir la valeur de l'heure toutes les secondes
Nous allons créer un chronomètre. On aura un bouton pour démarrer, arrêter ou remettre à zéro le chronomètre.
Le bouton démarrer lancera le chrono, il faudra incrémenter de 1 une variable sec. On devra répéter cela toutes les secondes. Bien sûr, arrivé à 60, on devra remettre sec à 0 et incrémenter min. On fera la même chose pour les heures.
Le bouton arrêter devra stopper le chronomètre mais le temps écoulé restera. Il faudra trouver un moyen d'arrêter la répétition chaque seconde.
Le bouton reset remettra à zéro toutes les variables et arrêtera l'incrémentation des variables.
On ajoutera des raccourcis clavier. La touche espace permettra de lancer ou de stopper le chronomètre en fonction de son état actuel. La touche R permettra de remettre à zéro le chronomètre
On ajoutera un mode précision sur le chronomètre qui permettra d'avoir les millisecondes.
var today = new Date();
// Thu May 19 2022 10:07:25 GMT+0200 (heure d’été d’Europe centrale)
console.log(today);
today.getDay(); // 3
today.getMonth(); // May
today.getFullYear(); // 2022
today.getTime(); // 1652948630799 = Timestamp en millisecondes
Date.now(); // 1652948630799 = Timestamp en millisecondes
Math.floor(Date.now() / 1000); // 1652948630 = Timestamp
var birthday = new Date('November 18, 1991 23:15:24');
birthday.getFullYear(); // 1991
// 690502524000 = Timestamp en millisecondes
Date.parse('November 18, 1991 23:15:24');
Afficher le jour de votre anniversaire dans un h1 en utilisant l'objet Date en JS. N'oubliez pas que 0 correspond à dimanche, 1 à lundi... jusque samedi = 6
Récupérer l'année actuelle et la soustraire à votre année de naissance pour déterminer à peu près votre âge.
Soustraire le timestamp de votre date de naissance et de maintenant, vous obtenez le nombre de millisecondes entre les 2 dates.
On va maintenant transformer les millisecondes en affichage simple. Exemple: 123000 devient 2m3s
On va donc faire 123 000 / 1000
Ensuite on utilise le modulo pour extraire les 3 secondes
On divise ensuite 120 par 60 (le nombre ne tombe pas toujours juste donc on devra arrondir et faire un modulo 60 derrière). On fait pareil avec les heures et les jours.
Vous savez maintenant combien il reste de jours avant votre anniversaire.
On va créer un système de tâche se déclenchant à une date donnée
On aura un formulaire où on entre heures, minutes et secondes
On lance l'exécution à 11h45m01s par exemple et il est 11h30m00s, on affiche "L'opération sera lancée dans 901 secondes"
On utilisera le setTimeOut pour ensuite afficher "Le moment est venu" dès qu'une tâche se réalise
On pourra créer plusieurs tâches
Ici, je vous donne quelques exercices sur le DOM avec les fichiers HTML pré-faits.
On peut valider les données des formulaires en JavaScript. Attention, il faudra toujours valider les données en PHP ou côté back end.
<form action="" method="post" id="form">
<div id="errors"></div>
<input type="text" id="firstname" placeholder="Prénom">
<label for="uppercase">
<input type="checkbox" id="uppercase">
En majuscule ?
</label>
<select id="gender">
<option value="fille">Fille</option>
<option value="garcon">Garçon</option>
</select>
<button>Afficher</button>
</form>
<div id="result"></div>
let firstname = document.getElementById('firstname');
let uppercase = document.getElementById('uppercase');
let gender = document.getElementById('gender');
let errors = document.getElementById('errors');
let result = document.getElementById('result');
document.getElementById('form').addEventListener('submit', function (event) {
// On évite d'envoyer le formulaire au serveur
event.preventDefault();
errors.innerHTML = ''; // On vide les erreurs
result.innerHTML = '';
if (firstname.value.length <= 0) {
firstname.style.border = '1px solid red';
errors.innerHTML += '<p style="color: red">Le prénom est trop court</p>';
}
if (!errors.hasChildNodes()) {
firstname.style.border = '1px solid green';
let name = uppercase.checked ? firstname.value.toUpperCase() : firstname.value;
let type = gender.options[gender.selectedIndex];
if (type.value == 'fille') {
type = 'une fille 👩';
} else {
type = 'un garçon 🧑';
}
result.innerHTML = `<h1>${name}, tu es ${type}</h1>`;
}
});
firstname.addEventListener('keyup', function () {
// this équivaut à l'objet firstname
let name = uppercase.checked ? this.value.toUpperCase() : this.value;
result.innerHTML = `<h1>${name}</h1>`;
});
uppercase.addEventListener('change', function () {
let name = this.checked ? firstname.value.toUpperCase() : firstname.value.toLowerCase();
firstname.value = name;
result.innerHTML = `<h1>${name}</h1>`;
});
Variante où on affiche la valeur saisie en temps réel
Permet de stocker des données en local sur le navigateur.
// Stocke la valeur Fiorella dans la clé contact
localStorage.setItem('contact', 'Fiorella');
// Retourne l'item qui a la clé contact
localStorage.getItem('contact');
// Supprime l'item qui a la clé contact
localStorage.removeItem('contact');
// Efface toutes les données
localStorage.clear();
// Retourne le nombre de données
localStorage.length;
// Retourne l'élément à la position 1
localStorage.key(1);
On peut également utiliser sessionStorage où le stockage est temporaire.