Séance n°6 : Initiation JavaScript

JavaScript

Intégration

Un script JavaScript peut être intégré de deux façons différentes :

  • En écrivant le code directement dans la balise : <script>/* Code JavaScript */</script>

    Code HTML

    <!-- Exemple JavaScript -->
    <script>console.log("Hello JavaScript!");</script>
  • En tapant le code dans un fichier à part, puis l'intégrer à l'aide de la balise : <script src="URL/fichier.js"></script>

    Code HTML

    <script src="welcome.js"></script>

    Code JavaScript (dans le fichier welcome.js)

    // Exemple JavaScript
    console.log("Hello JavaScript!");

Le Document Object Model (DOM)

1. Qu'est-ce que le DOM ?

Lorsqu'un navigateur charge une page web, il analyse le code HTML et construit automatiquement en mémoire vive une structure hiérarchique arborescente appelée le DOM (Document Object Model ou Modèle Objet de Document).

Dans cet arbre du DOM :

  • La racine de l'arbre est l'objet document (accessible directement en JavaScript via window.document ou document).
  • Chaque balise HTML (<html>, <body>, <h1>, <p>, <button>, etc.) devient un nœud élément (Element node).
  • Le texte contenu à l'intérieur des balises forme des nœuds de texte (Text node).
  • Les attributs HTML (id, class, src, href, value) constituent des propriétés directement accessibles et modifiables de ces objets.
Rôle de JavaScript : Le DOM constitue l'interface de programmation (API) qui relie la page web au code JavaScript. Grâce au DOM, JavaScript peut lire, ajouter, modifier ou supprimer n'importe quel élément ou style de la page en temps réel, sans recharger la page.
Représentation arborescente du DOM
Représentation de la page HTML sous forme d'arbre hiérarchique d'objets (DOM)

2. Comment manipuler le DOM avec JavaScript ?

La manipulation du DOM avec JavaScript repose sur une démarche méthodique en 3 étapes clés :

Les 3 étapes de manipulation du DOM
Les 3 étapes clés pour manipuler un élément du DOM avec JavaScript

Ciblage des éléments HTML : Le ciblage des éléments se fait à l'aide de deux méthodes complémentaires :

  • document.getElementById("monId") : retourne l'élément unique de la page possédant cet identifiant id.
  • document.getElementsByName("monNom") : retourne une collection (liste indexée à partir de 0) de tous les éléments partageant l'attribut name="monNom". C'est la méthode de référence pour manipuler les groupes de boutons radio (<input type="radio">) ou de cases à cocher.
Étape Méthodes / Propriétés Description & Exemple
1. Cibler (Sélectionner) document.getElementById("monId")
document.getElementsByName("monNom")
Recherche et retourne un élément unique (par son id) ou une collection d'éléments (par leur attribut name) :
const titre = document.getElementById("titre");
const radios = document.getElementsByName("genre");
2. Modifier le contenu element.innerHTML = ...
element.value = ...
Modifie le texte brut, injecte du balisage HTML ou met à jour la valeur d'un champ de formulaire :
titre.innerHTML = "Nouveau titre";
3. Modifier styles / attributs element.style.propriete = ...
element.classList.add(...)
element.src = ...
Change l'aspect visuel ou les attributs d'un élément :
titre.style.color = "blue";
titre.style.backgroundColor = "#e0f2fe";

3. Exemple concret de manipulation

Voici un exemple interactif montrant comment cibler un paragraphe et un titre pour en modifier le contenu et les styles au clic sur un bouton :

Code HTML :

<div id="carte-info">
  <h4 id="titre-info">Message initial</h4>
  <p id="texte-info">Le contenu n'a pas encore été modifié par JavaScript.</p>
  <button id="btn-action">Modifier le DOM</button>
</div>

Code CSS :

#carte-info {
  border: 1px solid #dee2e6;
  border-radius: 8px;
  padding: 15px;
  background-color: #f8f9fa;
  width: 320px;
}

#btn-action {
  background-color: #0d6efd;
  color: white;
  border: none;
  padding: 8px 14px;
  border-radius: 4px;
  cursor: pointer;
}

Code JavaScript :

// 1. CIBLER les éléments du DOM par leur identifiant
const titre = document.getElementById("titre-info");
const texte = document.getElementById("texte-info");
const bouton = document.getElementById("btn-action");

// 2. RÉAGIR au clic utilisateur
bouton.onclick = function() {
  // 3. MODIFIER le contenu textuel et HTML
  titre.innerHTML = "DOM modifié avec succès !";
  texte.innerHTML = "Le texte a été <strong>mis à jour</strong> en temps réel sans rechargement.";

  // 4. MODIFIER les styles dynamiquement
  titre.style.color = "#198754";
  texte.style.backgroundColor = "#d1e7dd";
  texte.style.color = "#0f5132";
  texte.style.padding = "10px";
  texte.style.borderRadius = "4px";

  bouton.innerHTML = "✓ Action effectuée";
  bouton.style.backgroundColor = "#198754";
};
Aperçu dans le navigateur
Aperçu dans le navigateur

Affichage

JavaScript permet d'afficher et de restituer les résultats des traitements selon quatre méthodes principales :

Méthode d'affichage Instruction / Propriété Rôle et Cas d'usage
1. Console console.log(...) Écrit dans la console des outils de développement (DevTools F12) pour déboguer le script et traquer les erreurs.
2. Boîte d'alerte alert(...) Ouvre une boîte de dialogue modale surgissante pour alerter l'utilisateur ou afficher un message important.
3. Document HTML document.write(...) / document.writeln(...) Écrit directement du texte ou du balisage dans le flux HTML lors du chargement de la page.
4. Page web (DOM) element.innerHTML
element.value
Modifie dynamiquement le contenu d'une balise HTML ou la valeur d'un champ de formulaire sans recharger la page.

1. Affichage dans la console : console.log()

L'affichage dans la console des outils de développement (F12) permet au développeur de tester des valeurs, de suivre le déroulement du script et de traquer d'éventuelles erreurs sans perturber l'affichage destiné à l'utilisateur.

Exemple : Afficher un message de bienvenue, des variables et un calcul

<script>
  let prenom = "Amine";
  let classe = "3STI";

  // 1. Afficher un message textuel simple
  console.log("Bienvenue dans la console JavaScript !");

  // 2. Afficher plusieurs valeurs et variables séparées par des virgules
  console.log("Bonjour", prenom, "de la classe", classe);

  // 3. Afficher le résultat direct d'une opération
  console.log("Calcul : 12 + 8 =", 12 + 8);
</script>
Console DevTools (F12) > Console
> Bienvenue dans la console JavaScript !
> Bonjour Amine de la classe 3STI
> Calcul : 12 + 8 = 20

2. Affichage dans une boîte d'alerte : alert()

La fonction alert() ouvre une boîte de dialogue modale surgissante au centre du navigateur pour transmettre une information essentielle ou un avertissement à l'utilisateur. L'exécution du script est temporairement suspendue jusqu'à ce que l'utilisateur valide avec le bouton OK.

Exemple : Notification d'accueil et message personnalisé

<script>
  let score = 18;

  // Affichage d'un message direct
  alert("Bienvenue sur le portail Conception Web !");

  // Affichage combinant texte et variable
  alert("Félicitations ! Votre score est de " + score + " / 20.");
</script>
Première boîte d'alerte : Bienvenue

1ère alerte : message textuel direct

Deuxième boîte d'alerte : Score

2ème alerte : texte combiné avec variable

Aperçu exact des boîtes d'alerte modales affichées successivement par le navigateur

3. Affichage dans le document HTML : document.write() / document.writeln()

La méthode document.writeln() écrit directement du texte et du balisage HTML dans la page lors du chargement initial du document.

Exemple : Générer un en-tête et des informations de cours

<script>
  let matiere = "Informatique";
  let niveau = "3ème Sciences de l'Informatique";

  // Générer un titre HTML dans la page
  document.writeln("<h3>Module : " + matiere + "</h3>");

  // Générer des paragraphes avec mise en valeur
  document.writeln("<p>Niveau : <strong>" + niveau + "</strong></p>");
  document.writeln("<p>Année scolaire : <em>2026 / 2027</em></p>");
</script>
Aperçu dans le navigateur
Aperçu dans le navigateur

4. Affichage dans la page web (DOM et formulaires) : innerHTML et value

Une page web possède une structure arborescente formée par ses éléments appelée DOM (Document Object Model). Le langage JavaScript offre plusieurs méthodes pour accéder à ces éléments et manipuler leurs propriétés :

  • document.getElementById("id") : retourne une référence à un élément de la page connaissant son id.
  • document.getElementsByName("nom") : retourne une collection (NodeList) de tous les éléments ayant l'attribut name="nom". Cette méthode est indispensable pour accéder aux groupes de boutons radio (<input type="radio">) partageant le même nom.

L'obtention d'une référence à un élément permet d'agir sur son affichage selon deux techniques complémentaires :

  • Modification du contenu (innerHTML) : pour modifier ou insérer du balisage HTML à l'intérieur d'un élément conteneur à l'aide de : elem.innerHTML = "<p>Code HTML</p>";.
  • Modification de la valeur d'un champ (value) : pour lire ou affecter une valeur dans un composant de formulaire à l'aide de : elem.value = "Une nouvelle valeur";.
A. Affichage dans le contenu d'un élément avec innerHTML

La propriété innerHTML permet d'injecter dynamiquement du texte enrichi ou des balises HTML à l'intérieur d'un conteneur (tel qu'un <div>, <p> ou <span>) sans recharger la page.

Exemple : Mise à jour du message d'état d'un compte élève

Code HTML / JavaScript :

<!-- Balise conteneur dans la page HTML -->
<div id="zone-statut">Chargement en cours...</div>

<script>
  // 1. Récupérer l'élément cible par son id
  const statut = document.getElementById("zone-statut");

  // 2. Injecter du balisage HTML dans son contenu
  statut.innerHTML = "<p class='succes'>Compte actif — Connecté</p>";
</script>

Code CSS :

#zone-statut {
  margin: 15px auto;
  text-align: center;
}

.succes {
  display: inline-block;
  background-color: #d4edda;
  color: #155724;
  border: 1px solid #c3e6cb;
  padding: 8px 16px;
  border-radius: 6px;
  font-weight: bold;
}
Aperçu dans le navigateur
Aperçu dans le navigateur
B. Affichage dans un composant de formulaire avec value

La propriété value permet d'accéder au texte saisi par l'utilisateur ou d'affecter un nouveau résultat dans un champ de formulaire (<input>, <textarea>, <select>).

Exemple : Calculer un prix TTC à partir d'un prix HT saisi

Code HTML / JavaScript :

<form action="#">
  <div>
    <label for="prix_ht">Prix Hors Taxe (DT) :</label>
    <input type="number" id="prix_ht" value="100">
  </div>
  <div>
    <label for="prix_ttc">Prix TTC (TVA 19%) :</label>
    <input type="text" id="prix_ttc" readonly>
  </div>
</form>

<script>
  // 1. Récupérer les références des deux champs
  const champHT = document.getElementById("prix_ht");
  const champTTC = document.getElementById("prix_ttc");

  // 2. Lire la valeur du prix HT (convertie en nombre)
  let ht = Number(champHT.value);

  // 3. Calculer et écrire le résultat dans le champ TTC
  let ttc = ht * 1.19;
  champTTC.value = ttc.toFixed(2) + " DT";
</script>

Code CSS :

form {
  width: 320px;
  margin: 20px auto;
  padding: 15px;
  background-color: #f8f9fa;
  border: 1px solid #ced4da;
  border-radius: 6px;
}

label {
  display: block;
  margin-bottom: 5px;
  font-size: 13px;
  color: #495057;
}

input {
  width: 100%;
  padding: 6px 10px;
  margin-bottom: 12px;
  border: 1px solid #ced4da;
  border-radius: 4px;
  box-sizing: border-box;
}

#prix_ttc {
  background-color: #e9ecef;
  color: #0d6efd;
  font-weight: bold;
}
Aperçu dans le navigateur
Aperçu dans le navigateur

Variables et constantes

On peut déclarer des variables en JavaScript en utilisant les mots clés var et let. Les variables peuvent être initialisées lors de leurs déclaration. Une variable non initialisée contient la valeur : undefined.

Le nom d'une variable doit commencer par une lettre ou par le caractère de soulignement (_). Les caractères suivants peuvent être des lettres, des chiffres et/ou le caractère de soulignement.

Contrairement à une variable dont la valeur peut changer au cours de l'exécution du script, la valeur d'une constante reste inchangée après sa déclaration.

Remarque 1 : Il est vivement conseillé d'utiliser le mot clé let. Le mot clé var est à éviter.

Remarque 2 : JavaScript est sensible à la casse.

Exemple 1 : Déclaration d'une variable

// Déclaration de variables sans initialisation
var x;
let y;
// Déclaration de variables avec initialisation
var nom = "Ahmed";
let age = 16;
console.log(x, y);
console.log(nom, age);
Aperçu dans la console
Aperçu dans la console

Exemple 2 : Sensibilité à la casse

let x = 6;
console.log(X); // Affiche une erreur : X is not defined
console.log(x);
Aperçu dans la console
Aperçu dans la console

Exemple 3 : Constantes vs Variables

// variable
let x = 4;
x = x + 2;
x = x * 5;
console.log(x);
// constante
const y = 5;
y = y + 2;
console.log(y);
Aperçu dans la console
Aperçu dans la console

Types

JavaScript supporte six classes de variables prédéfinis :

  • number : Pour les nombres entiers et réels,
  • string : Pour les chaînes de caractères,
  • boolean : Pour les expressions qui renvoient true ou false,
  • object : Pour les tableaux et les objets définis par l'utilisateur,
  • function : Pour les fonctions,
  • undefined : Pour les variables déclarées sans initialisation.

Le mot clé typeof v retourne le type de v. v est soit une constante ou une variable.

Exemple : Détermination du type avec typeof

console.log(typeof 5.6); // 'number'
console.log(typeof 17);
console.log(typeof Number.NaN);

console.log(typeof "ayoub"); // 'string'

console.log(typeof (5 > 6)); // 'boolean'

console.log(typeof [1, 2, 3]); // 'object'
console.log(typeof null);

let x;
console.log(typeof x); // 'undefined'

console.log(typeof Math.abs); // 'function'
Aperçu dans la console
Aperçu dans la console

Opérateurs

Les opérateurs sont classés en catégories :

Les opérateurs de calcul

Addition Soustration Multiplication Division Modulo
c = a + b; d = a - b; e = a * b; f = a / b; g = a % b;

Exemple 1

let a = 15;
let b = 6;
let c = a + b; console.log(c); // 21
let d = a - b; console.log(d); // 9
let e = a * b; console.log(e); // 90
let f = a / b; console.log(f); // 2.5
let g = a % b; console.log(g); // 3

Les opérateurs assosiatifs

Il s'agit d'une forme plus courte des opérateurs arithmétiques.

Addition Soustration Multiplication Division Modulo
a += b;
Equivalente à :
a = a + b;
a -= b;
Equivalente à :
a = a - b;
a *= b;
Equivalente à :
a = a * b;
a /= b;
Equivalente à :
a = a / b;
a %= b;
Equivalente à :
a = a % b;

Exemple 2

let a = 15;
let b = 6;
a += b; console.log(a); // 15 + 6 = 21
a -= b; console.log(a); // 21 - 6 = 15
a *= b; console.log(a); // 15 * 6 = 90
a /= b; console.log(a); // 80 / 6 = 15
a %= b; console.log(a); // 15 % 6 = 3

Les opérateurs d'incrémention

Il s'agit d'une forme plus courte des opérateurs arithmétiques.

Pré-incrémentation Post-incrémentation Pré-décrémentation Post-décrémentation
++a;
Equivalente à :
a = a + 1;
a++;
Equivalente à :
a = a + 1;
--a;
Equivalente à :
a = a - 1;
a--;
Equivalente à :
a = a - 1;

Exemple 3

let a = 8;
// Pré-incrémentation
console.log(++a); // 9
console.log(a);   // 9
// Post-incrémentation
console.log(a++); // 9
console.log(a);   // 10
// Pré-décrémentation
console.log(--a); // 9
console.log(a);   // 9
// Post-décrémentation
console.log(a--); // 9
console.log(a);   // 8

Les opérateurs de comparaison

Supérieur Supérieur ou égal Inférieur Inférieur ou égal Même valeur Valeur différente Même type et même valeur Type ou valeur différents
a > b a >= b a < b a < b a == b a != b a === b a !== b

Exemple 4

let a = 8;
let b = "8";
let c = 9;
// Supérieur
console.log(c, ">", a, "=>", c > a);  // true
console.log(b, ">", a, "=>", b > a);  // false
// Supérieur ou égal
console.log(c, ">=", a, "=>", c >= a); // true
console.log(a, ">=", b, "=>", a >= b); // true
// Inférieur
console.log(c, "<", a, "=>", c < a);  // false
console.log(b, "<", a, "=>", b < a);  // false
// Inférieur ou égal
console.log(c, "<=", a, "=>", c <= a); // false
console.log(a, "<=", b, "=>", a <= b); // true
// Même valeur
console.log(c, "==", a, "=>", c == a);  // false
console.log(b, "==", a, "=>", b == a);  // true
// Valeur différente
console.log(c, "!=", a, "=>", c != a);  // true
console.log(b, "!=", a, "=>", b != a);  // false
// Même type et même valeur
console.log(c, "===", a, "=>", c === a);  // false
console.log(b, "===", a, "=>", b === a);  // false
// Type ou valeur différents
console.log(c, "!==", a, "=>", c !== a);  // true
console.log(b, "!==", a, "=>", b !== a);  // true

Les opérateurs logiques

Et logique Ou logique Non logique
a && b a || b !a

Exemple 5

let a = 8;
let b = 6;
let c = 4;
console.log(a, ">", b, "&&", b, ">", c, (a > b && b > c)) // true
console.log(a, "<", b, "||", b, ">", c, (a < b || b > c)) // true
console.log("!(", a, ">", b, ")", !(a > b)) // false

Entrées

Il est possible de récupérer les données de l'utilisateur en utilisant diverses méthodes :

  • Depuis un formulaire en utilisant la propriété : elem.value d'un champ.
  • Depuis une boîte d'invite (prompt).
  • Depuis une boîte de confirmation.

Exemple 1 : Récupérer une donnée depuis un champ de formulaire

<input type="text" id="np" name="np" value="Salah">
<script>
  const np = document.getElementById("np");
  document.writeln("Bonjour ", np.value);
</script>
Aperçu dans le navigateur
Aperçu dans le navigateur

Exemple 2 : Récupérer une donnée à partir d'une boîte d'invite

