JavaScript
JavaScript
Comportement (JavaScript)
Présentation (CSS)
https://www.w3schools.com/js/default.asp
Motivation
Most popular
technologies in
2024
https://survey.stackoverflow
.co/2024/technology#most-
popular-technologies-
language-prof
7
Motivation
Best
Programming
Languages to
Learn in 2025
https://www.fullstackacade
my.com/blog/nine-best-
programming-languages-
to-learn
Quelques idées fausses
8
Quelques idées fausses
9
Quelques idées fausses
https://www.w3schools.com/js/default.asp
• JavaScript est le langage du Web
JavaScript serait donc la
seule technologie
applicative côté client ? • Mais avec :
• JavaScript intégré en standard aux • le développement d'AJAX (Asynchronous
navigateurs Web JavaScript and XML)
• la normalisation du langage et un meilleur
support par tous les navigateurs
• l'introduction de HTML5 (et de ses
nombreuses API JavaScript)
JavaScript
• D'autres technologies ont été est revenu
développées pour s'exécuter côté au tout 1er
client
plan
- Adobe Flash
8
- applets Java
Quelques idées fausses
https://www.w3schools.com/js/default.asp
• JSON s'impose de
plus en plus comme
• Historiquement un format d'échange • Depuis 2009/2010 de plus
de données
JavaScript intégré aux en plus présent côté serveur
navigateurs
9
Quelques idées fausses
https://www.w3schools.com/js/default.asp
1
Historique
ECMAScript 4 ECMAScript 6*
JScript début des travaux let, const
(MS IE 3.0) classes et modules
ECMAScript 3 ECMAScript 4 Chrome
ECMAScript 2 abandon moteur ECMAScript 7
Javascript V8 opérateur **
ECMA-262 Ed.1 Array.protype.includes
(ECMAScript 1) ECMAScript 5 ECMAScript 8
TC39 commitee mode strict async/wait
(Mai) Brendan Eich 🡪Mocha JSON
ECMAScript 9
(Sep.) Mocha 🡪LiveScript Node JS
propriétés rest/spread,
(Dec.) LiveScript 🡪JavaScript basé sur V8
iteration asynchrone
(Netscape Navigator 2.0) de Chrome
ajouts aux RegExp 1
ECMA stands for - European Computer Manufacturer's Association
Support par les différents navigateurs
https://www.w3schools.com/js/js_versions.asp 13
Environnements d'exécution JavaScript
JavaScript
Engine
Chrome: V8
Firefox: SpiderMonkey
Environnement JS
Environnement JS Safari: WebKit
14
JavaScript dans un navigateur
Et alors ? En quoi
• Code JavaScript peut être inclus dans des pages HTML JavaScript est-il si différent
d'autres langages comme
PHP, JSP, ASP ?
1
JavaScript dans le navigateur
• un script JavaScript s'exécute côté client (dans le navigateur)
GET HelloWorld.html
https://www.xenonstack.com/insights/guide-webassembly/
• WebAssembly
- Nouveau type de code pouvant être exécuté dans les navigateurs
modernes
- Format binaire compact, rapide à charger et à exécuter
🡪 performances proches du code natif
- Conçu pour être une cible de compilation efficace pour des
langages source de bas niveau (C, C++, Rust, …)
1
WebAssembly: exemple
Google Earth :
cartographie 3D
https://earth.google.com/web/
1
WebAssembly
Assembleur : représente le langage
machine sous une forme textuelle
lisible par un humain
<head>
<script>
• la balise <scr ipt> délimite code JavaScript statement
</script>
• peut être insérée soit dans l'entête (<head>) soit dans <script src="myScript.js">
</script>
le corps (<body>) de la page HTML
</head>
• les scripts sont exécutés dans leur ordre <b…
o d y>
d'apparition dans la page code HTML
….
o Placer les scripts dans l'en tête pour qu'ils soient
chargés et exécutés avant la construction et <script>
statement
l'affichage de la page …
o Par défaut, les scripts placés dans le body sont </script>
exécutés au fur et à mesure que celui-ci est …
chargé et que le DOM est construit.=> met en code HTML
attente le moteur d'analyse HTML/CSS. ….
o Souvent les scripts sont placés à la fin du corps <script src="myScript2.js">
de la page (juste avant </body>) => améliorer la </script>
vitesse de chargement de la page.
2
Intégration de JavaScript dans HTML
Il existe 2 manières pour insérer un code JavaScript dans une page HTML:
25
Structures de contrôle
• Boucle itérative :
for(initialisation ; condition ; opération ) { ... instructions ... }
26
Structures de contrôle
• Boucle conditionnelle
while(condition) { ... instructions ... }
27
Concaténation des chaines de caractères
avec des expressions
• On peut utiliser l’opérateur + pour faire la • On peut utiliser les littéraux de gabarits
concaténation: (template literal)
Fonctions simples
Syntaxe:
function nom_fonction ([param1, …]){
//Corps de la fonction
}
Corps de la fonction :
Déclaration des variables,
Instructions réalisées par la fonction,
Instruction return pour renvoyer une valeur ou un objet (Facultative)
29
Déclaration de variables
30
Déclaration de variables
• Utilisation de l’instruction
[var , let , const , ] variable=valeur;
• Pas de typage (détection automatique par l’interpréteur)
• Nom de variable sensible à la casse.
• Portée :
• globale visibilité dans tout le script (var (en dehors de la fonction), ou sans
mot clé)
• fonction visibilité dans la fonction la où elle a été déclarée (var (dans la
fonction)
• bloc visibilité dans le bloc interne (let ou const)
31
Portée de variables
• var : La variable est accessible dans toute la fonction où elle est déclarée. Si elle est déclarée en
dehors d’une fonction, elle devient globale.
• let et const : La variable est limitée au bloc ({}) dans lequel elle est déclarée.
• Sans mot clé : La variable est automatiquement ajoutée à l'objet global (window dans les
navigateurs), ce qui peut causer des problèmes.
Portée fonction et portée globale
• Une variable déclarée avec le mot clé var pourra avoir deux portées: globale ou fonction.
• La portée d’une variable déclarée par var dépend de l’endroit où elle est déclarée :
• Portée globale: déclarée en dehors de la fonction.
• Portée fonction: déclarée à l’intérieur d’une fonction aura une portée limitée à cette
seule fonction.
• Une variable déclarée globale est accessible depuis l’objet global window.
Portée fonction et portée globale
• Si on n’utilise pas de mot clé dans la déclaration de variables, on crée des
variables globales.
• => Déconseiller à faire
Déclaration de variables: portée bloc
35
Déclaration de variables: portée bloc
Déclaration de variables: let vs const
• Une variable déclarée avec let est modifiable : • Une variable déclarée avec const est immuable :
Expressions de Fonction
38
Expressions de Fonction et Portée
const nom_fonction=([param1,…])=>{
//Corps de la fonction
}
• const et let permet d’empêcher la redéfinition de la fonction une deuxième
fois puisqu’ils sont de type bloc.
• Si on a une seule instruction dans une fonction, on peut ne pas utiliser le mot
clé return ni d’accolades { }.
Fonctions anonymes
function message() {
console.log("Bonjour!");
}
• La proprièté length
tableau.length
• Parcourir un tableau
// Parcourir un tableau sans connaître le nombre
d'éléments
let tableau= new Array(1, "a", 9) ;
for (let i=0; i<tableau.length; i++)
console.log("tableau[" + i + "] = "+tableau[i]); 44
Utilisation de tableaux
https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Global_Objects/Array
L'objet String
https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Global_Objects/String
L'objet Math
• Propriétés :
• E : renvoie la valeur de la constante d'Euler (~2.718);
• LN2 : renvoie le logarithme népérien de 2 (~0.693);
• LN10 : renvoie le logarithme népérien de 10 (~2.302);
• LOG2E : renvoie le logarithme en base 2 de e (~1.442);
• LOG10E : renvoie le logarithme en base 10 de e (~0.434);
• PI : renvoie la valeur du nombre pi (~3.14159);
• SQRT1_2 : renvoie 1 sur racine carrée de 2 (~0.707);
• SQRT2 : renvoie la racine carrée de 2 (~1.414);
L'objet Math
• Méthodes :
• abs( ), exp( ), log(), sin( ), cos( ), tan( ), asin( ), acos( ), atan( ), max( ), min( ), sqrt( )
sont les opérations mathématiques habituelles;
• atan2( ) : retourne la valeur radian de l'angle entre l'axe des abscisses et un point;
• ceil( ) : retourne le plus petit entier supérieur à un nombre;
• floor( ) : retourne le plus grand entier inférieur à un nombre;
• pow( ) : retourne le résultat d'un nombre mis à une certaine puissance;
• random( ) : retourne un nombre aléatoire entre 0 et 1;
• round( ) : arrondi un nombre à l'entier le plus proche.
https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Global_Objects/Math
L'objet Date
• Méthodes
• Constructeur
• getDay(), attention de 0 (dimanche) à 6 (samedi)…
• getDate() / setDate()
• getMonth() / setMonth(), attention de 0 à 11…
• getYear() / setYear() / getFullYear() / setFullYear()
• getHours()/ setHours()
• getMinutes() / setMinutes()
• getTime() / setTime() let jour = new Date();
alert(jour.getFullYear()); // 2025
https://developer.mozilla.org/fr/docs/Web/J let anniversaire = new Date(2002, 10, 25);
avaScript/Reference/Global_Objects/Date alert(anniversaire.toLocaleString());
// 25/11/2002 00:00:00
L’objet Function
• eval(chaine)
• isFinite(nombre)
• isNaN(objet)
• parseFloat(chaine)
• parseInt(chaine)
Fonctions supérieures
document.write(isFinite(Math.log(0))) ;
➔ false
document.write(isNaN("abcd")) ;
➔ true
document.write("12.34"+2) ;
➔ 12.342
document.write(parseFloat("12.34")+2) ;
➔ 14.34
JavaScript
Objets propres
Déclaration et création d’objets: Objets propres
• Déclaration de méthodes
• Association de fonctions dans la création de l’objet.
} this.saluer = function () {
}; }
• En JavaScript, les objets littéraux ne sont pas des constructeurs et n'ont pas de propriété
prototype directement accessible.
const Animal = {
type: "Invertébrés", // Valeur par défaut
afficherType: function () {
console.log(this.type);
}
};
Ajouter une méthode au prototype d'un objet littéral
} };
// Créer un nouvel objet qui hérite de Animal
};
// Ajouter une nouvelle méthode à l'objet Animal let animal1 = Object.create(Animal);
// Ajouter une méthode au prototype de Animal
Animal.deplacer = function () {
Object.getPrototypeOf(Animal).deplacer = function () {
console.log("Je me déplace"); console.log("Je me déplace");
}; };
Animal.deplacer(); // Affiche "Je me déplace"
animal1.deplacer(); // Affiche "Je me déplace"
Chaînage de prototype (Prototype Chain)
1. Définir une fonction constructeur « Produit » avec les attributs libelle , catégorie et
prix.
2. Ajouter la méthode description() au prototype de « Produit » pour afficher son détail.
3. Définir une fonction constructeur « Commande » qui comporte un attribut tableau de
produits.
4. Ajouter les méthodes ajouter() et afficher() au prototype de « Commande » pour
ajouter des produits au tableau et afficher l’ensemble de produits
5. Créer une instance de « Commande » et y ajouter des produits.
6. Afficher les produits d’une commande en utilisant la méthode affiche().
Solution
function Commande() {
this.produits = []; // Tableau de produits
}
Commande.prototype.ajouter = function (produit) {
this.produits.push(produit);
console.log(`${produit.libelle} a été ajouté à la commande.`);
};
Commande.prototype.afficher = function () {
console.log("Liste des produits dans la commande :");
this.produits.forEach((produit) => produit.description());
};
Solution
• En ES6, les classes ont été introduites pour offrir une syntaxe
plus claire et plus structurée pour la création d'objets et
l'héritage.
• Elles sont en réalité une surcouche aux fonctions
« constructeur » et au prototype.
• On peut déclarer une classe avec le mot-clé class
Classes en JavaScript ES6: Constructeur
Les classes permettent de définir des méthodes directement dans leur corps :
class Etudiant {
constructor(nom, cne, filiere) {
this.nom = nom;
this.cne = cne;
this.filiere = filiere;
}
affiche() {
return `L'étudiant: ${this.nom} est inscrit en ${this.filiere}`;
}
}
const etd1 = new Etudiant("Ali", 123, "MIP");
console.log(etd1.affiche()); // L'étudiant: Ali est inscrit en MIP
Classes en JavaScript ES6: Héritage
class MathUtil {
static add(a, b) {
return a + b;
}
}
console.log(MathUtil.add(5, 3)); // 8
Classes en JavaScript ES6: Encapsulation
class Produit {
constructor(libelle, categorie, prix) {
this.libelle = libelle;
this.categorie = categorie;
this.prix = prix;
}
description() {
console.log(
`Produit: ${this.libelle},Catégorie: ${this.categorie},Prix: ${
this.prix} DH`
);
}
}
Solution
class Commande {
constructor() {
this.listproduits = new Array();
}
ajouter(p) {
this.listproduits.push(p);
}
afficher() {
console.log("Liste des produits dans la commande :");
this.listproduits.forEach((produit) => produit.description());
}
}
Solution
• Programmation événementielle
• JavaScript = langage réactif
• L’interaction avec l’utilisateur est gérée via des événements
• Événement = tout changement d’état du navigateur
82
Déclenchement d’instructions JavaScript
• Événements JavaScript
• blur : le focus est enlevé d’un objet
• focus : le focus est donné à un objet
• change : la valeur d’un champ de formulaire à été modifiée par l’utilisateur
• mouseover :la souris est déplacée sur un objet
• click : un clic souris est déclenché sur un objet
• select : un champ de formulaire est sélectionné (par tabulation)
• submit : un formulaire est soumis
• load : la page est chargée par le navigateur
• unload : l’utilisateur quitte la page
83
Déclenchement d’instructions JavaScript
84
Déclenchement d’instructions JavaScript
85
Changer l’aspect du formulaire
Changer l’aspect du formulaire
<form>
<input type="text" value="" name="texte1" onBlur="unchanger(this)" onFocus="changer(this)"/>
<input type="text" value="" name="texte2" onBlur="unchanger(this)" onFocus ="changer(this)"/>
<input type="submit"/>
</form>
<script>
let changer=function(texte){
texte.style.border="2px solid green";
}
let unchanger=function(texte){
texte.style.border="";
}
</script>
Contrôle du formulaire
Contrôle du formulaire
Lorsqu'une page Web est chargée, le navigateur crée un modèle de document pour cette
page. La hiérarchie est utilisée pour organiser vos éléments HTML.
Utilisation du DOM
A l’aide de Javascript :
• On peut sélectionner un élément (<p> par
exemple), et modifier sa couleur (DOM
document + DOM element).
• On peut sélectionner un élément et lui
assigner un événement (DOM document +
DOM events).
• On peut sélectionner les attributs ("title" par
exemple) et changer leur contenu (je remplace
title="image2" par title="beau tigre") (DOM
document + DOM attribute).
DOM « document »
objet.addEventListener(eventType, listenerFunction)
• click • Error
• dblclick • load
• mousedown • resize
• mousemove • scroll
• mouseover • unload
• mouseout • blur
• mouseup • change
• keydown • focus
• keypress • reset
• keyup • select
• abort • submit
DOM « events »: addEventListener
• Exemple 1:
window.addEventListener('load',function(){
console.log('la page est totalement chargée');
});
➢Exemple 2:
document.addEventListener('DOMContentLoaded',function(){
let img = document.getElementsByTagName("img")[0];
img.addEventListener('mouseover',function(){
img.style.opacity=0.5;
});
img.addEventListener('mouseout',function(){
img.style.setProperty('opacity',1);
});
});
DOM « events »: addEventListener
➢ dans une fonction listener, la variable this est définie et désigne l’objet qui a déclenché
l’événement typiquement l’élément du document.
➢ un objet event est créé pour chaque événement. Cet objet est passé en paramètre lors du
déclenchement de la fonction listener associée. Le type d’objet event varie selon
l’événement. Un objet event possède des propriétés qui informent sur l’événement.
DOM « events »: addEventListener
document.addEventListener("DOMContentLoaded", () => {
let images = document.querySelectorAll("img");
Event interface
images.forEach((img) => {
img.addEventListener("mousemove", (event) => {
event.target.style.setProperty("opacity", 0.5);
});
}); Event interface
images.forEach((img) => {
img.addEventListener("mouseout", (event) => {
event.target.style.setProperty("opacity", 1);
});
});
});
Modifier le DOM
• Ecrire une page HTML qui contient un script qui vérifie lors de la
soumission du formulaire, si le champ n’est pas vide, sinon, un
message d’erreur est affiché.
1. Utiliser innerHTML pour insérer le message dans la balise span, en gras avec
une couleur rouge.
2. Utiliser une modification manuelle sur le DOM.
//classe bootstrap
form-control is-valid
//classe bootstrap
form-control is-
invalid