Chapitre 6 – Gestion des événements
Les événements, c’est ce qui rend une page “interactive” : clic, survol, frappe au clavier, soumission de formulaire, changement d’un champ… Dans ce chapitre, tu vas apprendre à écouter ces événements proprement avec jQuery, à comprendre this, à éviter les erreurs fréquentes, et à utiliser une technique clé : la délégation d’événements (indispensable quand tu ajoutes des éléments dynamiquement).
1) Principe : “écouter” un événement
Un événement est un signal envoyé par le navigateur quand quelque chose se passe : clic sur un bouton, saisie dans un input, scroll, etc.
En jQuery, on écoute le plus souvent avec on() :
$(function () {
$('#btn').on('click', function () {
alert('Clic détecté');
});
});
2) Le paramètre “event” (ou “e”) : à quoi sert-il ?
Le navigateur te fournit souvent un objet événement. On le récupère en paramètre :
$('#btn').on('click', function (event) {
console.log(event.type); // "click"
});
preventDefault() : empêcher le comportement par défaut
Très important sur les liens et formulaires.
$('a').on('click', function (e) {
e.preventDefault(); // empêche la navigation
console.log('On gère le clic nous-mêmes.');
});
3) Comprendre “this” (fondamental)
Dans un handler d’événement, this représente l’élément HTML qui a déclenché l’événement. En jQuery, on le transforme souvent en objet jQuery :
$('.item').on('click', function () {
// this = élément cliqué (DOM natif)
const $el = $(this); // version jQuery
$el.toggleClass('active');
});
4) Événements courants à connaître
| Événement | Quand | Exemple |
|---|---|---|
| click | Clic souris / tap mobile | $('#btn').on('click', ...) |
| submit | Soumission formulaire | $('form').on('submit', ...) |
| input | Valeur qui change (en temps réel) | $('#q').on('input', ...) |
| change | Changement validé (select/checkbox) | $('select').on('change', ...) |
| keydown / keyup | Clavier | $(document).on('keydown', ...) |
| mouseenter / mouseleave | Survol souris | $('.box').on('mouseenter', ...) |
5) Exemple réel : gérer un formulaire sans rechargement
On intercepte la soumission d’un formulaire, on valide, puis on affiche un message. (On fera l’AJAX au Chapitre 11.)
$(function () {
$('#loginForm').on('submit', function (e) {
e.preventDefault(); // empêche le reload
const email = String($('#email').val()).trim();
const password = String($('#password').val()).trim();
if (!email || !password) {
$('#message').removeClass('ok').addClass('warn').text('Tous les champs sont requis.');
return;
}
$('#message').removeClass('warn').addClass('ok').text('Formulaire validé (simulation).');
});
});
6) Le grand piège : les éléments ajoutés dynamiquement
Problème : si tu ajoutes des éléments après coup (ex : append), les handlers déjà attachés ne s’appliquent pas automatiquement à ces nouveaux éléments.
Exemple du piège
$(function () {
// Handler attaché aux .del présents AU MOMENT de l'exécution
$('.del').on('click', function () {
alert('Suppression');
});
// Puis on ajoute un bouton .del plus tard...
$('#list').append('<button class="del">Supprimer</button>');
});
7) La solution pro : la délégation d’événements
La délégation consiste à écouter l’événement sur un parent (déjà présent), et à filtrer les clics qui viennent des enfants.
$(function () {
// On écoute sur #list (qui existe) et on délègue aux .del
$('#list').on('click', '.del', function () {
alert('Suppression (déléguée)');
});
// Maintenant, même les nouveaux boutons fonctionneront :
$('#list').append('<button class="del">Supprimer</button>');
});
8) Stopper la propagation : stopPropagation()
Un clic peut remonter dans la hiérarchie (bubbling). Si tu as un clic sur un enfant ET sur un parent, les deux peuvent se déclencher.
$('#parent').on('click', function () {
console.log('Clic parent');
});
$('#child').on('click', function (e) {
e.stopPropagation(); // empêche de remonter au parent
console.log('Clic enfant seulement');
});
9) Bonnes pratiques (pro)
- Privilégie on() (cohérent, puissant).
- Utilise $(function(){...}) (DOM prêt).
- Stocke des sélections : const $btn = $('#btn').
- Utilise la délégation pour les éléments dynamiques.
- Sur formulaires/liens : pense preventDefault().
Exercice (progressif) – Todo list “pro” avec délégation
Objectif : reprendre l’exercice du Chapitre 5, mais en version robuste.
- Un input #task, un bouton #add, et une liste #list.
- Ajoute des items avec un bouton .del.
- Utilise la délégation pour la suppression (un seul handler).
Correction
<input id="task" />
<button id="add">Ajouter</button>
<ul id="list"></ul>
<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
<script>
$(function(){
$('#add').on('click', function(){
const task = String($('#task').val()).trim();
if(!task) return;
const html = `<li class="item">${task} <button class="del">Supprimer</button></li>`;
$('#list').append(html);
$('#task').val('');
});
// DÉLÉGATION : 1 seul handler pour tous les futurs .del
$('#list').on('click', '.del', function(){
$(this).closest('li').remove();
});
});
</script>
Résumé du chapitre
- Écouter un événement : on('click', ...)
- preventDefault() : empêcher le comportement par défaut (formulaires/liens)
- this = élément déclencheur, $(this) = version jQuery
- Délégation : $(parent).on(event, selector, handler) pour les éléments ajoutés dynamiquement
- stopPropagation() : éviter les déclenchements en cascade