11521 sujets

JavaScript, DOM et API Web HTML5

Bonjour,
J'ai un formulaire de contact simple (cf image), et un fichier de validation js, mais seule la vérification de l'email fonctionne.
Voici le html + le js, merci beaucoup !

<div class="container">   
                    <div class="contact animated bounceInDown img-responsive">
                        <h1>Contact</h1>
                    </div>  
                    <div class="formulaire">
                        <div class="row justify-content-center">
                            <div class="col-sm-8 col-sm-push-2 col-10 col-push-1">
                                <form id="message" data-toggle="validator">
                                    <div class="row">
                                        <!-- Nom -->
                                        <div class="col-12">
                                            <input type="text" class="form-control" placeholder="Nom" aria-label="Nom" aria-describedby="basic-addon1">
                                        </div>
                                        <!-- Prénom -->
                                        <div class="col-12">
                                            <input type="text" class="form-control" placeholder="Prénom" aria-label="Prénom" aria-describedby="basic-addon2">
                                        </div>
                                        <!-- Email -->
                                        <div class="col-sm-6 col-12">
                                            <div class="input-group">
                                                <div class="input-group-prepend">
                                                    <span class="input-group-text" id="basic-addon3">@</span>
                                                </div>
                                                <input type="email" class="form-control email" placeholder="Email" aria-label="Username" aria-describedby="basic-addon3">
                                            </div>
                                        </div>
                                         <!-- Téléphone -->
                                        <div class="col-sm-6 col-12">
                                            <input type="tel" class="form-control tel" placeholder="Tel." aria-label="Telephone" aria-describedby="basic-addon4">
                                        </div>
                                        <!-- Sujet -->
                                        <div class="col-12">
                                            <input type="text" class="form-control" placeholder="Sujet" aria-label="Sujet" aria-describedby="basic-addon5">
                                        </div>
                                        <!-- Message -->
                                        <div class="col-12">
                                            <textarea id="message" class="form-control" name="message" rows="5" placeholder="Message"></textarea>           
                                        </div>
                                        <!-- Bouton d'Envoi -->
                                        <div class="col-12">
                                            <button type="submit" class="btn btn-primary envoyer">Envoyer</button>
                                        </div>
                                    </div>                                  
                                </form>
                            </div>
                        </div>
                    </div>                             
                </div>



// Valider email cf. paulunde
let validateEmail = function(email) {
    // var validateEmail = function(email) {
    let emailReg = new RegExp(/^(("[\w-\s]+")|([\w-]+(?:\.[\w-]+)*)|("[\w-\s]+")([\w-]+(?:\.[\w-]+)*))(@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$)|(@\[?((25[0-5]\.|2[0-4][0-9]\.|1[0-9]{2}\.|[0-9]{1,2}\.))((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){2}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\]?$)/i);
    let valid = emailReg.test(email);

    if(!valid) {
        return false;
    } else {
        return true;
    }
}
// Valider tel avec les expressions régulières
let validateTel = function(tel) {
    let telReg = new RegExp("(0|\\+33|0033)[1-9][0-9]{8}");
    let valid = telReg.test(tel);

    if(!valid) {
        return false;
    } else {
        return true;
    }
}

// Initialiser jQuery
$(function() {

// Ecouter formulaire envoyé 
    $('#message').on('submit', function(e) {

        // Empêcher redirection HTML5 
        e.preventDefault();

        // Alertes erreurs 
        $('#message .has-error').removeClass('has-error');
        $('#message .text-danger').remove();

        // Déclarer les variables à vérif 
        let nom     = $('#nom');
        let prenom  = $('#prenom');
        let email   = $('#email');
        let tel     = $('#tel');
        let sujet   = $('#sujet');
        let message = $('#message');

        // Vérifier chaque champ

            // 1. Vérifier Nom 
            if(nom.val().length === 0) {
                nom.parent().addClass('has-error');
                $('<p class="text-danger">Veuillez saisir votre nom</p>').appendTo(nom.parent());
            } else {
                nom.parent().addClass('has-success');
            }

            // 2. Vérifier Prénom
            if(prenom.val().length === 0) {
                prenom.parent().addClass('has-error');
                $('<p class="text-danger">Veuillez saisir votre prénom</p>').appendTo(prenom.parent());
            } else {
                prenom.parent().addClass('has-success');
            }

            // 3. Vérifier Mail
            if(!validateEmail(email.val())) {
                email.parent().addClass('has-error');
                $('<p class="text-danger">Vérifiez votre adresse email</p>').appendTo(email.parent());
            } else {
                email.parent().addClass('has-success');
            }

            // 4. Vérifier Téléphone
            if(!validateTel(tel.val())) {
                tel.parent().addClass('has-error');
                $('<p class="text-danger">Vérifiez votre numéro de téléphone</p>')
                    .appendTo(tel.parent());
            } else {
                tel.parent().addClass('has-success');
            }
            
            // 4. Vérifier Sujet
            if(sujet.val().length === 0) {
                sujet.parent().addClass('has-error');
                $('<p class="text-danger">Veuillez saisir un sujet</p>').appendTo(sujet.parent());
            } else {
                sujet.parent().addClass('has-success');
            }
            // 4. Vérifier Message
            if(message.val().length === 0) {
                message.parent().addClass('has-error');
                $('<p class="text-danger">Veuillez saisir votre message</p>').appendTo(message.parent());
            } else {
                message.parent().addClass('has-success');
            }


        // Vérifier si erreurs dans le formulaire
        if($('#message').find('.has-error').length === 0) {

            $('#message').replaceWith(`
                <div class="alert alert-success">
                    Votre message a bien été envoyé !
                </div>
            `);
        } else {

            $('#message').prepend(`
                <div class="alert alert-danger">
                    Nous n'avons pas été en mesure d'envoyer votre message. Vérifiez vos informations.
                </div>
            `);
        }
    });
});
upload/1530805187-69183-form.png
Tu peux commencer déjà par utiliser l'attribut required pour les <input> avec une réponse obligatoire ( Nom, ...)
Pour les courriels tu as des <input type="email" .../> pour éviter de réinventer la roue avec les expressions régulières
Lire le manuel :
https://developer.mozilla.org/fr/docs/Web/HTML/Element/Input
Pour le téléphone, il y a bien un <input type="tel .. />. Le problème est que le format de numéro téléphonique varie d'un pays à l'autre.
On peut utiliser cette expression régulière :
(?:\+33\s+)?(?:\d{2}(? [decu]?:\.| )\d{2}){5}|\d{3}(? [decu]?:\.| )\d{3}){2})

Prendre l'expression régulière sur codepen. Le forum me joue des tours de coquin.
https://codepen.io/bazooka07/pen/VdJayJ
Elle matche avec les numéros suivants :
01.23.45.67.89.10
123.456.789
01 23 45 67 89 10
123 456 789
+33 123.456.789

Penser à utiliser l'attribut pattern plutôt que du Javascript.
Ceux qui ont un smartphone apprécieront l'attribut inputmode pour afficher le bon clavier virtuel.
C'est dans le manuel ci-dessus

Pour tester les expressions régulières, aller sur le site https://regex101.com.
On peut trouver une version plus ancienne sur Github
Modifié par bazooka07 (06 Jul 2018 - 00:18)
Modérateur
C'est moi ou tu cibles avec des #ID dans ton JS mais les #ID ne sont pas dans ton HTML ? Smiley smile
Souvent, on ne voit pas des évidences : Smiley decu
Aucun <input> n'a d'attribut name !
Donc, lorsque on soumet le formulaire, aucune valeur ne sera renvoyée

Il n'y a aucun intérêt à mettre un "id" dans un <input> si on n'utilise pas de <label>.
On peut atteindre les <input> par exemple par :
let nom = documents.forms[0].elements.nom;

Modifié par bazooka07 (06 Jul 2018 - 10:54)
Bonjour,
Merci beaucoup, j'étudie tout cela... je suis "très très débutante" en code !
Mais je repartais d'un exemple d'exercice codé ainsi - sauf des <div class="form-group"> pour chaque div champ...
J'essaye de comprendre tout cela et reviens, j'espère, confirmer le bon résultat Smiley cligne !
Modifié par A2L (06 Jul 2018 - 12:54)
- oui j'ai bien les <input type="email" .../> et <input type="tel" .../>
Mais effectivement, j'ai remis les "name=..." dans le html !
Et appelé les variables plus avec des ID mais ainsi :
let nom = documents.forms[0].elements.nom;

