Cyrille Perois
Front-end architect @ w3r.one
Front-end - Rendre le Web vivant (JavaScript)
Master Information-Communication Ecosystèmes médiatiques et transition numérique - ICP 2025
✅ Comprendre le rôle de JavaScript en tant que troisième pilier du développement front-end
✅ Découvrir la syntaxe de base de JavaScript : variables, conditions
✅ Apprendre à manipuler le DOM : sélectionner des éléments HTML et réagir à des événements (comme le clic)
✅ Écrire un premier script simple pour modifier dynamiquement le contenu de la page
HTML est le squelette (contenu), CSS est l'habillage (style)
JS est le système nerveux : il permet l'action et l'intéraction
<!DOCTYPE html>
<html>
<head>
<!-- ... -->
<link rel="stylesheet" href="style.css" />
<script src="script.js" defer></script>
</head>
<body>
<!-- ... -->
</body>
</html>Dans votre navigateur, appuyez sur la touche F12. Vous aurez accès aux outils de développement. Parmi ceux-ci, la "console" vous permet de voir les messages d'erreur liés au JS, mais aussi d'exécuter du code pour faire des tests
Firefox
Chrome
Essayez de taper `console.log("Hello world")` dans la console
// Déclaration de la variable
let myVariable
// Affectation d'une valeur
myVariable = "Hello, world !"
// Déclaration et affectation
let myFirstVar = "Hello"
// Réassignation de la valeur d'une variable
let myVariable = "Hello world !"
myVariable = "Vous voulez un whisky ?"// Déclaration et affectation
const myVariable = "Hello, world !"
const hello = "Hello world !"
hello = "Vous voulez un whisky ?"
// => ReferenceError
// Impossible de réaffecter une constanteJS est un langage à typage dynamique et faible.
Le type d'une variable est donc :
const integer = 8000
const decimal = 123.456
// addition
8000 + 42 // => 8042
// soustraction
8000 - 42 // => 7958
// multiplication
13 * 37 // => 481
// division
8000 / 42 // => 190.476190476
// exponentiation
2 ** 3 // => 8 (2 puissance 3, quoi)
8000 / 0 // => Infinity
-8000 / 0 // => -Infinity
"Everything but a number" / 8000 // => NaN
"Everything but a number" / 8000 + 42 // => NaN"Hello, world !"
'Hello, world !'
`Hello, world !`
const who = "world";
"Hello, " + who + " !"
`Hello ${who} !`
// => "Hello, world !"
`The result of 1 + 1 is ${1 + 1}`
// => "The result of 1 + 1 is 2"const ok = true
const notOk = falseconst nullValue = null
let undefinedValue
console.log(undefinedValue) // => undefined
const explicitUndefined = undefinedconst me = {
firstname: "Cyrille",
age: 28
}
me.firstname // => "Cyrile"
me.age // => 28
me.firstname = "George"
me.firstname // => "George"
me.job = "developer and teacher"
me.job // "developer and teacher"const name = prompt("What's your name ?")
if (name === "Cyrille") {
alert("Me too !")
} else if (name === "Toto") {
alert("Srsly?")
} else {
alert(`Hello ${name} !`)
}10 < 20 // => true
10 <= 20 // => true
20 > 10 // => true
20 >= 10 // => true
20 == 20 // => true
10 != 20 // => true
"hello" == "hello" // => true
"hello" != "world" // => true10 == "10" // => true
20 != "20" // => false😱
10 === "10" // => false
20 !== "20" // => true🤗
Privilégier les opérateurs stricts (=== et !==) pour éviter la conversion implicite de type
true && true // => true
true && false // => false
true || true // => true
true || false // => true
false || false // => false
!true // => false
!false // => truelet i = 0
while (i < 10) {
console.log(i)
++i
}
let j = 0
do {
console.log(j)
++j
} while (j < 10)
for (let k = 0; k < 10; ++k) {
console.log(k)
}
// => 0 1 2 3 4 5 6 7 8 9const addTwoNumbers = (number1, number2) => {
return number1 + number2
}
addTwoNumbers(8000, 42) // => 8042const sayHello = (who = "World") => {
return `Hello ${who}`
}
sayHello("Tom") // => Hello Tom
sayHello() // => Hello WorldLa valeur par défaut d'un paramètre est utilisée si ce paramètre reçoit la valeur undefined (explicitement ou implicitement)
const emptyArray = []
const animals = ["cat", "dog", "mouse"]
animals[0] // => "cat"
animals[1] // => "dog"
animals[2] // => "mouse"
animals.length // => 3
animals[1] = "parrot"
animals.push("rat")
// => ["cat", "parrot", "mouse", "rat"] (modifie le tableau)
[...animals, "rat"]
// => ["cat", "parrot", "mouse", "rat"] (crée un nouveau tableau)
["rat", ...animals]
// => ["rat", "cat", "parrot", "mouse"] (crée un nouveau tableau)
animals.slice(0, 2)
// => ["cat", "parrot"] (nouveau tableau)const fruits = ["Apple", "Banana", "Strawberry"]
for (let i = 0, length = fruits.length; i < length; ++i) {
console.log(fruits[i])
}
for (let fruit of fruits) {
console.log(fruit)
}
fruits.forEach((fruit) => console.log(fruit))
// => "Apple" "Banana" "Strawberry"
fruits.map((fruit) => fruit.toUpperCase())
// => ["APPLE", "BANANA", "STRAWBERRY"] (nouveau tableau)Le Document Object Model ou DOM (pour modèle objet de document) est une interface de programmation pour les documents HTML, XML et SVG. Il fournit une représentation structurée du document sous forme d'un arbre et définit la façon dont la structure peut être manipulée par les programmes, en termes de style et de contenu. Le DOM représente le document comme un ensemble de nœuds et d'objets possédant des propriétés et des méthodes. Les nœuds peuvent également avoir des gestionnaires d'événements qui se déclenchent lorsqu'un événement se produit. Cela permet de manipuler des pages web grâce à des scripts et/ou des langages de programmation.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Mon super site</title>
</head>
<body>
<h1>Bienvenue sur mon super site</h1>
<p>Ceci est un paragraphe</p>
<div>Et ceci est une div</div>
</body>
</html>
html
head
meta
body
title
text
h1
p
text
text
div
text
Il y a un inspecteur de DOM dans les outils de développement de votre navigateur (F12 ou CTRL+SHIFT+I)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Mon super site</title>
</head>
<body>
<h1>Hello world</h1>
<p>
Ceci est un paragraphe
</p>
<div>Ceci est une div</div>
</body>
</html>
html
head
meta
body
title
text
h1
p
text
text
div
text
L'objet `document` nous donne des références directes vers certains éléments clef du DOM
document.documentElement
document.body
document.head
<body>
<html>
<head>
<h1>
<p>
<div>
parentNode
parentNode
firstChild
parentNode
firstChild
parentNode
lastChild
parentNode
lastChild
nextSibling
previousSibling
nextSibling
previousSibling
Les éléments ont des liens les uns avec les autres
On connait déjà un mécanisme de "ciblage" des éléments HTML : les sélecteurs CSS. Et si on pouvait réutiliser cette syntaxe pour cibler des éléments en JS ?
document.querySelector(sélecteur CSS)
Permet de récupérer le premier élément correspondant au sélecteur CSS passé en paramètre (ou null si aucun ne correspond)
document.querySelectorAll(sélecteur CSS)
Permet de récupérer une liste contenant tous les éléments correspondants au sélecteur CSS passé en paramètre
<body>
<div>
<div>
const div = document.querySelector("div:nth-child(2)")
// => <div></div><body>
<div>
const divs = document.querySelectorAll("div")
// => NodeList [2 items]<div>
querySelector et querySelectorAll peuvent être appliqués au document ou sur un élément :
const element = document.querySelector(".js-element")
const subelement = element.querySelector(".js-subelement")<p>
Lorem <strong>ipsum</strong> dolor
sit amet consectetur adipiscing
</p>const p = document.querySelector("p")
p.innerHTML
// => "Lorem <strong>ipsum</strong> dolor sit amet consectetur adipiscing"
p.innerHTML = "Lorem <em>ipsum</em> dolor"<p>
Lorem <strong>ipsum</strong>
<span style="display: none;">hidden text</span>
dolor sit amet consectetur adipiscing
</p>const p = document.querySelector("p")
p.innerText
/*
Lorem ipsum dolor sit amet consectetur adipiscing
*/
p.innerText = "Lorem <em>ipsum</em> dolor"<p>
Lorem <strong>ipsum</strong> <span style="display: none;">hidden text</span>
dolor sit amet consectetur adipiscing
</p>const p = document.querySelector("p")
p.textContent
/*
Lorem ipsum hidden text dolor sit amet consectetur adipiscing
*/
p.textContent = "Lorem <em>ipsum</em> dolor"<input
id="login"
name="login"
placeholder="Enter your login"
/>const input = document.querySelector("#login")
input.id // => "login"
input.name // => "login"
input.placeholder // => "Enter your login"
input.id = "login-field"
// <input id="login-field" ... /><p class="alert alert-error">
Une erreur est survenue
</p>const alert = document.querySelector(".alert")
for(const className of alert.classList) {
console.log(className)
}
// => "alert" "alert-error"
alert.classList.contains("alert-error")
// => true
alert.classList.remove("alert-error")
// => class="alert"
alert.classList.add("alert-warning")
// => class="alert alert-warning"
alert.classList.toggle("alert-warning")
// => class="alert"
alert.classList.toggle("alert-warning")
// => class="alert alert-warning"
alert.classList.toggle("alert-warning", someBoolean)<p style="font-size: 3rem; color: red;">
Une erreur est survenue
</p>const alert = document.querySelector("p")
alert.style.fontSize // => "3rem"
alert.style.color // => "red"
alert.style.fontSize = "2rem"
// => style="font-size: 2rem; color: red"
alert.style.backgroundColor = "white"
// => style="font-size: 3rem; color: red; background-color: white;"const item = document.createElement("li")
item.textContent = "Lorem ipsum"Une fois l'élément créé, on a l'objet en mémoire, mais il n'est pas automatiquement inséré dans le DOM : le navigateur ne peut pas savoir où on souhaite qu'il apparaisse
<ul class="js-list">
<li>Item 1</li>
<li>Item 2</li>
<li>ITem 3</li>
</ul>const list = document.querySelector(".js-list")
const newItem = document.createElement("li")
newItem.textContent = "Item 0"
newItem.style.color = "red"
list.prepend(newItem)<ul class="js-list">
<li>Item 1</li>
<li>Item 2</li>
<li>ITem 3</li>
</ul>const list = document.querySelector(".js-list")
const newItem = document.createElement("li")
newItem.textContent = "Item 4"
newItem.style.color = "red"
list.append(newItem)<ul class="js-list">
<li>Item 1</li>
<li>Item 2</li>
<li>ITem 3</li>
</ul>const list = document.querySelector(".js-list")
const secondItem = list.querySelector(":nth-child(2)")
const newItem = document.createElement("li")
newItem.textContent = "Item 2bis"
newItem.style.color = "red"
secondItem.after(newItem)<ul class="js-list">
<li>Item 1</li>
<li>Item 2</li>
<li>ITem 3</li>
</ul>const list = document.querySelector(".js-list")
const thirdItem = list.querySelector(":nth-child(3)")
const newItem = document.createElement("li")
newItem.textContent = "Item 2bis"
newItem.style.color = "red"
thirdItem.before(newItem)<ul class="js-list">
<li>Item 1</li>
<li>Item 2</li>
<li>ITem 3</li>
</ul>const list = document.querySelector(".js-list")
const thirdItem = list.querySelector(":nth-child(3)")
const newItem = document.createElement("li")
newItem.textContent = "Item 3 replaced"
newItem.style.color = "red"
thirdItem.replaceWith(newItem)<ul class="js-list">
<li>Item 1</li>
<li>Item 2</li>
<li>ITem 3</li>
</ul>const list = document.querySelector(".js-list")
const thirdItem = list.querySelector(":nth-child(3)")
thirdItem.remove()Un événement, c'est quand il se passe quelque chose...
... sur un élément
click/ mouseover / mouseout /mousemove
focus / blur
submit
keydown / keyup
... sur le document
... sur le style d'un élément
... sur des requêtes réseau
const onClick = () => console.log("You clicked!")
element.addEventListener(
"click", // Type de l'événement
onClick // Fonction à exécuter
)Pour pouvoir réagir à un événement, il nous faut :
Pour arrêter un gestionnaire d'événements sur un élément, on a besoin de :
const onClick = () => console.log("You clicked!")
element.addEventListener("click", onClick)
element.removeEventListener("click", onClick)Lorsqu'une fonction associée à un gestionnaire d'événement est exécutée, elle reçoit automatiquement en premier paramètre un objet représentant l'événement déclenché
const element = document.querySelector(".js-element")
const onClick = (event) => {
console.log(event.type)
console.log(event.target)
console.log(event.currentTarget)
console.log(event.clientX)
console.log(event.clientY)
}
element.addEventListener("click", onClick)By Cyrille Perois