<div id="operation"></div>
<script>
  const op = document.getElementById("operation");

  let a = prompt("Donner a ?", "5");
  let b = prompt("Donner b ?", "7");
  let s = a + b;
  op.innerHTML = a + " + " + b + " = " + s;
</script>
Aperçu dans le navigateur
Aperçu dans le navigateur

Exemple 3 : Récupérer une confirmation

<script>
  const reponse = confirm("Voulez-vous supprimer cet élément ?");
  if (reponse) {
    alert("L'élément a été supprimé !");
  } else {
    alert("Vous avez annulé l'opération !");
  }
</script>
Aperçu dans le navigateur
Aperçu dans le navigateur

Conditions

JavaScript offre une variété de structures conditionnelles :

  • L'instruction if
  • L'instruction switch
  • L'opérateur ternaire (cond) ? val1 : val2

L'instruction if

Forme générale

if (condition) {
  // traitement
} else {
  // autre traitement
}

Exemple : Comparaison de deux nombres avec if ... else if ... else

<script>
  let a = prompt("Donner a ? ", "0");
  let b = prompt("Donner b ? ", "0");
  let res = "";

  a = parseInt(a);
  b = parseInt(b);

  if (a > b) {
    res = a + " > " + b;
  } else if (a < b) {
    res = a + " < " + b;
  } else {
    res = a + " = " + b;
  }

  alert(res);
</script>
Aperçu dans le navigateur
Aperçu dans le navigateur

L'instruction switch

Forme générale

switch (variable) {
  case valeur1:
    // traitement
    break;
  case valeur2:
    // autre traitement
    break;
  default:
    // traitement par défaut
}

Exemple : Aiguillage avec switch

let j2 = Math.floor(Math.random() * 3), cj2;
let j1, cj1;
let g, res;

switch (j2) {
  case 0: cj2 = "Pierre"; break;
  case 1: cj2 = "Feuille"; break;
  case 2: cj2 = "Ciseaux"; break;
  default: cj2 = "Aucun";
}

j1 = j2;
cj1 = cj2;
res = "Partie nulle";

alert(cj1 + " contre " + cj2 + " => " + res);
Aperçu dans le navigateur
Aperçu dans le navigateur

L'opérateur ternaire

Forme générale

(condition) ? valeur1 : valeur2

Exemple : Évaluation conditionnelle avec l'opérateur ternaire

let v1 = Math.floor(Math.random() * 2);
let v2 = Math.floor(Math.random() * 2);
let res = (v1 == v2) ? "Egaux" : "Différents";
alert(v1 + " == " + v2 + " ? " + res);
Aperçu dans le navigateur
Aperçu dans le navigateur

Boucles

On utilise les structures itératives lorsqu'on veut répéter un traitement plusieurs fois. JavaScript met à notre disposition les structures suivantes :

  • for : lorsque le nombre de répétitions est connu à l'avance.
  • while et do ... while : lorsque le nombre de répétitions dépend d'une condition.

Boucle for

Forme générale

for (initialisation; condition; increment) {
  // traitement
}

Exemple : Afficher les nombres pairs entre 0 et 15

<p><b>Nombres pairs :</b>
  <script>
    for (let i = 0; i < 16; i++) {
      if (i % 2 == 0) {
        document.writeln(i);
      }
    }
  </script>
</p>
Aperçu dans le navigateur
Aperçu dans le navigateur

Boucle while

Forme générale

while (condition) {
  // traitement
}

Exemple : Calcul du PGCD par l'algorithme d'Euclide

PGCD(a, b) = PGCD(b, a mod b) si b ≠ 0 — PGCD(a, b) = a si b = 0

<p><b>Calcul du PGCD : </b>
  <script>
    let a = parseInt(prompt("Donner a ? "));
    let b = parseInt(prompt("Donner b ? "));

    /* Algorithme d'Euclide */
    let a1 = a, b1 = b;
    while (b1 != 0) {
      let r = a1 % b1;
      a1 = b1;
      b1 = r;
    }

    document.writeln("PGCD(", a, ", ", b, ") = ", a1);
  </script>
</p>
Aperçu dans le navigateur
Aperçu dans le navigateur

Boucle do ... while

Cette boucle est semblable à sa sœur aînée while. La seule différence est que le traitement est exécuté au moins une fois avant que la condition ne soit évaluée.

Forme générale

do {
  // traitement
} while (condition);

Exemple : Tirage aléatoire jusqu'à trouver un chiffre d'unités donné

<script>
  let a = Math.floor(Math.random() * 10);
  let b, u;

  document.writeln("<p>Cherchons un nombre ayant un chiffre d'unités = ", a, "</p>");

  do {
    b = Math.floor(Math.random() * 90) + 10;
    u = b % 10;
    if (u == a) {
      document.writeln(b, " Accepté");
    } else {
      document.writeln(b, " Rejeté");
    }
    document.writeln("<br>");
  } while (u != a);
</script>
Aperçu dans le navigateur
Aperçu dans le navigateur

Fonctions

L'utilisation des fonctions permet de réduire la complexité d'un problème en le décomposant en des sous-problèmes moins compliqués.

Les fonctions en JavaScript sont des citoyens de première classe. Elle peut être déclarée comme une variable et passée en tant que paramètre à une autre fonction. Une fonction peut-être déclarée de plusieurs façons :

  • À l'aide du mot clé : function.
  • Comme une variable ou constante à l'aide de const, let ou var.
  • Comme une fonction anonyme.

Déclaration

Forme générale

/* fonction ordinaire */
function nom_fonction(par1, par2, ..., parN) {
  // traitement

  /* La fonction peut retourner, ou non, un résultat à son appelant */
  [return résultat;]
}

Exemple

L'exemple suivant présente plusieurs déclarations et invocations de fonctions :

let a = 5, b = 10;

/* Déclaration d'une fonction : somme */
function somme(a, b) {
  return a + b;
}
document.writeln("<p>", a, "+", b, "=", somme(a, b), "</p>");

/* Déclaration d'une fonction : produit */
function produit(a, b) {
  return a * b;
}
document.writeln("<p>", a, "*", b, "=", produit(a, b), "</p>");

/* Déclaration d'une fonction : alea */
function alea(a, b) {
  return Math.floor(Math.random() * (b - a)) + a;
}
document.writeln("<p>alea(", a, ", ", b, ") = ", alea(a, b), "</p>");

// Le premier paramètre de calc est une fonction
function calc(fn, a, b) {
  return fn(a, b);
}

/* Appel d'une fonction : Méthode 4 */
const res = calc(produit, a, b);
document.writeln("<p>", a, "*", b, "=", res, "</p>");
Aperçu dans le navigateur
Aperçu dans le navigateur

Chaînes

Une chaîne de caractères est une séquence de caractères indexée de 0 à length - 1. JavaScript fournit de nombreuses méthodes pour manipuler les chaînes :

Propriété / Méthode Description Exemple
ch.length Retourne la longueur (nombre de caractères) de la chaîne. "Bonjour".length → 7
ch[p] ou ch.charAt(p) Retourne le caractère situé à la position (indice) p. "Web"[1] ou "Web".charAt(1) → "e"
ch.charCodeAt(p) Retourne le code ASCII (Unicode) du caractère à la position p. "A".charCodeAt(0) → 65
String.fromCharCode(code) Construit et retourne un caractère à partir de son code ASCII. String.fromCharCode(65) → "A"
ch.indexOf(ch1, p) Retourne la première position de ch1 dans ch (à partir de p, par défaut 0). Retourne -1 si non trouvée. "banane".indexOf("an") → 1
ch.lastIndexOf(ch1, p) Retourne la dernière position de ch1 dans ch (recherche de droite à gauche). Retourne -1 si non trouvée. "banane".lastIndexOf("an") → 3
ch.substring(d, f) Extrait une sous-chaîne entre l'indice d (inclus) et f (exclu). "Informatique".substring(0, 4) → "Info"
ch.replace(ch1, ch2) Remplace la première occurrence de ch1 par ch2. "chat noir".replace("noir", "blanc") → "chat blanc"
ch.toUpperCase() Convertit toute la chaîne en majuscules. "bac".toUpperCase() → "BAC"
ch.toLowerCase() Convertit toute la chaîne en minuscules. "BAC".toLowerCase() → "bac"
ch.trim() Supprime les espaces au début et à la fin de la chaîne. " test ".trim() → "test"

Nombres

En JavaScript, les valeurs saisies par l'utilisateur (via un champ de formulaire ou une boîte de dialogue) sont initialement récupérées sous forme de chaînes de caractères (string). JavaScript propose des fonctions indispensables pour vérifier, convertir et formater les nombres :

Fonction / Méthode Description Exemple et Résultat
isNaN(ch) is Not a Number : Vérifie si une valeur ou une chaîne n'est pas un nombre valide.
Retourne true si la valeur n'est pas numérique, et false si c'est un nombre valide.
isNaN("15.5") → false
isNaN("12a") → true
isNaN("STI") → true
Number(ch) Convertit globalement une chaîne ch en valeur numérique (entière ou décimale).
Retourne NaN si la chaîne contient des caractères non numériques.
Number("19.75") → 19.75
Number("25px") → NaN
Number("") → 0
parseInt(ch, b) Extrait et convertit le début d'une chaîne ch en nombre entier dans la base b (base 10 décimale par défaut si b est omis).
La lecture s'arrête dès qu'un caractère non valide pour la base est rencontré.
parseInt("42.8") → 42
parseInt("150px") → 150
parseInt("1011", 2) → 11
parseInt("FF", 16) → 255
parseFloat(ch) Extrait et convertit le début d'une chaîne ch en nombre réel décimal (à virgule flottante).
S'arrête dès le premier caractère non convertible.
parseFloat("14.75") → 14.75
parseFloat("14.75 DT") → 14.75
parseFloat("bac") → NaN
N.toString(b) Méthode appliquée sur un nombre N pour le convertir en chaîne de caractères.
Le paramètre optionnel b permet de choisir la base de numération (ex. 2 pour binaire, 16 pour hexadécimal).
(125).toString() → "125"
(10).toString(2) → "1010"
(255).toString(16) → "ff"

