Code JavaScript sur fond sombre avec une case à cocher illustrant la détection d'état d'une checkbox

Comment vérifier si une checkbox est cochée ?

Publié le

Une checkbox, en apparence, c'est simple : cochée ou pas cochée. Mais dès qu'on veut réagir à son état en JavaScript, désactiver un bouton, déclencher une action, valider un formulaire, les questions arrivent vite. Comment lire son état ? Quand écouter le changement ? Comment s'assurer que la case est bien cochée au moment du submit ? Voici tout ce qu'il faut savoir, du cas le plus basique jusqu'à la récupération des données avec FormData.

Le HTML de base : checkbox et label, toujours ensemble

Avant de toucher au JavaScript, un point sur la structure HTML. Une checkbox seule n'est presque jamais la bonne option. Elle doit toujours être accompagnée d'un <label>. C'est à la fois une question d'accessibilité, les lecteurs d'écran ont besoin du label pour annoncer l'élément, et une question d'ergonomie : sans label associé, l'utilisateur doit cliquer précisément sur la petite case, ce qui peut devenir pénible sur mobile.

Il existe deux façons d'associer un label à une checkbox.

La première, avec for et id correspondants :

<input type="checkbox" id="cgv" name="cgv" >
<label for="cgv">J'accepte les conditions générales de vente</label>

La seconde, en enveloppant la checkbox dans le label (le for/id devient facultatif) :

<label>
  <input type="checkbox" name="cgv" >
  J'accepte les conditions générales de vente
</label>

Les deux approches sont valides. La première est légèrement plus explicite et plus facile à cibler en CSS ou JavaScript grâce à l'id. Dans tous les exemples qui suivent, on utilisera la première forme.

✓ Bonne pratique. Donnez toujours un attribut name à votre checkbox si elle est dans un formulaire. C'est cet attribut qui servira de clé dans les données envoyées au serveur, ou récupérées avec FormData.

Lire l'état d'une checkbox avec JavaScript

En JavaScript, l'état d'une checkbox est accessible via la propriété checked de l'élément. Cette propriété retourne un booléen : true si la case est cochée, false sinon.

const checkbox = document.getElementById('cgv');

// Lire l'état au moment où on exécute cette ligne
console.log(checkbox.checked); // true ou false

C'est tout. Pas de méthode particulière à appeler, pas de valeur à parser. La propriété checked reflète toujours l'état actuel de la case, en temps réel.

Attention à l'attribut HTML checked

Il ne faut pas confondre la propriété checked (JavaScript) avec l'attribut checked (HTML). L'attribut HTML définit l'état initial de la checkbox au chargement de la page. La propriété JavaScript reflète son état courant, qui peut avoir changé depuis.

// En HTML : cochée par défaut au chargement
<input type="checkbox" id="newsletter" name="newsletter" checked>

// Si l'utilisateur a décoché la case, checked sera false
// même si l'attribut HTML "checked" est présent
console.log(document.getElementById('newsletter').checked); // false

Détecter le changement avec l'événement change

Lire checked ponctuellement c'est utile, mais dans la plupart des cas on veut réagir au moment où l'utilisateur coche ou décoche. On utilise pour ça l'événement change.

const checkbox = document.getElementById('cgv');

checkbox.addEventListener('change', function() {
  if (checkbox.checked) {
    console.log('La case est cochée');
  } else {
    console.log('La case est décochée');
  }
});

L'événement change se déclenche à chaque fois que l'état de la checkbox bascule. À l'intérieur du callback, on lit checkbox.checked pour savoir dans quel état elle se trouve maintenant.

change vs click. On voit parfois du code qui écoute l'événement click sur une checkbox. Ça fonctionne, mais c'est moins précis : click se déclenche aussi si l'utilisateur navigue au clavier et active la case avec Espace, sans que click ne soit déclenché de manière cohérente selon les navigateurs. change est l'événement sémantiquement correct pour les éléments de formulaire.

Cas pratique : activer un bouton quand la checkbox est cochée

L'exemple le plus courant : un bouton de validation qui reste désactivé tant que l'utilisateur n'a pas coché la case d'acceptation des CGV. Voici comment le mettre en place.

Le HTML

<form id="formulaire">
  <input type="checkbox" id="cgv" name="cgv" >
  <label for="cgv">J'accepte les conditions générales de vente</label>

  <button type="submit" id="bouton-valider" disabled>Valider la commande</button>
</form>

Le bouton démarre avec l'attribut disabled. C'est la bonne approche : on part d'un état verrouillé, et on déverrouille quand la condition est remplie.

Le JavaScript

const checkbox = document.getElementById('cgv');
const bouton = document.getElementById('bouton-valider');

