IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Script date valide


Sujet :

JavaScript

  1. #1
    Invité
    Invité(e)
    Par défaut Script date valide
    Bonjour,

    J'essaie de créer une fonction qui permette de vérifier la date entrée par l'utilisateur dans un formulaire et de l'établir comme valide ou invalide.

    J'ai décidé d'éviter de m'en remettre au datepicker pour devenir un peu plus autonome quand je code en js...

    Je sais que plusieurs topics ont été créés à ce sujet mais j'aurais besoin que des personnes averties puissent me dire si je suis sur la bonne piste et/ou si j'oublie des choses...

    Je débute, donc pardonnez par avance les éventuelles erreurs de raisonnement et de formulation...

    J'ai pensé dans un premier temps créer une expression régulière et j'avais construit ma fonction comme suit :

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    date_utilisateur = document.getElementById('date').value;
    	jour_date_utilisateur = parseInt(date_utilisateur.substr(0,2));
    	mois_date_utilisateur = parseInt(date_utilisateur.substr(3,2));
    	annee_date_utilisateur = parseInt(date_utilisateur.substr(6,4));
     
    	jour_date_utilisateur = document.getElementById('date').value;
    	var regJour = new RegExp ("^([0-2]{1}[0-9]{1}|[3]{1}[0-1]{1})$");
    	regJour.test(jour_date_utilisateur);
     
    	mois_date_utilisateur = document.getElementById('date').value;
    	var regMois = new RegExp ("^(0[1-9]{1}|1[0-2]{1})$");
    	regMois.test(mois_date_utilisateur);
     
    	annee_date_utilisateur = document.getElementById('date').value;
    	var regAnnee = new RegExp ("^(20[1-9]{1}[0-9]{1})$");
    	regAnnee.test(annee_date_utilisateur);

    La première chose, c'est que j'ai un souci avec les RegExp dans la mesure où je ne comprends pas où renseigner que si le ou les test(s) est/sont false si c'est le cas...

    Puis ça ne me convient pas, parce que d'une part l'utilisateur a toujours la possibilité d'inscrire des aberrations comme 00/00/2099, mais en plus, je ne sais pas non plus vérifier qu'il ne va pas saisir une date erronée comme 30/02/2013.

    Alors j'envisage maintenant de jouer sur des correspondances mois/jour :

    j'ai juste un problème parce que je manque de théorie pour savoir comment mettre en rapport les valeurs d'un tableau que j'intitulerais correspJourMois = ("",31,28,31,30,31,30,31,31,30,31,30,31) avec la date que renvoie la variable "mois_date_utilisateur".
    => Je voudrais que si mon utilisateur a opté pour une date comme xx/03/xxxx cela aille repêcher dans mon tableau que le nombre max que peut saisir l'utilisateur à ce niveau xx/03/xxxx (jour_date_utilisateur) est 31.

    j'ai dans l'idée que ça doit ressembler à un truc genre :
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    var correspJourMois = ["",31,28,31,30,31,30,31,31,30,31,30,31];
    if (mois_date_utilisateur > correspJourMois[mois_date_utilisateur]) {
    alert("Votre date est invalide !"); 
    return false; }
    else { return true; }

    Est-ce que ça vous semble juste?? Mon script ne fonctionne pas...
    je n'ai même pas une alerte en mettant une date de type 32/03/2013

    (Je pensais continuer le script avec l'idée qui figure là bas pour le contrôle des années bissextiles : http://www.developpez.net/forums/d13...e-champs-date/ )

    Est-ce que d'après vous, j'oublie quelque chose pour que mon script soit parfaitement fonctionnel?

    Merci pour votre aide !
    Dernière modification par Invité ; 17/06/2013 à 19h42.

  2. #2
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    Bonjour,

    Ca me parait bien compliqué pour pas grand chose tout ça. A ta place, j'irais chercher une reg exp toute fait sur le net et je testerais le champ avec l'attribut pattern:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <input pattern="^(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\d\d$" class="date">
    Si tu as besoin d'étendre ton support navigateur pour les vieux IE ne supportant pas l'attribut pattern, on peut tester cette même expression régulière avec regex.test(value) comme tu l'as fait. La méthode test te renvoie un booléen, true si ça passe, false si ça passe pas.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Ok, merci pour l'explication liée au regex.test, je ne savais pas que ça renvoyait un booléen.

    Par contre, je maintiens que l'expression régulière présentée ici permet toujours de saisir un 00/00 pour le jour et le mois, ça me semble permissif...

    Tant que je suis débutante, je préfère multiplier les lignes pour plus de clarté à chaque étape même si je sais qu'un bon programme est un programme qui fait ce qu'on veut de lui en un nombre de lignes réduit.

    Si on baque l'idée des RegExp, peut-on me dire si mon idée de tableau de correspondance jour-mois est valide...?
    Mon script ne fait pas ce que j'attends de lui, c'est la raison pour laquelle je m'en remets à vous...

    Encore merci.
    Dernière modification par vermine ; 18/06/2013 à 07h40. Motif: Il n'est pas nécessaire de citer le dernier message entièrement

  4. #4
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    Citation Envoyé par -Reka- Voir le message
    Par contre, je maintiens que l'expression régulière présentée ici permet toujours de saisir un 00/00 pour le jour et le mois, ça me semble permissif...
    C'est faux, 00 n'est pas accepté

    0[1-9]|[12][0-9]|3[01]) --> prend les valeurs de "01" à "31"

    Il faudrait te renseigner un minimum avant de rejeter ce qu'on te donne pour t'aider. Tu es débutante, pas moi

    Tant que je suis débutante, je préfère multiplier les lignes pour plus de clarté à chaque étape même si je sais qu'un bon programme est un programme qui fait ce qu'on veut de lui en un nombre de lignes réduit.
    Multiplier les lignes ne va pas aider à clarifier ton code, au contraire. Je te propose une solution sans Javascript, c'est de loin la plus claire et la plus simple.

  5. #5
    Expert éminent sénior

    Avatar de vermine
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    6 582
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 6 582
    Points : 79 912
    Points
    79 912
    Par défaut
    Salut,

    A vrai dire, -Reka-, le pattern te permet d'écrire 00/00 mais les bords de l'input deviennent rouge lorsque la valeur ne respecte pas l'expression régulière.

    Ceci n'est vrai que sur les navigateurs récents.

  6. #6
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20

  7. #7
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    Citation Envoyé par vermine Voir le message
    Salut,

    A vrai dire, -Reka-, le pattern te permet d'écrire 00/00 mais les bords de l'input deviennent rouge lorsque la valeur ne respecte pas l'expression régulière.

    Ceci n'est vrai que sur les navigateurs récents.
    Le retour est différent selon le navigateur, par contre ce qui est commun et standardisé, c'est que le formulaire ne puisse pas être soumis tant que le champ n'a pas le format adéquat. Du reste, tout est fait pour guider l'utilisateur et respecter les normes d'accessibilité.

    Comme il faut toujours faire une validation côté serveur par sécurité, je ne me soucie généralement pas d'étendre le support de la validation côté client.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Merci pour la précision, Vermine.
    En fait, j'avais lu et interprété de travers l'expression régulière.

    Mais avec une RegExp comme celle-là, est-ce que mon 29/02 ne va pas passer chaque année? ou même le 30/02?

    Bovino, j'essaie de construire sans pomper les idées des autres...
    Tous les chemins ne mènent-ils pas à Rome même s'il en est qui nécessitent plus d'essence?

Discussions similaires

  1. Boucle de dates valides
    Par Zebulon777 dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 26/03/2007, 15h07
  2. Script pour validation formulaire
    Par gforce dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 22/02/2007, 16h17
  3. obtenir toutes les dates valides comprises entre dates
    Par captainamerica75 dans le forum VBA Access
    Réponses: 3
    Dernier message: 01/06/2006, 13h25
  4. Classe ou script de validation des formulaires.
    Par __fabrice dans le forum Langage
    Réponses: 22
    Dernier message: 30/12/2005, 10h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo