11521 sujets

JavaScript, DOM et API Web HTML5

Bonjour,
alors je suis plus ou moins débutante en programmation web, et ce que je veux faire c'est vérifier la validité d'une date dans un formulaire.
j'ai vérifié tous les autres champs , il ne me reste plus que la date et je rencontre un problème que je n'arrive pas a trouver .. Smiley sweatdrop Smiley confus

Pouvez vous m'aider s'il vous plait.
c'est assez urgent Smiley ohwell




[code=html]
 <form action="" id="myForm">
      <fieldset>
        <legend><b>Informations personnelles</b></legend>

          <label class="form_col" for="nom">Nom :</label>
          <input name="nom" id="nom" type="text" />
          <span class="tooltip">Un nom ne peut pas faire moins de 2 caractères</span>
          <br/><br/>

          <label class="form_col" for="prénom">Prénom :</label>
          <input name="prénom" id="prénom" type="text" />
          <span class="tooltip">Un prénom ne peut pas faire moins de 2 caractères</span>
          <br /><br />

      

      

      <label class="form_col" for="Matricule">Matricule :</label>
      <input name="Matricule" id="Matricule" type="text" />
      <span class="tooltip">Le Matricule s'écrit sur 12 chiffres</span>
      <br /><br />

      <label class="form_col" for="birthday">Date de naissance : </label>
      <input type="text"  class="day" id="birthday" name="day" placeholder="jj/mm/yyyy" />
      <span class="tooltip">Vous devez remplir votre date de naissance </span>


      <br /><br />

      <label class="form_col" for="Adresse">Adresse :</label>
      <input name="Adresse" id="Adresse" type="text" />
      <span class="tooltip">L'Adresse ne peut pas faire moins de 4 caractères</span>
      <br /><br />
      

      <label class="form_col" for="Filière">Filière :</label>

      <select name="Filière" id="Filière">
        <option value="none">Sélectionnez votre Filière </option>
        <option value="mil">MIL</option>
        <option value="sii">SII</option>
        <option value="rsd">RSD</option>
      </select>
      <span class="tooltip">Vous devez sélectionner votre Filière </span>

      <br /><br />


       <label class="form_col" for="groupe">Groupe :</label>

      <select name="groupe" id="groupe">
        <option value="none">Sélectionnez votre Groupe</option>
        <option value="g1">Groupe1</option>
        <option value="g2">Groupe2</option>
        <option value="g3">Groupe3</option>
        <option value="g4">Groupe4</option>
      </select>
      <span class="tooltip">Vous devez sélectionner votre groupe</span>

      <br /><br />

      <label class="form_col" for="année">Année d'inscription :</label>

      <select name="année" id="année">
        <option value="none">Sélectionnez votre Année d'inscription</option>
        <option value="y1">1ère année Master</option>
        <option value="y2">2ème année Master</option>
      </select>
      <span class="tooltip">Vous devez sélectionner votre année d'inscription</span>

      <br /><br />

      
      <span class="form_col"></span>
      <input type="submit" value="Ajouter" /> 
      
    </fieldset>


[/code]


mon fichier js:


[code=javascript]



    (function() { 
    
    // Fonction de désactivation de l'affichMatricule des « tooltips »
    
    function deactivateTooltips() {
    
        var spans = document.getElementsByTagName('span'),
        spansLength = spans.length;
        
        for (var i = 0 ; i < spansLength ; i++) { //Parcourir les balises span avec une classe tooltip.
            if (spans[i].className == 'tooltip') { 
                spans[i].style.display = 'none';
            }
        }
    
    }
    
    
    // La fonction ci-dessous permet de récupérer la tooltip qui correspond à notre input
    
    function getTooltip(element) {
    
        while (element = element.nextSibling) { //Toutes les balises spans sont apres les balises input, donc on recherche la balise input, et on recherche le plus proche element
                                                //d'où l'utilisation de nextSibling.
            if (element.className === 'tooltip') {
                return element;
            }
        }
        
        return false;
    
    }
    
    
    // Fonctions de vérification du formulaire, elles renvoient true si tout est OK
    
    var check = {}; // On met toutes nos fonctions dans un objet littéral
    
    
    check['prénom'] = function(id) { // Cette fonction est la même pour Nom et Prénom, donc on fait rentrer un id en prametre ce qui nous permettera de ne pas réécrire la fct une 2ème fois.
    
        var name = document.getElementById(id),
            tooltipStyle = getTooltip(name).style;
    
        if (name.value.length >= 2) { //Si le contenu remplit bien la condition, alors on attribue à notre <input> la classe .correct, on désactive l'affichage de la bulle d'aide et on retourne true.
            name.className = 'correct';
            tooltipStyle.display = 'none';
            return true;
        } else {
            name.className = 'incorrect';
            tooltipStyle.display = 'inline-block';
            return false;
        }
    
    };
    
    check['nom'] = check['prénom']; // lorsque nous appellerons la fonction check['nom'](), implicitement ce sera la fonction check['prénom']() qui sera appelée.
    
  

    check['birthday']=function verif(){
    var date_pas_sure = document.getElementById('birthday').value;
    var format = /^(\d{1,2}\/){2}\d{4}$/;
    if(!format.test(date_pas_sure)){
        birthday.className = 'incorrect';
        alert('Date non valable !')
        return false;
    }
    else{
        var date_temp = date_pas_sure.split('/');
        date_temp[1] -=1;        // On rectifie le mois !!!
        var ma_date = new Date();
        ma_date.setFullYear(date_temp[2]);
        ma_date.setMonth(date_temp[1]);
        ma_date.setDate(date_temp[0]);
        if(ma_date.getFullYear()==date_temp[2] && ma_date.getMonth()==date_temp[1] && ma_date.getDate()==date_temp[0]){
            birthday.className = 'correct';
            alert('Date valable !');
            return true;
        }
        else{
            alert('Date non valable !');
        }
    }
}

    check['Matricule'] = function() {
    
        var Matricule = document.getElementById('Matricule'),
            tooltipStyle = getTooltip(Matricule).style,
            MatriculeValue = parseInt(Matricule.value);
        
        if (!isNaN(MatriculeValue) && (Matricule.value.length == 12) ) { // isNan: Retourne true si chaine n'est pas un nombre, sinon retourne false
            Matricule.className = 'correct';
            tooltipStyle.display = 'none';
            return true;
        } else {
            Matricule.className = 'incorrect';
            tooltipStyle.display = 'inline-block';
            return false;
        }
    
    };


    
    
    
    check['Adresse'] = function() {
    
        var Adresse = document.getElementById('Adresse'),
            tooltipStyle = getTooltip(Adresse).style;
        
        if (Adresse.value.length >= 4) {
            Adresse.className = 'correct';
            tooltipStyle.display = 'none';
            return true;
        } else {
            Adresse.className = 'incorrect';
            tooltipStyle.display = 'inline-block';
            return false;
        }
    
    };
    
  
    
   
    check['Filière'] = function() {
    
        var Filière = document.getElementById('Filière'),
            tooltipStyle = getTooltip(Filière).style;
        
        if (Filière.options[Filière.selectedIndex].value != 'none') {
            tooltipStyle.display = 'none';
            return true;
        } else {
            tooltipStyle.display = 'inline-block';
            return false;
        }
    
    };



    check['groupe'] = function() {
    
        var groupe = document.getElementById('groupe'),
            tooltipStyle = getTooltip(groupe).style;
        
        if (groupe.options[groupe.selectedIndex].value != 'none') {
            tooltipStyle.display = 'none';
            return true;
        } else {
            tooltipStyle.display = 'inline-block';
            return false;
        }
    
    };


    check['année'] = function() {
    
        var année = document.getElementById('année'),
            tooltipStyle = getTooltip(année).style;
        
        if (année.options[année.selectedIndex].value != 'none') {
            tooltipStyle.display = 'none';
            return true;
        } else {
            tooltipStyle.display = 'inline-block';
            return false;
        }
    
    };


    
    
    // Mise en place des événements
    
    (function() { // Utilisation d'une fonction anonyme pour éviter les variables globales.
    
        var myForm = document.getElementById('myForm'),
            inputs = document.getElementsByTagName('input'),
            inputsLength = inputs.length;
    
        for (var i = 0 ; i < inputsLength ; i++) { //il s'agit de parcourir les inputs et d'agir seulement sur ceux qui sont de type text. 
            if (inputs[i].type == 'text') {
    
                inputs[i].onkeyup = function() { //permet d'assigner une fonction anonyme à l'événement keyup de l'<input> actuellement traité.
                    check[this.id](this.id); // « this » représente l'input actuellement modifié.
                };
    
            }
        }
    
        myForm.onsubmit = function() { //parcourir notre tableau check et exécuter toutes les fonctions qu'il contient avec la valeur retournée dans result.
    
            var result = true;
    
            for (var i in check) {
                result = check[i](i) && result;
            }
    
            if (result) { // Si le resultat est false, l'alert ne s'executera pas.
                alert('Le formulaire est bien rempli.');
            }
    
            return false;
    
        };
    
    })();
    
    
    // Maintenant que tout est initialisé, on peut désactiver les tooltips
    
    deactivateTooltips();

})();





[/code][/i][/i][/i][/i][/i]
Modifié par Ka_Ben (06 Dec 2014 - 15:14)
Est-ce que tu pourrais préciser un peu plus la localisation de ton problème ? Ce n'est pas forcément nécessaire de mettre tout ton source dans le message alors que tu sais que c'est au niveau de la date que ça ne va pas. Mais le plus simple pour trouver d'ou vient un problème est de débugger via les outils développeurs Chrome ou Firefox, ou si tu n'est pas vraiment à l'aise avec ça tu peux toujours executer des bouts de code dans ta console JS, ou faire des alert() pour vérifier que les comportements sont bien comme attendus.

