Compréhension et utilisation des évènements en javascript
Dans ce cours, nous allons explorer la gestion des évènements en développement web. Nous verrons comment utiliser HTML, CSS et JavaScript ensemble pour créer des interfaces interactives, comprendre les écouteurs d'évènements, la propagation des évènements, ainsi que les bonnes pratiques pour une programmation évènementielle efficace.
Les évènements sont au cœur de l'interactivité web. Ils permettent aux utilisateurs d'interagir avec les pages web via des clics, saisies, mouvements de souris, etc. La maîtrise de la gestion évènementielle est essentielle pour créer des expériences utilisateur fluides et réactives.
Type d'évènement | Exemples | Déclencheur |
---|---|---|
Souris | click, mouseover, mouseout | Utilisateur |
Clavier | keydown, keyup, keypress | Utilisateur |
Formulaire | submit, focus, blur, change | Utilisateur |
Système | load, resize, scroll | Navigateur |
addEventListener()
🎯 Syntaxe de base : element.addEventListener('evenement', fonction, options); Exemple concret : <button id="monBouton">Cliquez-moi</button> // JavaScript const bouton = document.getElementById('monBouton'); bouton.addEventListener('click', function() { alert('Bouton cliqué !'); }); // Ou avec une fonction fléchée bouton.addEventListener('click', () => { console.log('Clic détecté !'); });
Méthode | Exemple | Recommandation |
---|---|---|
HTML inline | <button onclick="alert('test')"> | ❌ Éviter |
Propriété JS | btn.onclick = function(){} | ⚠️ Limitée |
addEventListener | btn.addEventListener('click', fn) | ✅ Recommandée |
📝 Propriétés utiles de l'objet Event : button.addEventListener('click', function(event) { console.log('Type:', event.type); // "click" console.log('Target:', event.target); // élément cliqué console.log('Position X:', event.clientX); // position souris console.log('Position Y:', event.clientY); // position souris console.log('Touche Ctrl:', event.ctrlKey); // Ctrl pressée ? }); // Pour les évènements clavier input.addEventListener('keydown', function(event) { console.log('Touche:', event.key); // "Enter", "a", "Escape" console.log('Code:', event.code); // "KeyA", "Enter" if (event.key === 'Enter') { console.log('Entrée pressée !'); } });
🌊 Phases de propagation : <div id="parent"> <button id="enfant">Cliquez</button> </div> 1️⃣ CAPTURE : document → parent → enfant 2️⃣ TARGET : évènement sur l'élément cible 3️⃣ BUBBLING : enfant → parent → document (par défaut) // Écouter en phase de capture parent.addEventListener('click', handler, true); // 3ème param = true // Écouter en phase de bubbling (défaut) parent.addEventListener('click', handler); // ou false // Arrêter la propagation button.addEventListener('click', function(event) { event.stopPropagation(); // Évite la remontée });
Évènement | Utilisation | Exemple d'usage |
---|---|---|
click | Clic de souris | Boutons, liens |
mouseover/out | Survol souris | Tooltips, menus |
keydown/up | Touches clavier | Raccourcis, validation |
submit | Envoi formulaire | Validation, AJAX |
load | Page chargée | Initialisation |
resize | Taille fenêtre | Design responsive |
🎯 Délégation d'évènements (Event Delegation) : // Au lieu d'écouter chaque bouton individuellement const boutons = document.querySelectorAll('.btn'); boutons.forEach(btn => btn.addEventListener('click', handler)); // Écoutez sur le parent (plus efficace !) document.getElementById('container').addEventListener('click', function(event) { if (event.target.classList.contains('btn')) { // Traiter le clic sur le bouton console.log('Bouton cliqué:', event.target.textContent); } }); 🔄 Supprimer des écouteurs : function monHandler() { /* ... */ } element.addEventListener('click', monHandler); element.removeEventListener('click', monHandler); // Même référence ! ⏱️ Debouncing (éviter trop d'appels) : let timeout; window.addEventListener('resize', function() { clearTimeout(timeout); timeout = setTimeout(() => { console.log('Redimensionnement terminé'); }, 250); });
💡 To-Do List interactive : <!-- HTML --> <div id="todoApp"> <input type="text" id="newTask" placeholder="Nouvelle tâche..."> <button id="addBtn">Ajouter</button> <ul id="taskList"></ul> </div> <!-- JavaScript --> <script> document.addEventListener('DOMContentLoaded', function() { const newTaskInput = document.getElementById('newTask'); const addBtn = document.getElementById('addBtn'); const taskList = document.getElementById('taskList'); // Ajouter une tâche function addTask() { const taskText = newTaskInput.value.trim(); if (taskText) { const li = document.createElement('li'); li.innerHTML = `${taskText} <button class="delete">×</button>`; taskList.appendChild(li); newTaskInput.value = ''; } } // Écouteurs addBtn.addEventListener('click', addTask); newTaskInput.addEventListener('keypress', function(event) { if (event.key === 'Enter') addTask(); }); // Délégation pour supprimer taskList.addEventListener('click', function(event) { if (event.target.classList.contains('delete')) { event.target.parentElement.remove(); } }); }); </script>
addEventListener()
est la méthode moderne recommandéeevent
contient des informations précieusespreventDefault()
pour contrôler le comportement par défautLa gestion des évènements est fondamentale en développement web moderne. Elle permet de créer des interfaces riches et interactives qui réagissent aux actions des utilisateurs. Maîtriser les écouteurs d'évènements, comprendre la propagation et appliquer les bonnes pratiques comme la délégation vous permettra de développer des applications web performantes et maintenables. L'évènementiel est la clé d'une expérience utilisateur fluide et engageante.
Objectif pédagogique : Maîtriser l'ajout d'écouteurs d'évènements avec addEventListener() et comprendre les évènements de base.
Énoncé :
1. Créez un bouton HTML avec l'id "monBouton" et ajoutez un écouteur qui affiche "Hello World!" dans la console au clic.
Conseil : Utilisez addEventListener() plutôt que onclick.
2. Ajoutez un second écouteur sur le même bouton qui change la couleur du texte en rouge.
Astuce : Un élément peut avoir plusieurs écouteurs pour le même évènement.
<button id="monBouton">Cliquez-moi</button>
const bouton = document.getElementById('monBouton');
bouton.addEventListener('click', function() {
console.log('Hello World!');
});
bouton.addEventListener('click', function() {
bouton.style.color = 'red';
});
Objectif pédagogique : Utiliser les propriétés de l'objet Event pour récupérer des informations sur l'évènement.
Énoncé :
1. Créez un div de 200x200px avec un fond bleu. Ajoutez un écouteur de clic qui affiche les coordonnées X et Y de la souris.
Rappel : Utilisez event.clientX et event.clientY.
2. Ajoutez un écouteur sur un input text qui détecte quand l'utilisateur presse la touche "Enter" et affiche le contenu.
Procédure : Écoutez 'keydown' et vérifiez event.key === 'Enter'
<div id="zone" style="width:200px; height:200px; background:blue;"></div>
const zone = document.getElementById('zone');
zone.addEventListener('click', function(event) {
console.log('X:', event.clientX, 'Y:', event.clientY);
});
<input type="text" id="monInput" placeholder="Tapez et appuyez sur Entrée">
const input = document.getElementById('monInput');
input.addEventListener('keydown', function(event) {
if (event.key === 'Enter') {
console.log('Contenu:', event.target.value);
}
});
Objectif pédagogique : Comprendre la propagation des évènements et utiliser la délégation pour optimiser les performances.
Énoncé :
Créez une liste <ul> avec 3 éléments <li> contenant chacun un bouton "Supprimer" :
1. Utilisez la délégation d'évènements pour gérer tous les clics depuis le <ul>
2. Supprimez l'élément <li> correspondant quand on clique sur "Supprimer"
<ul id="maListe">
<li>Élément 1 <button class="supprimer">Supprimer</button></li>
<li>Élément 2 <button class="supprimer">Supprimer</button></li>
<li>Élément 3 <button class="supprimer">Supprimer</button></li>
</ul>
const liste = document.getElementById('maListe');
liste.addEventListener('click', function(event) {
if (event.target.classList.contains('supprimer')) {
event.target.parentElement.remove();
// Optionnel : event.stopPropagation();
}
});
Objectif pédagogique : Maîtriser la gestion des formulaires avec validation en temps réel et preventDefault().
Énoncé :
1. Créez un formulaire avec email et mot de passe. Validez l'email en temps réel (format valide).
2. Empêchez la soumission si les champs sont invalides et affichez des messages d'erreur.
<form id="monForm">
<input type="email" id="email" placeholder="Email" required>
<span id="emailError" style="color:red;"></span>
<input type="password" id="motdepasse" placeholder="Mot de passe" required>
<span id="passwordError" style="color:red;"></span>
<button type="submit">Valider</button>
</form>
const form = document.getElementById('monForm');
const email = document.getElementById('email');
const password = document.getElementById('motdepasse');
// Validation temps réel email
email.addEventListener('input', function() {
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
const errorSpan = document.getElementById('emailError');
if (!emailRegex.test(email.value)) {
errorSpan.textContent = 'Format email invalide';
} else {
errorSpan.textContent = '';
}
});
// Validation soumission
form.addEventListener('submit', function(event) {
if (email.value === '' || password.value.length < 6) {
event.preventDefault();
alert('Veuillez corriger les erreurs');
}
});
Objectif pédagogique : Combiner plusieurs types d'évènements pour créer une application interactive avec drag & drop.
Énoncé :
Créez un système de glisser-déposer simple :
1. Une div "source" draggable et une div "cible" où déposer
2. Gérez les évènements dragstart, dragover, et drop pour permettre le déplacement
<div id="source" draggable="true" style="width:100px; height:100px; background:blue; margin:10px;">
Glissez-moi
</div>
<div id="cible" style="width:200px; height:200px; border:2px dashed #ccc; margin:10px;">
Zone de dépôt
</div>
const source = document.getElementById('source');
const cible = document.getElementById('cible');
// Début du glisser
source.addEventListener('dragstart', function(event) {
event.dataTransfer.setData('text/plain', 'element-deplace');
});
// Survol de la zone cible
cible.addEventListener('dragover', function(event) {
event.preventDefault(); // Permettre le dépôt
cible.style.backgroundColor = '#f0f0f0';
});
// Dépôt dans la cible
cible.addEventListener('drop', function(event) {
event.preventDefault();
cible.appendChild(source);
cible.style.backgroundColor = '';
});
Objectif pédagogique : Manipuler les styles CSS via les événements et comprendre mouseover/mouseout.
Énoncé :
1. Créez un carré de 150x150px avec un fond vert. Faites-le passer en rouge au survol de la souris.
Conseil : Utilisez les événements mouseover et mouseout.
2. Ajoutez un effet supplémentaire : le carré doit s'agrandir à 200x200px pendant le survol.
Astuce : Modifiez la propriété width et height dans l'événement.
<div id="monCarre" style="width:150px; height:150px; background:green;"></div>
const carre = document.getElementById('monCarre');
carre.addEventListener('mouseover', function() {
carre.style.backgroundColor = 'red';
});
carre.addEventListener('mouseout', function() {
carre.style.backgroundColor = 'green';
});
carre.addEventListener('mouseover', function() {
carre.style.width = '200px';
carre.style.height = '200px';
});
carre.addEventListener('mouseout', function() {
carre.style.width = '150px';
carre.style.height = '150px';
});
Objectif pédagogique : Créer une interface interactive avec mise à jour dynamique.
Énoncé :
1. Créez un compteur avec un bouton "+" et un bouton "-" qui incrémente/décrémente une valeur affichée.
Rappel : La valeur initiale est 0 et doit être stockée dans une variable.
2. Ajoutez un bouton "Reset" qui remet le compteur à 0.
Procédure : Utilisez textContent pour mettre à jour l'affichage.
<div id="compteur">0</div>
<button id="incrementer">+</button>
<button id="decrementer">-</button>
<button id="reset">Reset</button>
let count = 0;
const affichage = document.getElementById('compteur');
const plusBtn = document.getElementById('incrementer');
const moinsBtn = document.getElementById('decrementer');
const resetBtn = document.getElementById('reset');
plusBtn.addEventListener('click', function() {
count++;
affichage.textContent = count;
});
moinsBtn.addEventListener('click', function() {
count--;
affichage.textContent = count;
});
resetBtn.addEventListener('click', function() {
count = 0;
affichage.textContent = count;
});
Objectif pédagogique : Gérer des événements complexes sur plusieurs éléments avec gestion dynamique du DOM.
Énoncé :
Créez une galerie avec 3 miniatures d'images et une zone d'affichage principale :
1. Au clic sur une miniature, l'image principale doit changer pour afficher la version agrandie
2. Ajoutez un effet visuel (bordure colorée) sur la miniature sélectionnée
<div id="imagePrincipale">
<img src="image1-grande.jpg" id="mainImage" style="width:400px;">
</div>
<div class="miniatures">
<img src="image1-petite.jpg" data-grande="image1-grande.jpg" class="miniature">
<img src="image2-petite.jpg" data-grande="image2-grande.jpg" class="miniature">
<img src="image3-petite.jpg" data-grande="image3-grande.jpg" class="miniature">
</div>
const miniatures = document.querySelectorAll('.miniature');
const mainImage = document.getElementById('mainImage');
miniatures.forEach(mini => {
mini.addEventListener('click', function() {
// Changer l'image principale
mainImage.src = this.dataset.grande;
// Retirer la bordure de toutes les miniatures
miniatures.forEach(m => m.style.border = 'none');
// Ajouter bordure à la miniature sélectionnée
this.style.border = '3px solid blue';
});
});
Objectif pédagogique : Créer un système interactif complexe avec gestion d'état et feedback visuel.
Énoncé :
1. Créez 5 étoiles vides qui se remplissent au survol de la souris (jusqu'à l'étoile survolée)
2. Au clic, sauvegardez la note sélectionnée et affichez-la sous forme textuelle ("3/5")
<div class="etoiles">
<span class="etoile" data-valeur="1">☆</span>
<span class="etoile" data-valeur="2">☆</span>
<span class="etoile" data-valeur="3">☆</span>
<span class="etoile" data-valeur="4">☆</span>
<span class="etoile" data-valeur="5">☆</span>
</div>
<div id="noteAffichee"></div>
const etoiles = document.querySelectorAll('.etoile');
const noteAffichee = document.getElementById('noteAffichee');
let noteSelectionnee = 0;
etoiles.forEach(etoile => {
// Survol d'une étoile
etoile.addEventListener('mouseover', function() {
const valeur = parseInt(this.dataset.valeur);
remplirEtoiles(valeur);
});
// Clic sur une étoile
etoile.addEventListener('click', function() {
noteSelectionnee = parseInt(this.dataset.valeur);
noteAffichee.textContent = `${noteSelectionnee}/5`;
});
});
// Retour à la note sélectionnée quand la souris quitte
document.querySelector('.etoiles').addEventListener('mouseout', function() {
remplirEtoiles(noteSelectionnee);
});
function remplirEtoiles(nombre) {
etoiles.forEach((etoile, index) => {
etoile.textContent = index < nombre ? '★' : '☆';
});
}
Objectif pédagogique : Créer une application de dessin simple avec gestion des événements de souris.
Énoncé :
Créez une zone de dessin avec Canvas :
1. Dessinez un trait qui suit le mouvement de la souris quand le bouton est enfoncé
2. Ajoutez un sélecteur de couleur pour changer la couleur du trait
<canvas id="monCanvas" width="500" height="400" style="border:1px solid #000;"></canvas>
<input type="color" id="couleurPinceau" value="#000000">
const canvas = document.getElementById('monCanvas');
const ctx = canvas.getContext('2d');
const couleurInput = document.getElementById('couleurPinceau');
let isDrawing = false;
let lastX = 0;
let lastY = 0;
// Démarrer le dessin
canvas.addEventListener('mousedown', (e) => {
isDrawing = true;
[lastX, lastY] = [e.offsetX, e.offsetY];
});
// Dessiner
canvas.addEventListener('mousemove', (e) => {
if (!isDrawing) return;
ctx.beginPath();
ctx.moveTo(lastX, lastY);
ctx.lineTo(e.offsetX, e.offsetY);
ctx.strokeStyle = couleurInput.value;
ctx.lineWidth = 3;
ctx.stroke();
[lastX, lastY] = [e.offsetX, e.offsetY];
});
// Arrêter le dessin
canvas.addEventListener('mouseup', () => isDrawing = false);
canvas.addEventListener('mouseout', () => isDrawing = false);
Guide de référence avec focus sur les événements JavaScript
🚀 Mémento de développement web - HTML, CSS & JavaScript
Gardez ce guide à portée de main pour vos projets !
Explorez comment l'art et la philosophie s'entrelacent pour questionner notre perception de la réalité et de l'esthétique.
Read more.Plongez dans les débats philosophiques sur la liberté, ses implications éthiques et les défis contemporains qui l'entourent.
Read more.Découvrez les différentes approches philosophiques de la vérité et comment elles influencent notre compréhension du monde.
Read more.Abonnez-vous maintenant et recevez notre newsletter hebdomadaire avec des matériaux éducatifs, de nouveaux cours, des articles intéressants, des livres populaires et bien plus encore !