Exemple d'application : Contrôle de saisie et conversion numérique

Dans un formulaire, la valeur retournée par un champ <input> est toujours de type texte. Pour calculer la moyenne de deux notes en toute sécurité :

let note1 = "14.5"; // Récupéré via champ1.value
let note2 = "abc";  // Saisie erronée d'un utilisateur

// 1. Contrôle de validité avec isNaN()
if (isNaN(note1) || isNaN(note2)) {
  console.log("Erreur : Veuillez saisir des notes numériques valides !");
} else {
  // 2. Conversion explicite avec parseFloat() ou Number()
  let moyenne = (parseFloat(note1) + parseFloat(note2)) / 2;
  console.log("Moyenne =", moyenne);
}
Aperçu dans la console
Aperçu dans la console

Math

L'objet prédéfini Math rassemble des constantes et des fonctions mathématiques courantes :

Méthode Description Exemple
Math.abs(N) Retourne la valeur absolue de N. Math.abs(-12) → 12
Math.round(N) Retourne l'arrondi arithmétique de N à l'entier le plus proche (≥ 0.5 vers le haut). Math.round(4.5) → 5
Math.round(4.4) → 4
Math.trunc(N) Retourne la partie entière de N en éliminant la fraction décimale (troncature). Math.trunc(4.9) → 4
Math.trunc(-4.9) → -4
Math.floor(N) Retourne le plus grand entier inférieur ou égal à N (arrondi à l'inférieur). Math.floor(4.9) → 4
Math.floor(-4.1) → -5
Math.random() Génère un nombre réel pseudo-aléatoire dans l'intervalle semi-ouvert [0, 1[. Math.floor(Math.random() * 10) + 1 → Entier entre 1 et 10

Dates

En JavaScript, la gestion du temps, des dates et des heures s'effectue à l'aide de l'objet standard Date. Il permet d'obtenir l'instant courant du système ou de manipuler une date saisie par un utilisateur :

1. Instanciation d'un objet Date

Syntaxe Description Exemple
new Date() Crée un objet représentant la date et l'heure système actuelles (au moment précis de l'exécution). let mnt = new Date();
new Date(ch) Crée un objet Date à partir d'une chaîne ch au format standard ISO ("YYYY-MM-DD").
C'est la valeur exacte retournée par un champ HTML5 <input type="date">.
let d = new Date("2008-04-25");

2. Méthodes d'extraction et de formatage

Méthode Description Valeurs de retour et Exemple
d.getDate() Retourne le jour du mois. Entier entre 1 et 31.
d.getDate() → 25
d.getMonth() Retourne le numéro du mois.
Attention : Les mois sont numérotés de 0 à 11 (0 = Janvier, 1 = Février, ..., 11 = Décembre). Pour afficher le mois réel, on ajoute 1 : d.getMonth() + 1.
Entier entre 0 et 11.
d.getMonth() → 3 (Avril)
d.getMonth() + 1 → 4
d.getFullYear() Retourne l'année complète sur 4 chiffres. Entier à 4 chiffres.
d.getFullYear() → 2008
d.toString() Convertit l'objet Date en une chaîne descriptive lisible incluant jour, date, heure et fuseau horaire. d.toString() →
"Fri Apr 25 2008 01:00:00 GMT+0100..."

3. Exemple d'application : Calcul de l'âge d'un utilisateur

Soit un formulaire permettant à un utilisateur de saisir sa date de naissance. Le script calcule automatiquement son âge en années à partir de l'année actuelle :

<form action="#">
  <label for="dn">Date de naissance :</label>
  <input type="date" id="dn" value="2007-06-15">
  <button type="button" onclick="calculerAge()">Calculer l'âge</button>
  <p id="res_age"></p>
</form>

<script>
function calculerAge() {
  const champDate = document.getElementById("dn");
  const affichage = document.getElementById("res_age");

  // 1. Instancier la date de naissance saisie
  const dateNais = new Date(champDate.value);
  
  // 2. Instancier la date courante du système
  const aujourdhui = new Date();

  // 3. Extraire les années et composantes
  const anneeNais = dateNais.getFullYear();
  const anneeActuelle = aujourdhui.getFullYear();

  // 4. Calcul de l'âge
  let age = anneeActuelle - anneeNais;

  // Ajuster si l'anniversaire n'est pas encore passé cette année
  const diffMois = aujourdhui.getMonth() - dateNais.getMonth();
  if (diffMois < 0 || (diffMois === 0 && aujourdhui.getDate() < dateNais.getDate())) {
    age--;
  }

  affichage.innerHTML = "Date de naissance : <strong>" + dateNais.getDate() + "/" + (dateNais.getMonth() + 1) + "/" + anneeNais + "</strong> — Âge : <strong>" + age + " ans</strong>";
}
</script>
Aperçu dans le navigateur
Aperçu dans le navigateur

Événements

Présentation

JavaScript est un langage évènementiel, chaque nœud du DOM génère des évènements. Un évènement est déclenché, automatiquement, par le navigateur lorsque :

  • Le contenu de la page est chargé.
  • L'utilisateur clique sur un bouton dans la page.
  • L'utilisateur modifie le contenu d'un champ dans un formulaire.
  • L'utilisateur glisse un objet au dessus d'un élément.
  • etc.

JavaScript permet d'écouter un évènement et d'y attacher, par conséquence, un gestionnaire d'évènement.

Réponse à un évènement

Il est possible de répondre aux évènements de plusieurs manières. Par exemple, pour répondre au clic d'un bouton on peut écrire :

Exemple 1

Définir l'attribut onclick de la balise <button>. Le clic sur ce bouton exécute le code JavaScript.

<button type="button" onclick="alert('You\'re welcome!')">Cliquez-moi</button>

Exemple 2

Définir l'attribut onclick de la balise <button>. Le clic sur ce bouton appelle la fonction clic01().

<button type="button" onclick="clic01()">Cliquez-moi</button>
<script>
  function clic01() {
    alert("Good luck!");
  }
</script>

Exemple 3

Récupérer la référence du bouton à l'aide de document.getElementById, puis attacher l'évènement onclick dans JavaScript.

<button id="bouton" type="button">Cliquez-moi</button>
<script>
  const bouton = document.getElementById("bouton");
  bouton.onclick = () => {
    alert("You are the best of the best!");
  };
</script>

Exemple 4

Récupérer la référence du bouton à l'aide de document.getElementById, puis utiliser la méthode addEventListener pour attacher une fonction à l'évènement click.

<button id="btn-2" type="button">Cliquez-moi</button>
<script>
  const btn2 = document.getElementById("btn-2");
  btn2.addEventListener("click", () => {
    alert("Wish you success and happiness!");
  });
</script>

Exemple 3

Récupérer la référence du bouton à l'aide de document.getElementById, puis attacher l'évènement onclick dans JavaScript.

<button id="bouton" type="button">Cliquez-moi</button>
<script>
  const bouton = document.getElementById("bouton");
  bouton.onclick = () => {
    alert("You are the best of the best!");
  };
</script>

Exemple 4

Récupérer la référence du bouton à l'aide de document.getElementById, puis utiliser la méthode addEventListener pour attacher une fonction à l'évènement click.

<button id="btn-2" type="button">Cliquez-moi</button>
<script>
  const btn2 = document.getElementById("btn-2");
  btn2.addEventListener("click", () => {
    alert("Wish you success and happiness!");
  });
</script>

Événement click

L'évènement click est déclenché lorsqu'on clique sur un élément du DOM.

Forme générale

elem est une référence à un élément du DOM.

e.preventDefault() permet d'annuler l'effet de l'évènement et d'arrêter sa propagation.

elem.addEventListener("click", (e) => {
  /* Traitement */

  /* Arrêter la propagation de l'évènement */
  // e.preventDefault();
});

Exemple

<p><label><input type="checkbox" name="defi" id="defi"> Cochez-moi si vous le pouvez 😀.</label></p>
<script>
  const defi = document.getElementById("defi");
  defi.addEventListener("click", (e) => {
    alert("Désolé! Essayez encore une fois!");
    e.preventDefault();
  });
</script>

Événement change

L'évènement change est déclenché lorsque la valeur d'un champ dans un formulaire a changé.

Forme générale

elem est une référence à un élément du DOM.

elem.addEventListener("change", () => { 
  /* Traitements */
});

Exemple

L'exemple suivant demande à un utilisateur d'entrer son nom dans un champ de texte nom, puis il affiche tous les changements effectués dans le div #message.

<p><input type="text" name="nom" id="nom" placeholder="Votre nom"></p>
<div id="message"></div>
<script>
  const nom = document.getElementById("nom");
  const msg = document.getElementById("message");
  let nom_actuel = nom.value;
  nom.addEventListener("change", () => {
    const nouv_nom = nom.value;
    msg.innerHTML += "Le nom est changé de '" + nom_actuel + "' à '" + nouv_nom + "'<br>";
    nom_actuel = nouv_nom;
  });
</script>

Résultat