checkbox.addEventListener('change', function() {
  bouton.disabled = !checkbox.checked;
});

La logique tient en une ligne : bouton.disabled vaut true quand la checkbox n'est pas cochée, et false quand elle l'est. !checkbox.checked fait exactement cette inversion.

✓ Ne comptez pas uniquement sur le JavaScript. Si votre bouton de validation est dans un formulaire, ajoutez aussi une validation côté serveur. Un utilisateur peut manipuler le DOM et retirer l'attribut disabled depuis les outils de développement. Le JavaScript améliore l'expérience, il ne remplace pas la validation serveur.

Vérifier l'état au moment du submit

Dans certains cas, on ne veut pas réagir à chaque changement, mais simplement vérifier l'état de la checkbox au moment où l'utilisateur soumet le formulaire, pour afficher un message d'erreur si elle n'est pas cochée, par exemple.

const formulaire = document.getElementById('formulaire');

formulaire.addEventListener('submit', function(event) {
  const checkbox = document.getElementById('cgv');

  if (!checkbox.checked) {
    event.preventDefault(); // On bloque l'envoi
    alert('Vous devez accepter les CGV pour continuer.');
  }
});

L'appel à event.preventDefault() empêche l'envoi du formulaire si la case n'est pas cochée. C'est le point d'entrée classique pour toute validation côté client.

Récupérer la valeur d'une checkbox avec FormData

Quand un formulaire est soumis, FormData permet de récupérer l'ensemble des données du formulaire de manière propre, sans cibler chaque champ manuellement.

Le comportement d'une checkbox dans FormData est spécifique : si la case est cochée, la clé correspondant à son attribut name est présente dans les données. Si elle est décochée, cette clé est absente. Il n'y a pas de valeur false : la clé disparaît simplement.

formulaire.addEventListener('submit', function(event) {
  event.preventDefault();

  const donnees = new FormData(formulaire);

  // Vérifier si la checkbox "cgv" est cochée
  const cgvAcceptees = donnees.has('cgv');
  console.log(cgvAcceptees); // true si cochée, false si décochée

  // Récupérer la valeur (par défaut : "on" si cochée)
  const valeur = donnees.get('cgv');
  console.log(valeur); // "on" si cochée, null si décochée
});

La méthode .has() est donc la façon la plus lisible de tester si une checkbox est cochée via FormData. Elle retourne true si la clé existe, false sinon.

Personnaliser la valeur envoyée

Par défaut, si vous ne spécifiez pas d'attribut value sur la checkbox, la valeur envoyée est la chaîne "on". Vous pouvez définir votre propre valeur :

<input type="checkbox" id="cgv" name="cgv" value="accepte">

// Avec FormData :
donnees.get('cgv'); // → "accepte" si cochée

C'est utile quand vous envoyez les données en JSON à une API et que vous voulez une valeur explicite plutôt que "on".

Synthèse : quelle approche selon votre cas ?

Situation Ce qu'on utilise
Lire l'état à un instant précis element.checked
Réagir à chaque coche / décoche Événement change
Activer / désactiver un bouton selon l'état change + bouton.disabled = !checkbox.checked
Valider la checkbox au submit du formulaire Événement submit + element.checked
Récupérer toutes les données du formulaire d'un coup new FormData(form) + .has() ou .get()

Pour un cas simple comme l'activation d'un bouton, lire checkbox.checked dans un listener change est largement suffisant. Pour un formulaire plus complet avec plusieurs champs, FormData devient vite plus pratique que de cibler chaque élément individuellement.

Vous travaillez sur un formulaire et vous voulez aller plus loin ?

Validation côté client, accessibilité, envoi des données à une API : si vous avez un formulaire en cours de développement et des questions sur la meilleure approche, on peut en parler.

Poser une question
Cadenas ouvert devant un écran de code, symbolisant une faille de sécurité L'erreur de sécurité Supabase que je vois partout en ce moment

En auditant un site généré avec Lovable, j'avais récupéré la clé API Supabase en quelques minutes. Une configuration par défaut jamais revue. Voici comment corriger ça.

Écran d'ordinateur affichant du code HTML et JavaScript Comment faire un quiz en HTML et JavaScript ?

Apprenez à créer un quiz interactif en HTML, CSS et JavaScript. Structure HTML, style CSS et logique JavaScript expliqués étape par étape.

Développeur devant son ordinateur Comment filtrer et supprimer des éléments d'un tableau en JavaScript ?

Découvrez les différentes méthodes pour supprimer des éléments d'un tableau en JavaScript : filter(), splice() et l'utilisation d'une liste d'exclusions.