Ici déjà pour le contrôle de la saisie de date, tu déclenche la vérification au onkeyup sur ton champs, ce n'est pas nécessaire car la date ne doit être vérifiée qu'une fois qu'elle est entièrement saisie. Il faut donc mettre l'action de vérification sur le onchange.

Sinon la fonction a l'air de faire son travail.
Hmm!
Quel problème rencontrez vous s'il vous plait?
Votre code semble relativement complexe et inclus dans un environnement. On ne peut pas simplement le copier/coller dans une page HTML et regarder ce que ça fait.

Edit: en fait, je fais la même remarque que Freez, au même moment, mais il tape plus vite, sinon moins fort! Smiley cligne
Modifié par PapyJP (06 Dec 2014 - 16:27)
salut,
si tu t'attends à recevoir une date, autant passer par un <input> type "date". Le format change et devient "yyyy-mm-jj".
Tu ne poses pas de question concrète et tu envoies un code assez long donc ça n'aide pas trop.
Un peu hors sujet, les vérifications JS ne doivent pas faire oublier celles en PHP.
Effectivement, mon problème était les onkeyUp!
J'ai enlevé mes alerts et j'ai remplacé par les tooltips comme j'avais fais pour les autres inputs et ça fonctionne tres bien.

Merci beaucoup pour votre aide Smiley biggrin
Zelalsan a écrit :
salut,
si tu t'attends à recevoir une date, autant passer par un <input> type "date";. Le format change et devient "yyyy-mm-jj".

Ça c'est un truc que tu ne peux pas mettre entre les mains d'un utilisateur, même américain.
Pour avoir eu a gérer des dates dans un programme destiné à un milieu international, je sais qu'il n'y a rien de plus différent de pays à pays que le format des dates.

Si le programme est réservé à des utilisateurs français, on peut supposer que jj/mm/yyyy est acceptable, quoique... il faudrait au moins accepter [j]j/[m]m/ Smiley aa aa, et plus vraisemblablement accepter n'importe quel séparateur (espace (multiples), virgules, tirets...) Mais l'ordre jour mois année est le seul acceptable par un français (normal Smiley cligne ).

Pour un américain c'est MM/DD/YYYY (qui défie toute logique humainement compréhensible), mais les américains pensent que la logique est un concept antiaméricain.
YYYY-MM-DD est le format des informaticiens, qui a au moins une logique compréhensible mais qu'un utilisateur lambda ne tolérera pas.
Modifié par PapyJP (08 Dec 2014 - 15:13)
@PapyJP
Ce n'est pas un concours, je n'ai pas voulu vous prendre de vitesse mais c'est vrai que nous avons eu une réaction assez semblable à ce sujet Smiley cligne

Sinon la tendance voudrait que l'on soit moins strict au niveau des contrôles sur le format de la date, une application "user-friendly" va accepter que l'utilisateur saisisse la date de différente manière (jour et mois avec/sans le zéro devant, slash ou tiret...), et l'harmonisation se fera de manière transparente (côté client ou serveur).
C'est quand même plus sympa quand l'appli est intelligente et comprend ce que l'utilisateur veut dire Smiley smile
Freez a écrit :


Sinon la tendance voudrait que l'on soit moins strict au niveau des contrôles sur le format de la date, une application &quot;user-friendly&quot; va accepter que l'utilisateur saisisse la date de différente manière (jour et mois avec/sans le zéro devant, slash ou tiret...), et l'harmonisation se fera de manière transparente (côté client ou serveur).
C'est quand même plus sympa quand l'appli est intelligente et comprend ce que l'utilisateur veut dire Smiley smile
cha ché chur!
Mais même Excel ne sait pas si 11/09/2001 est le 11 septembre ou le 9 novembre! J'ai encore eu un problème avec ce genre de date en important un relevé bancaire! Et pourtant le même savait bien ce que 13/09 voulait dire.
Héhé, pas de 13 ème mois de l'année ça rend le parsing plus facile.
Aux Etats-Unis le format MM/JJ/AAAA existe, c'est là qu'es l'aberration Smiley biggol , car encore le AAAA/MM/JJ peut s'avérer utile pour le tri automatique par exemple.
Freez a écrit :
Héhé, pas de 13 ème mois de l'année ça rend le parsing plus facile.
Aux Etats-Unis le format MM/JJ/AAAA existe, c'est là qu'es l'aberration Smiley biggol , car encore le AAAA/MM/JJ peut s'avérer utile pour le tri automatique par exemple.

Normal: aux US si tu parles de 13eme mois c'est que tu es un dangereux socialiste Smiley biggrin
Plus sérieusement, il est préférable de mettre une petite boîte graphique pour désigner une date. On en trouve des tas en JavaScript sur le web. C'est une solution agréable si la date est n'est pas très éloignée de la date courante, par exemple pour réserver une place de train ou d'avion, on sqir que c'est dans le future, et à moins d'un an.
Pour une date qui peut être très éloignée, par exemple un date de naissance, mettre 3 champs déroulants (jour/mois/année) est également un bon moyen de traiter le problème.
Modifié par PapyJP (08 Dec 2014 - 15:16)