Exemple d'exploitation de l'évènement change
Exemple d'exploitation de l'évènement change

Exemple

L'exemple suivant demande à un utilisateur d'entrer son nom dans un champ de texte nom, puis il affiche tous les changements effectués dans le div #message.

<p><input type="text" name="nom" id="nom" 
          placeholder="Votre nom"></p>
<div id="message"></div>
<script>
  const nom = document.getElementById("nom");
  const msg = document.getElementById("message");
  let nom_actuel = nom.value;
  nom.addEventListener("change", () => {
    const nouv_nom = nom.value;
    msg.innerHTML += "Le nom est changé de '" + 
                     nom_actuel + "' à '" + 
                     nouv_nom + "'<br>";
    nom_actuel = nouv_nom;
  });
</script>

Résultat

Exemple d'exploitation de l'évènement change
Exemple d'exploitation de l'évènement change

Événements focus/blur

L'évènement focus est déclenché par un champ d'un formulaire lorsque celui-ci devient l'élément actif.

L'évènement blur est déclenché par un champ d'un formulaire perd le focus et n'est plus l'élément actif.

Exemple

<p><input type="number" name="guess" id="guess" min="1" max="99"></p>
<p id="msg"></p>
<script>
  const guess = document.getElementById("guess");
  const msg = document.getElementById("msg");
  const secret = Math.floor(Math.random() * 99) + 1;
  guess.addEventListener("focus", () => {
    msg.innerHTML = "Guess my number between 1 - 99";
  });
  guess.addEventListener("blur", () => {
    msg.innerHTML = "Great! You guessed.!";
  });
</script>

Résultat

Le champ reçoit le focus
Le champ reçoit le focus
Le champ perd le focus
Le champ perd le focus

Exemple

<p><input type="number" name="guess" id="guess" 
          min="1" max="99"></p>
<p id="msg"></p>
<script>
  const guess = document.getElementById("guess");
  const msg = document.getElementById("msg");
  const secret = Math.floor(Math.random() * 99) + 1;
  guess.addEventListener("focus", () => {
    msg.innerHTML = "Guess my number between 1 - 99";
  });
  guess.addEventListener("blur", () => {
    msg.innerHTML = "Great! You guessed.!";
  });
</script>

Résultat

Le champ reçoit le focus
Le champ reçoit le focus
Le champ perd le focus
Le champ perd le focus

Événements keyup / keydown / keypress

Lorsque l'utilisateur appuie sur une touche du clavier le navigateur déclenche l'évènement keydown suivi de l'évènement keypress. Ces deux évènement sont redéclenchés périodiquement si l'utilisateur maintien la touche appuyée.

Une fois que l'utilisateur décide de relacher cette touche le navigateur déclenche l'évènement keyup.

Ces évènements passent au gestionnaire d'évènement, un objet nommé par exemple ev, qui définit les propriétés suivantes :

  • ev.altKey indique la touche Alt est appuyée.
  • ev.ctrlKey indique la touche Ctrl est appuyée.
  • ev.metaKey indique la touche Windows est appuyée.
  • ev.shiftKey indique la touche Shift est appuyée.
  • ev.key indique la touche du clavier appuyée.
  • ev.code indique le code de la touche appuyée.
  • ev.keyCode indique le code numérique de la touche appuyée.

Exemple

<p><input type="text" name="name" id="name" placeholder="Your name"></p>
<p id="msg"></p>
<script>
  const name = document.getElementById("name");
  const msg = document.getElementById("msg");
  name.addEventListener("keydown", (e) => {
    msg.innerHTML += "Keydown '" + e.key + "'<br>";
  });
  name.addEventListener("keyup", (e) => {
    msg.innerHTML += "Keyup '" + e.key + "'<br>";
  });
  name.addEventListener("keypress", (e) => {
    msg.innerHTML += "Keypress '" + e.key + "'<br>";
  });
</script>

Résultat

Test des évènements keyup / keydown / keypress
Test des évènements keyup / keydown / keypress

Exemple

<p><input type="text" name="name" id="name" 
          placeholder="Your name"></p>
<p id="msg"></p>
<script>
  const name = document.getElementById("name");
  const msg = document.getElementById("msg");
  name.addEventListener("keydown", (e) => {
    msg.innerHTML += "Keydown '" + e.key + "'<br>";
  });
  name.addEventListener("keyup", (e) => {
    msg.innerHTML += "Keyup '" + e.key + "'<br>";
  });
  name.addEventListener("keypress", (e) => {
    msg.innerHTML += "Keypress '" + e.key + "'<br>";
  });
</script>

Résultat

Test des évènements keyup / keydown / keypress
Test des évènements keyup / keydown / keypress

Événement input

Le changement de la valeur d'un champ d'un formulaire déclenche l'évènement input. Cet évènement est déclenché à chaque fois que la valeur du champ change et ce à l'inverse de l'évènement change qui est déclenché une seule fois lorsque l'utilisateur a fini de changer la valeur d'un champ.

Exemple

<p>
  <input type="range" name="volume" id="volume" min="0" max="100" value="50" step="5"> 
  Volume <span id="msg"></span></p>
<p>
  <input type="range" name="volume2" id="volume2" min="0" max="100" value="50" step="5"> 
  Volume <span id="msg2"></span></p>
<script>
  const volume = document.getElementById("volume");
  const volume2 = document.getElementById("volume2");
  const msg = document.getElementById("msg");
  const msg2 = document.getElementById("msg2");

  function showVolume() {
    msg.innerHTML = volume.value;
  }

  function setVolume() {
    volume2.value = volume.value;
    msg2.innerHTML = volume.value;
  }

  volume.addEventListener("input", showVolume);
  volume.addEventListener("change", setVolume);
  showVolume();
  setVolume();
</script>

Résultat

Déclenchement de l'évènement input à chaque fois que l'utilisateur change la valeur du champ
Déclenchement de l'évènement input à chaque fois que l'utilisateur change la valeur du champ
Déclenchement de l'évènement change lorsque l'utilisateur a fini de changer la valeur du champ
Déclenchement de l'évènement change lorsque l'utilisateur a fini de changer la valeur du champ

Exemple

<p>
  <input type="range" name="volume" id="volume" 
         min="0" max="100" value="50" step="5"> 
  Volume <span id="msg"></span></p>
<p>
  <input type="range" name="volume2" id="volume2" 
         min="0" max="100" value="50" step="5"> 
  Volume <span id="msg2"></span></p>
<script>
  const volume = document.getElementById("volume");
  const volume2 = document.getElementById("volume2");
  const msg = document.getElementById("msg");
  const msg2 = document.getElementById("msg2");

  function showVolume() {
    msg.innerHTML = volume.value;
  }

  function setVolume() {
    volume2.value = volume.value;
    msg2.innerHTML = volume.value;
  }

  volume.addEventListener("input", showVolume);
  volume.addEventListener("change", setVolume);
  showVolume();
  setVolume();
</script>

Résultat

Déclenchement de l'évènement input à chaque fois que l'utilisateur change la valeur du champ
Déclenchement de l'évènement input à chaque fois que l'utilisateur change la valeur du champ
Déclenchement de l'évènement change lorsque l'utilisateur a fini de changer la valeur du champ
Déclenchement de l'évènement change lorsque l'utilisateur a fini de changer la valeur du champ

Événement submit / reset

L'évènement submit est déclenché lorsque l'utilisateur désire soumettre les données d'un formulaire.

L'évènement reset est déclenché lorsque l'utilisateur souhaite réinitialiser le contenu d'un formulaire.

Exemple

<form id="student" action="#" method="post">
  <div>
    <label for="np">Nom & Prénom</label>
    <input type="text" id="np" name="np" placeholder="Ex : Salah Korbaa">
  </div>
  <div>
    <label for="cl">Classe</label>
    <input type="text" id="cl" name="cl" placeholder="Ex : 4T1">
  </div>
  <div>
    <button type="submit">Envoyer</button>
    <button type="reset">Réinitialiser</button>
  </div>
</form>
<script>
  const form = document.getElementById("student");
  const np = document.getElementById("np");
  const cl = document.getElementById("cl");

  form.addEventListener("submit", (e) => {
    alert("You cannot send any data till now !");
    e.preventDefault();
  });

  form.addEventListener("reset", (e) => {
    if (np.value == "" || cl.value == "") {
      alert("You have to type something before resetting this form!");
      e.preventDefault();
    }
  });
</script>

Résultat

Formulaire élève
Formulaire élève

Exemple

<form id="student" action="#" method="post">
<div>
  <label for="np">Nom & Prénom</label>
  <input type="text" id="np" name="np" 
         placeholder="Ex : Salah Korbaa">
</div>
<div>
  <label for="cl">Classe</label>
  <input type="text" id="cl" name="cl" placeholder="Ex : 4T1">
</div>
<div>
  <button type="submit">Envoyer</button>
  <button type="reset">Réinitialiser</button>
</div>
</form>
<script>
  const form = document.getElementById("student");
  const np = document.getElementById("np");
  const cl = document.getElementById("cl");

  form.addEventListener("submit", (e) => {
    alert("You cannot send any data till now !");
    e.preventDefault();
  });

  form.addEventListener("reset", (e) => {
    if (np.value == "" || cl.value == "") {
      alert("You have to type something before resetting!");
      e.preventDefault();
    }
  });
</script>

Résultat

Formulaire élève
Formulaire élève

Ateliers Pratiques & Exercices

Atelier 1 : Intégration dans un document HTML

