ITSkillsCenter
Développement Web

Tutoriel : Valider un formulaire avec JavaScript

4 min de lecture

Pourquoi valider côté client ?

La validation JavaScript améliore l’expérience utilisateur en signalant les erreurs instantanément, avant l’envoi au serveur. Attention : la validation côté serveur reste obligatoire pour la sécurité.

Validation HTML5 native (le minimum)

<form id="inscription">
    <input type="text" name="nom" required minlength="2" maxlength="50"
           placeholder="Votre nom">
    
    <input type="email" name="email" required
           placeholder="votre@email.com">
    
    <input type="tel" name="telephone" 
           pattern="[0-9]{9,12}" placeholder="771234567">
    
    <input type="password" name="motdepasse" required minlength="8"
           placeholder="Mot de passe (8 caractères min)">
    
    <button type="submit">S'inscrire</button>
</form>

Les attributs required, minlength, pattern et type="email" font déjà beaucoup de travail sans JavaScript !

Validation JavaScript personnalisée

const form = document.getElementById('inscription');

form.addEventListener('submit', function(e) {
    // Empêcher l'envoi si invalide
    e.preventDefault();
    
    // Récupérer les valeurs
    const nom = form.nom.value.trim();
    const email = form.email.value.trim();
    const tel = form.telephone.value.trim();
    const mdp = form.motdepasse.value;
    
    // Tableau d'erreurs
    const erreurs = [];
    
    // Validation du nom
    if (nom.length < 2) {
        erreurs.push('Le nom doit contenir au moins 2 caractères');
    }
    
    // Validation email avec regex
    const regexEmail = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
    if (!regexEmail.test(email)) {
        erreurs.push('Adresse email invalide');
    }
    
    // Validation téléphone sénégalais
    const regexTel = /^(70|75|76|77|78)[0-9]{7}$/;
    if (tel && !regexTel.test(tel)) {
        erreurs.push('Numéro de téléphone invalide (format : 77XXXXXXX)');
    }
    
    // Validation mot de passe robuste
    if (mdp.length < 8) {
        erreurs.push('Le mot de passe doit contenir au moins 8 caractères');
    }
    if (!/[A-Z]/.test(mdp)) {
        erreurs.push('Le mot de passe doit contenir une majuscule');
    }
    if (!/[0-9]/.test(mdp)) {
        erreurs.push('Le mot de passe doit contenir un chiffre');
    }
    
    // Afficher les erreurs ou soumettre
    if (erreurs.length > 0) {
        afficherErreurs(erreurs);
    } else {
        form.submit(); // Tout est OK, on envoie
    }
});

Afficher les erreurs de manière visuelle

function afficherErreurs(erreurs) {
    // Supprimer les anciens messages
    document.querySelectorAll('.erreur').forEach(el => el.remove());
    document.querySelectorAll('.champ-erreur').forEach(el => {
        el.classList.remove('champ-erreur');
    });
    
    erreurs.forEach(erreur => {
        const div = document.createElement('div');
        div.className = 'erreur';
        div.textContent = '⚠️ ' + erreur;
        form.insertBefore(div, form.querySelector('button'));
    });
}

// CSS pour les erreurs
const style = document.createElement('style');
style.textContent = `
    .erreur {
        background: #ffebee;
        color: #c62828;
        padding: 10px 15px;
        border-radius: 5px;
        margin: 5px 0;
        border-left: 4px solid #c62828;
        font-size: 14px;
    }
    .champ-erreur {
        border: 2px solid #c62828 !important;
        background: #fff5f5;
    }
    input:valid { border: 2px solid #4caf50; }
    input:focus:invalid { border: 2px solid #ff9800; }
`;
document.head.appendChild(style);

Validation en temps réel (pendant la saisie)

// Valider chaque champ pendant la saisie
form.email.addEventListener('input', function() {
    const regexEmail = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
    
    if (this.value === '') {
        this.style.borderColor = '#ddd';
    } else if (regexEmail.test(this.value)) {
        this.style.borderColor = '#4caf50'; // Vert = valide
        supprimerErreur(this);
    } else {
        this.style.borderColor = '#f44336'; // Rouge = invalide
    }
});

// Indicateur de force du mot de passe
form.motdepasse.addEventListener('input', function() {
    const mdp = this.value;
    let force = 0;
    
    if (mdp.length >= 8) force++;
    if (mdp.length >= 12) force++;
    if (/[A-Z]/.test(mdp)) force++;
    if (/[0-9]/.test(mdp)) force++;
    if (/[^A-Za-z0-9]/.test(mdp)) force++;
    
    const barre = document.getElementById('force-mdp');
    const niveaux = ['Très faible', 'Faible', 'Moyen', 'Fort', 'Très fort'];
    const couleurs = ['#f44336', '#ff9800', '#ffeb3b', '#8bc34a', '#4caf50'];
    
    barre.style.width = (force * 20) + '%';
    barre.style.background = couleurs[force - 1] || '#eee';
    barre.textContent = niveaux[force - 1] || '';
});

⚠️ Règles de sécurité importantes

  • Ne jamais faire confiance au client : la validation JS peut être contournée (DevTools)
  • Toujours revalider côté serveur (PHP, Node.js, Python)
  • Échapper les données avant de les afficher (prévenir les attaques XSS)
  • Utiliser des requêtes préparées pour les bases de données (prévenir les injections SQL)

Regex utiles pour la validation

Type Regex Exemple valide
Email /^[\w.-]+@[\w.-]+\.\w{2,}$/ user@mail.com
Tél Sénégal /^(70|75|76|77|78)\d{7}$/ 771234567
URL /^https?:\/\/[\w.-]+/ https://site.sn
Code postal FR /^\d{5}$/ 75001

Exercice pratique

🎯 Défi : Formulaire d’inscription complet

  1. Créez un formulaire avec : nom, prénom, email, téléphone, mot de passe, confirmation mot de passe
  2. Ajoutez la validation en temps réel sur chaque champ
  3. Vérifiez que les 2 mots de passe correspondent
  4. Ajoutez un indicateur de force du mot de passe
  5. Affichez un résumé des erreurs au-dessus du bouton submit
#formulaire #javascript #validation
Besoin d'un site web ?

Confiez-nous la Création de Votre Site Web

Site vitrine, e-commerce ou application web — nous transformons votre vision en réalité digitale. Accompagnement personnalisé de A à Z.

À partir de 350.000 FCFA
Parlons de Votre Projet
Publicité

Articles Similaires