- Jen'ai plus que le tel qui ne réagi à rien ! Je peux rentrer des lettres, 3 chiffres, pas le message d'erreur..!

- Cela devrait être plus simple à partir de ce que j'ai ? plutôt que de passer aux pattern, que je ne connais pas du tout, en train de voir... mais me sens pas de me lancer dans les regex, ceux que j'utilise provenait d'exercices faits et focntionnant... pas la pour le tel on dirait Smiley ohwell !
bazooka07 a écrit :
Il n'y a aucun intérêt à mettre un "id" dans un <input> si on n'utilise pas de <label>.[/code]


Niveau rapidité, y'a quand même pas mieux

$("#monID").on("click")...
J'ai que 4 input dans un formulaire, tous relié par des actions (ajax) pour les préremplir, avec mes ID çe me prend même pas un heure de tout cablé... Si j'avais du passé par l'element form ......
Modifié par JENCAL (06 Jul 2018 - 14:24)
Merci bazooka07, et puis parfait car ce ne sera que du téléphone local français ! J'essaye de réussir avec les différentes méthodes pour apprendre !
Car pas encore réussi à verif le tel avec un regex tout fait, ni une simple vérif avec .length 10 ...

Merci beaucoup tout le monde !
Modifié par A2L (06 Jul 2018 - 16:31)
Alors,
Avec pattern pour le champ Tel, tout fonctionne Smiley smile

• Mais j'aimerais bien comprendre pourquoi je n'y parviens pas avec l'input et un regex ok (repris sur un formulaire où il fonctionne !), comme pour le mail :
<div class="col-sm-6 col-12">
      <input type="tel" id="tel" class="form-control tel" name="tel" placeholder="Téléphone" aria-label="Telephone" aria-describedby="basic-addon4" required>
</div>


let validateTel = function(tel) {
    var telReg = new RegExp("(0|\\+33|0033)[1-9][0-9]{8}");
    let valid = telReg.test(tel);

    if(!valid) {
        return false;
    } else {
        return true;
    }
}

if(!validateTel(tel.val())) {
        tel.parent().addClass('has-error');
        $('<p class="text-danger">Vérifiez votre numéro de téléphone</p>')
        .appendTo(tel.parent());
         } else {
         tel.parent().addClass('has-success');
}


• Et ensuite, mes messages d'alertes ne fonctionnent pas alors que sur mon exemple de référence oui... Smiley ohwell :
$('#message .has-error').removeClass('has-error');
$('#message .text-danger').remove();

if($('#message').find('.has-error').length === 0) {

            $('#message').replaceWith(`
                <div class="alert alert-success">
                    Votre message a bien été envoyé !
                </div>
            `);
        } else {
            $('#message').prepend(`
                <div class="alert alert-danger">
                    Nous n'avons pas été en mesure d'envoyer votre message. Vérifiez vos informations.
                </div>
            `);
        }


Merci toujours...
Modifié par A2L (06 Jul 2018 - 17:29)
function validateTel (value) {
    // seulement pour la France
    return /^(?:0|\+33|0033)[1-9]\d{8}$/.test(value);
}

Quand tu tapes "\\", cela veut dire que tu cherches le caractère '/'. C'est un caractère spécial dit d'échappement employé comme ceci "\t", "\n", ... (tabulation, saut à la line, ...)
Quand tu tapes "\\+", tu recherches au minimum un caractère '\'.
"\d" remplace l'expression "[0-9]", soit uniquement des chiffres (digit en anglais)
"(?:....)" on crée un sous-motif de recherche. "?:" on ne mémorise pas ce qu'on trouve. On veut juste savoir si c'est oui ou non. On parle de parenthèses non capturantes.

Modifier l'arbre DOM est coûteux en ressources machine ( pauvre petit smartphone ).
Il vaut mieux insérer les <div class="alert..."> dans la page HTML et rajouter/retirer une class "active"
Dans le fichier CSS :
div.alert { display: none; } /* comportement par défaut */
div.alert.active { display: block; }

Modifié par bazooka07 (06 Jul 2018 - 18:05)
Bonjour,
Merci beaucoup.
J'essaye de paramétrer l'affichage de ces div dans mon fichier js alors...