Mission : Découvrir les modalités d'intégration de scripts JavaScript dans une page Web (script direct et fichier externe .js) et maîtriser l'affichage des informations dans la console des outils de développement (F12).

Activité 1 : Premier script JavaScript direct

Travail demandé :

  1. Créer un fichier HTML nommé javascript01.html contenant le code suivant :
    <!DOCTYPE html>
    <html lang="fr">
    <head>
      <meta charset="UTF-8">
      <title>Initiation JavaScript</title>
    </head>
    <body>
      <h1>Mon premier script</h1>
      <script>
        console.log("Hello JavaScript!");
      </script>
    </body>
    </html>
  2. Ouvrir la page dans le navigateur Web.
  3. Ouvrir l'outil de développement (DevTools) en appuyant sur F12 ou Ctrl+Shift+I, puis basculer sur l'onglet Console.
    Résultat du code JavaScript
    Affichage du message dans la console DevTools

Activité 2 : Intégration via un fichier JavaScript externe

Travail demandé :

  1. Créer un fichier JavaScript nommé jscript01.js dans le même répertoire de travail, contenant le code suivant :
    console.log("Hello from console.log inside an external file");
  2. Intégrer ce fichier dans javascript01.html à l'aide de la balise :
    <script src="jscript01.js"></script>
  3. Recharger la page dans le navigateur (F5 ou Ctrl+R) et vérifier la console.
    Résultat du script externe
    Résultat de l'exécution du fichier JavaScript externe

Atelier 2 : Variables, Constantes & Types de Données

Mission : Consolider la compréhension des variables locales (let), des constantes non réassignables (const), de la sensibilité à la casse (Case Sensitivity) et explorer les types primitifs avec l'opérateur typeof.

Exercice 1 : Déclaration, réaffectation et sensibilité à la casse

Travail demandé :

  1. Ouvrir la console du navigateur (F12).
  2. Tester la déclaration de variables avec et sans initialisation :

    Sans initilisation

    let nom;
    let age;
    console.log(nom, age); // undefined undefined

    Avec initilisation

    let nom = "Ahmed";
    let age = 16;
    console.log(nom, age); // Ahmed 16
  3. Tester l'effet de la casse sur une variable :
    let x = 6;
    console.log(x); // Affiche 6
    console.log(X); // Erreur : X is not defined
  4. Tester la réaffectation d'une variable (let) versus une constante (const) :
    let a = 4; 
    a = a + 2; 
    console.log(a); // Fonctionne : a = 6
    const b = 5; 
    b = b + 2; // Erreur : Assignment to constant variable

Exercice 2 : Typage dynamique et opérateur typeof

Travail demandé :

  1. Tester les commandes suivantes dans la console du navigateur et relever le type renvoyé :
    console.log(typeof 5.6);         // 'number'
    console.log(typeof "3STI");        // 'string'
    console.log(typeof true);          // 'boolean'
    console.log(typeof undefined);     // 'undefined'
    console.log(typeof [10, 20, 30]);  // 'object'
    console.log(typeof alert);         // 'function'
  2. Expliquer pourquoi JavaScript est qualifié de langage à typage dynamique (Trois propositions sont correctes).
    1. Le type d'une variable n'a pas besoin d'être déclaré à l'avance ; il est déduit automatiquement à l'exécution à partir de la valeur qui lui est affectée.
    2. Une variable déclarée avec let conserve définitivement son type initial ; lui assigner une valeur d'un autre type déclenche une erreur.
    3. En JavaScript, ce sont les valeurs en mémoire qui possèdent un type et non les variables elles-mêmes.
    4. Le programmeur doit obligatoirement déclarer le type de chaque variable à l'aide de mots-clés spécifiques tels que int, float ou string.
    5. Une même variable peut changer de type au cours de l'exécution du programme si on lui affecte une nouvelle valeur d'un type différent.

Atelier 3 : Méthodes d'Affichage et Sorties (DOM & Formulaires)

Mission : Manipuler les quatre grands canaux d'affichage en JavaScript : la console de débogage, les boîtes de dialogue modales, l'écriture dans le flux HTML, et l'injection dynamique dans le DOM via innerHTML et value.

Exercice 1 : Débogage dans la console avec console.log()

On souhaite calculer la longueur de l'hypoténuse d'un triangle rectangle de côtés a = 3 et b = 4 grâce à la formule mathématique c = √(a² + b²) :

Illustration triangle rectangle et calcul de l'hypoténuse
Triangle rectangle de côtés a = 3, b = 4 et hypoténuse c = 5

Le code initial comporte une erreur :

Code JavaScript :

<script>
  // Calcul de l'hypoténuse d'un triangle rectangle
  let a = 3;
  let b = 4;
  // Formule : c = racine(a² + b²)
  let c = Math.sqrt(a + a); // <-- Erreur dans l'expression
  // Affichage du résultat
</script>

Résultat dans la console :

Débogage d'un script avec erreur
Débogage dans la console : repérage du résultat incorrect

Travail demandé :

  1. Créer un fichier HTML nommé javascript02.html.
  2. Copier le code précédent puis le tester dans la console du navigateur (F12).
  3. Corriger l'erreur de calcul pour obtenir la valeur correcte c = 5 (en remplaçant a + a par a * a + b * b ou a ** 2 + b ** 2).

Exercice 2 : Notification par boîte d'alerte avec alert()

Lors de la confirmation d'un mot de passe dans un formulaire, si les deux saisies diffèrent, une alerte immédiate doit être notifiée à l'utilisateur :

Boîte d'alerte
Boîte modale d'alerte surgissante

Travail demandé :

  1. Créer un fichier HTML nommé javascript03.html.
  2. Compléter le code JavaScript suivant :
    let pwd1 = "3INFO";
    let pwd2 = "3Info";
    if (pwd1 == pwd2) {
      // Afficher mots de passes identiques dans une boite d'alerte
    } else {
      // Afficher mots de passes différents dans une boite d'alerte
    }

Exercice 3 : Écriture dans le document avec document.writeln()

On désire générer dynamiquement des paragraphes de calculs mathématiques et leur appliquer une alternance de couleurs via des sélecteurs CSS3.

Rendu document.writeln
Rendu des paragraphes générés avec alternance de styles

Travail demandé :

  1. Créer un fichier HTML nommé javascript04.html.
  2. Copier le code suivant :
    <script>
      let a = 5;
      let b = 6;
      let res = a + b;
      // à compléter
    </script>
  3. Compléter le code pour afficher l'alternance rouge / bleu des paragraphes, montrée ci-dessus.

Exercice 4 : Modification dynamique du DOM avec innerHTML

La propriété innerHTML permet d'injecter ou de modifier du balisage HTML à l'intérieur d'un élément cible préalablement sélectionné via son identifiant.

<div id="message"></div>
<script>
  // Récupérer une référence du div
  const msg = document.getElementById("message");
  // Ajouter un contenu stylisé dans ce div
  msg.innerHTML = '<p class="erreur">Bienvenue dans JavaScript!</p>';
</script>
#message { width: 500px; margin: 10px auto; }
.erreur { background-color: red; color: white; font-weight: bold; padding: 15px; }

Travail demandé :

  1. Copier les codes HTML et CSS ci-dessus dans un fichier HTML nommé javascript05.html.
  2. Tester dans le navigateur pour observer le message stylisé.
  3. Ajouter un conteneur supplémentaire dans le document : <div id="greeting"></div>.
  4. Ajouter le code JavaScript nécessaire pour obtenir l'affichage suivant :
    Résultat à obtenir
    Résultat attendu avec deux zones de messages dynamiques

Exercice 5 : Affichage dynamique dans un formulaire avec value

On réalise une mini-calculatrice à l'aide d'un formulaire HTML dont le résultat est affecté dynamiquement dans un champ désactivé :

Code HTML / JavaScript :

<form action="#">
  <div><label for="a">a</label><input type="number" name="a" id="a" value="9"></div>
  <div><label for="b">b</label><input type="number" name="b" id="b" value="16"></div>
  <div><label for="res">a + b =</label><input type="number" name="res" id="res" disabled></div>
</form>
<script>
  const a = document.getElementById("a");
  const b = document.getElementById("b");
  const res = document.getElementById("res");
  res.value = Number(a.value) + Number(b.value);
</script>

Résultat dans le navigateur :

Calculatrice de base
Formulaire de base avec deux opérandes et champ résultat

Travail demandé :

  1. Créer un fichier HTML nommé javascript06.html.
  2. Copier le code ci-dessus et tester dans le navigateur.
  3. Ajouter un troisième champ numérique nommé c.
  4. Modifier le script pour calculer simultanément les opérations composées :

    • a + b + c
    • a - b - c
    • a × b × c
    • a / b / c
    Calculatrice à 3 opérandes
    Résultat attendu avec 3 opérandes

Exercice 6 : Composant intervalle (range) et lecture de formulaire

Soit le formulaire de commande initial :

Code HTML / JavaScript initial :

<form action="#">
  <div>
    <label for="np">Nom & Prénom</label>
    <input type="text" name="np" id="np" value="Yassine">
  </div>
  <div>
    <label for="dn">Date de naissance</label>
    <input type="date" name="dn" id="dn" value="2022-10-08">
  </div>
  <button type="submit">Confirmer</button>
</form>
<script>
  const np = document.getElementById("np");
  const dn = document.getElementById("dn");
  document.writeln("<p>Bonjour ", np.value, "</p>");
  document.writeln("<p>Vous êtes né le ", dn.value, "</p>");
</script>

Rendu initial dans le navigateur :

Rendu formulaire initial
Formulaire initial et affichage dynamique avec document.writeln()

Travail demandé :

  1. Créer un fichier HTML nommé javascript07.html.
  2. Copier le code précédent et tester dans le navigateur.
  3. Ajouter un champ de type curseur <input type="range" min="1" max="7" value="3"> permettant à l'utilisateur de choisir la quantité d'articles à commander.
  4. Compléter le script JavaScript pour lire et afficher la quantité sélectionnée dans la page :

    const qte = document.getElementById("qte");
    document.writeln("<p>Quantité : ", qte.value, "</p>");
    Résultat avec range
    Résultat attendu avec lecture dynamique du composant range

Atelier 4 : Méthodes d'Entrées

Mission : Maîtriser les différentes méthodes de saisie et d'acquisition de données en JavaScript : les boîtes de dialogue modales interactives (prompt() et confirm()), l'accès à la valeur d'un composant de formulaire individuel via document.getElementById(), et l'exploitation des collections de choix multiples (boutons radio et cases à cocher) avec document.getElementsByName().

Exercice 1 : Saisie de données avec la boîte d'invite prompt()

On désire calculer et afficher le périmètre et la surface d'un cercle à partir de son rayon r saisi par l'utilisateur :

Code HTML initial :

<!DOCTYPE html>
<html lang="fr">
<head>
  <meta charset="UTF-8">
  <title>Calculs sur un cercle</title>
</head>
<body>
  <h1>Calculs géométriques sur un cercle</h1>
  <div id="resCercle"></div>

  <script>
    // À compléter par l'élève :
    // 1. Saisir le rayon r à l'aide de prompt()
    // 2. Convertir la saisie en nombre
    // 3. Calculer le périmètre (2 * PI * r) et la surface (PI * r²)
    // 4. Afficher le résultat dans #resCercle via innerHTML
  </script>
</body>
</html>

Rendu attendu :

Boîte d'invite prompt et calcul du cercle
Boîte modale prompt() et affichage du résultat calculé

Travail demandé :

  1. Créer un fichier HTML nommé javascript08a.html contenant le squelette ci-contre.
  2. Demander à l'utilisateur de saisir le rayon r à l'aide de l'instruction prompt(...).
  3. Convertir la valeur saisie en nombre (Number() ou parseFloat()).
  4. Calculer le périmètre (2.π.r) et la surface (π.r²). Arrondir les résultats à deux décimales (toFixed(2)).
  5. Afficher les résultats dans le conteneur #resCercle.
  6. Tester en cliquant sur le bouton Annuler de la boîte d'invite. Quelle valeur est renvoyée par prompt() dans ce cas ?

Exercice 2 : Validation avec la boîte de confirmation confirm()

Avant d'exécuter une action importante (comme vider un panier d'achats), une confirmation doit être demandée à l'utilisateur à l'aide de confirm() :

Code HTML initial :

<!DOCTYPE html>
<html lang="fr">
<head>
  <meta charset="UTF-8">
  <title>Confirmation de panier</title>
</head>
<body>
  <h1>Gestion du panier d'achats</h1>
  <div id="messagePanier"></div>

  <script>
    // À compléter par l'élève :
    // 1. Déclencher la boîte de confirmation confirm()
    // 2. Tester la valeur booléenne reçue (true ou false)
    // 3. Afficher le message approprié dans #messagePanier
  </script>
</body>
</html>

Rendu attendu :

Boîte de confirmation confirm
Boîte modale confirm() et embranchement conditionnel

Travail demandé :

  1. Créer un fichier HTML nommé javascript08b.html contenant le code de départ ci-contre.
  2. Confirmer la suppression du contenu du panier (« Voulez-vous vraiment vider votre panier d'achats ? »). Stocker la réponse dans la variable reponse.
  3. À l'aide d'une structure conditionnelle if ... else, vérifier la valeur de reponse :
    • Si l'utilisateur a cliqué sur OK (valeur true) : afficher en vert : « ✓ Le panier a été vidé avec succès. ».
    • Si l'utilisateur a cliqué sur Annuler (valeur false) : afficher en rouge : « ✗ Opération annulée. Votre panier est conservé. ».
  4. Vérifier le type de la donnée renvoyée par confirm() à l'aide de l'opérateur typeof dans la console (console.log).

Exercice 3 : Formulaire et lecture de composants uniques avec document.getElementById()

On désire calculer les totaux d'une facture en ligne :

Formulaire HTML à intégrer :

<form id="formFacture">
  <div>
    <label for="prixHT">Prix unitaire HT (DT) :</label>
    <input type="number" id="prixHT" value="120">
  </div>
  <div>
    <label for="qte">Quantité :</label>
    <input type="number" id="qte" value="2">
  </div>
  <div>
    <label for="tva">Taux de TVA :</label>
    <select id="tva">
      <option value="0.07">7 %</option>
      <option value="0.13">13 %</option>
      <option value="0.19" selected>19 %</option>
    </select>
  </div>
  <button type="button" id="btnCalculer">Calculer TTC</button>
</form>
<div id="resFacture"></div>

Rendu attendu :

Formulaire facture et calcul TTC
Lecture des champs du formulaire avec document.getElementById()

Travail demandé :

  1. Créer un fichier HTML nommé javascript08c.html et y copier le formulaire ci-contre.
  2. Le clic sur le bouton permet de :
    • Récupérer les valeurs du formulaire et de les convertir en nombres.
    • Calculer le total HT (prixHT × qte), le montant de la TVA (totalHT × tva) et le montant total TTC (totalHT + montantTVA).
    • Afficher le détail de la facture dans la balise <div id="resFacture"> en modifiant son contenu avec innerHTML.
  3. Tester avec différentes valeurs pour vérifier l'exactitude des calculs.

Exercice 4 : Choix multiples avec document.getElementsByName() (Boutons radio & Cases à cocher)

Dans un formulaire d'inscription, certains champs partagent le même attribut name afin de constituer un groupe d'options : les boutons radio (sélection exclusive) et les cases à cocher (sélection multiple) :

Formulaire HTML à intégrer :

<form id="formProfil">
  <p><strong>Civilité (choix exclusif) :</strong><br>
    <label><input type="radio" name="civilite" value="M." checked> M.</label>
    <label><input type="radio" name="civilite" value="Mme"> Mme</label>
  </p>

  <p><strong>Centres d'intérêt (choix multiples) :</strong><br>
    <label><input type="checkbox" name="interets" value="Web / Informatique" checked> Web / Informatique</label><br>
    <label><input type="checkbox" name="interets" value="Robotique" checked> Robotique</label><br>
    <label><input type="checkbox" name="interets" value="Multimédia"> Multimédia</label>
  </p>

  <button type="button" id="btnProfil">Valider le profil</button>
</form>
<div id="resProfil"></div>

Rendu attendu :

Formulaire choix multiples getElementsByName
Sélection de collections avec document.getElementsByName() et propriété checked

Travail demandé :

  1. Créer un fichier HTML nommé javascript08d.html et y intégrer le formulaire ci-contre.
  2. Expliquer pourquoi la méthode document.getElementById() ne permet pas de cibler l'option sélectionnée parmi les boutons radio partageant le même attribut name.
  3. Écrire le code JavaScript qui permet de :
    • Déterminer la civilité de l'utilisateur.
    • Collecter ses centres d'intérêts
    • Afficher la civilité et la liste des centres d'intérêt choisis dans la balise <div id="resProfil"> avec innerHTML.
  4. Tester en cochant différentes combinaisons pour valider le bon fonctionnement de votre script.

Atelier 5 : Structures Conditionnelles (if, switch)

Mission : Mettre en œuvre les structures de contrôle décisionnelles : l'instruction if ... else pour le filtrage et la validation des entrées, l'aiguillage switch pour la gestion d'états multiples.

Exercice 1 : Contrôle de saisie et parité avec if ... else

Soit le programme de saisie de deux entiers et de comparaison de leur parité :

<script>
  let a = parseInt(prompt("Donner a ? "));
  let b = parseInt(prompt("Donner b ? "));

  if (a % 2 == b % 2) {
    document.writeln("<p>", a, " et ", b, " ont la même parité.</p>");
  } else {
    document.writeln("<p>", a, " et ", b, " n'ont pas la même parité.</p>");
  }
</script>

Travail demandé :

  1. Copier le script précédent dans un fichier HTML nommé javascript09.html.
  2. Tester dans le navigateur avec des valeurs valides (ex: 4 et 8, puis 3 et 6).
  3. Tester maintenant avec des valeurs textuelles invalides ou en cliquant sur Annuler. Quelle est la valeur de a lorsqu'une chaîne non numérique est saisie ?
  4. Corriger le comportement du script à l'aide de isNaN() pour qu'il affiche « Données manquantes ou invalides » en cas de saisie incorrecte.

Exercice 2 : Jeu Pierre - Feuille - Ciseaux avec switch

On simule le jeu Pierre - Feuille - Ciseaux entre deux joueurs, où chaque coup est représenté par un entier : 0 (Pierre), 1 (Feuille), 2 (Ciseaux) :

let j2 = Math.floor(Math.random() * 3), cj2;
let j1, cj1;
let g, res;

switch (j2) {
  case 0: cj2 = "Pierre"; break;
  case 1: cj2 = "Feuille"; break;
  case 2: cj2 = "Ciseaux"; break;
  default: cj2 = "Aucun";
}

j1 = Math.floor(Math.random() * 3);
// Compléter pour j1...
Jeu Pierre Feuille Ciseaux
Simulation d'une partie avec affichage du résultat

Travail demandé :

  1. Copier la base du code dans un fichier HTML nommé javascript10.html.
  2. Compléter le jeu pour convertir également le coup du joueur 1 en texte via switch.
  3. Déterminer le gagnant à l'aide de la formule mathématique : g = (j1 - j2 + 3) % 3;
    • g === 0 : Partie nulle,
    • g === 1 : Le Joueur 1 l'emporte,
    • g === 2 : Le Joueur 2 l'emporte.
  4. Afficher le verdict complet sous forme d'alerte ou dans la page Web.

Atelier 6 : Structures Itératives (for, while, do...while)

Mission : Maîtriser les boucles à compteur déterminé (for) et à condition d'arrêt préalable (while) ou postérieure (do ... while) pour implémenter des algorithmes arithmétiques fondamentaux (multiples, PGCD, PPCM, recherche probabiliste).

Exercice 1 : Filtrage arithmétique avec la boucle for

Travail demandé :

  1. Créer un fichier HTML nommé javascript13.html.
  2. Écrire une boucle for qui parcourt tous les entiers de deux chiffres (de 10 à 99).
  3. Extraire pour chaque nombre son chiffre des dizaines d et son chiffre des unités u.
  4. Afficher uniquement les nombres dont le chiffre des dizaines est un multiple du chiffre des unités ou vice-versa (avec u ≠ 0) :
    Nombres filtrés
    Affichage des nombres satisfaisant la relation de divisibilité

Exercice 2 : Algorithmes arithmétiques avec la boucle while (PGCD & PPCM)

On implémente l'algorithme d'Euclide pour calculer le PGCD de deux entiers a et b :

let a = parseInt(prompt("Donner a ? "));
let b = parseInt(prompt("Donner b ? "));

/* Calcul du PGCD : Algorithme d'Euclide */
let a1 = a, b1 = b;
while (b1 != 0) {
  let r = a1 % b1;
  a1 = b1;
  b1 = r;
}
document.writeln("PGCD(", a, ", ", b, ") = ", a1);
PGCD(25, 35)
Résultat du calcul du PGCD

Travail demandé :

  1. Tester le calcul du PGCD dans une page HTML.
  2. Compléter le script par le calcul du PPCM de a et b selon la méthode des incréments successifs : incrémenter un multiple de a de sa propre valeur tant qu'il n'est pas divisible par b.
    Multiples de a b a mod b ≠ 0
    35
    70
    105
    15
    15
    15
    true
    true
    false (Arrêt)
    PPCM(35, 15)
    Résultat du calcul du PPCM : 105

Exercice 3 : Recherche probabiliste avec la boucle do ... while

Soit le programme initial de recherche d'un nombre se terminant par un chiffre aléatoire donné :

let a = Math.floor(Math.random() * 10);
let b, u;

document.writeln("<p>Cherchons un nombre ayant un chiffre d'unités = ", a, "</p>");
do {
  b = Math.floor(Math.random() * 90) + 10;
  u = b % 10;
  if (u == a) {
    document.writeln(b, " Accepté<br>");
  } else {
    document.writeln(b, " Rejeté<br>");
  }
} while (u != a);

Travail demandé :

  1. Copier le code dans un fichier HTML nommé javascript14.html et observer le tirage dans le navigateur.
  2. Modifier le programme pour la recherche avancée suivante :
    • Choisir aléatoirement deux chiffres distincts a et b (entre 1 et 9).
    • Tirer répétitivement un nombre aléatoire de quatre chiffres c (entre 1000 et 9999).
    • La boucle s'arrête dès que c contient simultanément les deux chiffres a et b.
    Résultat do while Résultat do while
    Exemple d'exécution et d'acceptation du nombre à 4 chiffres

Atelier 7 : Fonctions & Objets Prédéfinis (Nombres & Dates)

Mission : Structurer son code en fonctions réutilisables, manipuler les méthodes de l'objet Number pour le typage et la conversion, et exploiter l'objet Date pour le calcul d'intervalles chronologiques.

Exercice 1 : Déclaration et appel d'une fonction max(a, b)

Travail demandé :

  1. Créer un fichier HTML nommé javascript15.html.
  2. Écrire une fonction nommée max(a, b) qui prend deux paramètres numériques et renvoie la plus grande des deux valeurs :
    function max(a, b) {
      return (a > b) ? a : b;
    }
  3. Tester la fonction avec différentes valeurs et afficher le résultat via console.log() et document.writeln().
  4. Réécrire la fonction sous forme de fonction fléchée : const max = (a, b) => ...;.

Exercice 2 : Méthodes de l'objet Number & conversions

Travail demandé :

  1. Ouvrir la console du navigateur (F12).
  2. Tester la validation avec isNaN() :
    console.log(isNaN("2024"));      // false (valeur convertible)
    console.log(isNaN("2024-STI"));  // true (valeur non convertible)
  3. Convertir un entier en sa représentation binaire et hexadécimale via toString(base) :
    let n = 42;
    console.log(n.toString(2));  // '101010' (binaire)
    console.log(n.toString(16)); // '2a' (hexadécimal)
  4. Comparer les résultats et comportements de parseInt("30.75px"), parseFloat("30.75px") et Number("30.75").

Exercice 3 : Manipulation temporelle avec l'objet Date

Travail demandé :

  1. Dans la console du navigateur, exécuter let d = new Date();.
  2. Afficher la date courante au format francophone JJ/MM/AAAA en assemblant d.getDate(), d.getMonth() + 1 et d.getFullYear().
  3. Créer une instance date pour le jour du baccalauréat :
    let bac = new Date("2027-06-02");
  4. Calculer le nombre de jours restants jusqu'au baccalauréat grâce à la différence des horodatages en millisecondes :
    let diffJours = Math.ceil((bac - d) / (1000 * 60 * 60 * 24));
    console.log("Jours restants avant le bac :", diffJours);

Atelier 8 : Événements & Contrôle des Formulaires

Mission : Rendre les pages web interactives en interceptant les événements déclenchés par l'utilisateur : le clic de souris (click), le changement de valeur (change), la prise et perte de focus (focus / blur), ainsi que le contrôle à la soumission (submit) et réinitialisation (reset).

Exercice 1 : Interception et comptage de clics (click)

Soit une case à cocher protégée par un gestionnaire d'événement :

<form action="#">
  <input type="checkbox" name="defi" id="defi">
  <label for="defi">Cochez-moi si vous pouvez !</label>
</form>
<script>
  const defi = document.getElementById("defi");
  let clics = 0;
  defi.addEventListener("click", (e) => {
    clics++;
    if (clics < 3) {
      alert("Désolé ! Cliquez encore " + (3 - clics) + " fois !");
      e.preventDefault(); // Annule la coche
    }
  });
</script>

Travail demandé :

  1. Copier le code dans un fichier HTML nommé javascript17.html.
  2. Tester dans le navigateur et vérifier que la case ne peut être cochée qu'au troisième clic.

Exercice 2 : Calcul dynamique instantané (change)

On désire concevoir un formulaire statistique qui affiche automatiquement la valeur maximale, la valeur minimale et la moyenne dès que l'utilisateur renseigne les deux champs :

Formulaire vide
Un seul champ
Deuxième champ
Résultats calculés
Étapes successives du calcul déclenché sur l'événement change

Travail demandé :

  1. Créer un fichier HTML nommé javascript18.html.
  2. Créer deux champs <input type="number"> pour saisir deux nombres a et b.
  3. Attacher un écouteur change sur chaque champ pour vérifier si les deux valeurs sont saisies, puis calculer et afficher : Math.max(a, b), Math.min(a, b) et la moyenne (a + b) / 2.

Exercice 3 : Jeu du nombre secret (focus / blur)

On programme un jeu interactif où l'élève doit deviner un nombre secret choisi aléatoirement entre 1 et 99. Les indications sont fournies dès que l'utilisateur valide sa proposition (perte de focus avec blur) :

Travail demandé :

  1. Créer un fichier HTML nommé javascript19.html.
  2. Générer un nombre aléatoire secret :
    const secret = Math.floor(Math.random() * 99) + 1;
  3. Écouter l'événement blur ou change sur le champ de saisie pour comparer la proposition au nombre secret :
    • Si la saisie est plus petite : afficher « Plus grand ! (Greater than ...) »
    • Si la saisie est plus grande : afficher « Plus petit ! (Lesser than ...) »
    • Si la saisie est exacte : afficher « Bravo ! Vous avez deviné. C'était bien ... ! »
  4. À la prise de focus (focus), réinitialiser le champ pour faciliter la saisie suivante.

Exercice 4 : Contrôle de saisie et réinitialisation (submit / reset)

Soit le formulaire d'inscription d'un élève :

<form id="student" action="#">
  <div>
    <label for="np">Nom & Prénom</label>
    <input type="text" id="np" required>
  </div>
  <div>
    <label for="cl">Classe</label>
    <input type="text" id="cl" required>
  </div>
  <button type="submit">Envoyer</button>
  <button type="reset">Annuler</button>
</form>
Formulaire élève
Formulaire élève avec boutons d'envoi et d'annulation

Travail demandé :

  1. Créer un fichier HTML nommé javascript22.html.
  2. Ajouter un écouteur submit sur le formulaire : intercepter l'envoi pour convertir automatiquement le nom et la classe en MAJUSCULES avant soumission.
  3. Ajouter un écouteur reset sur le formulaire : vérifier si les champs sont déjà vides ; si oui, empêcher l'action ; si non, convertir le texte en minuscules ou demander confirmation avant effacement.