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 :

Ma variable reste indéfinie


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 718
    Par défaut Ma variable reste indéfinie
    Bonjour,
    J'ai le code suivant:
    Code : 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    "use strict";
     
    const mainForm = document.querySelector('form')
    	, inputDates = mainForm.querySelectorAll("input[name*='_date']")
    	;
     
    var cal = new jsSimpleDatePickr()
    	, inputId
    	;
     
    mainForm.call_date.focus(); // Par défaut
     
    mainForm.source_date.addEventListener('focus', function(e) {
    	inputId = mainForm.source_date.id;
    }, false );
     
    mainForm.request_date.addEventListener('focus', function(e) {
    	inputId = mainForm.request_date.id;
    }, false );
     
    mainForm.offer_date.addEventListener('focus', function(e) {
    	inputId = mainForm.offer_date.id;
    	console.log('29: '+inputId);
    }, false );
     
    mainForm.call_date.addEventListener('focus', function(e) {
    	inputId = mainForm.call_date.id;
    	alert(inputId);
    }, false );
     
    console.log('31: '+inputId);
    Dans ce code et dans la mesure où ma variable est déclarée avant les écouteurs, je ne comprends pas pourquoi la ligne 31 renvoie toujours undefined malgré le focus par défaut.
    Remarques:
    Le focus par défaut ligne 11 déclenche bien l'écouteur correspondant (ligne 26) avec affichage du nom du champ
    La variable inputDates est prévue pour optimiser mon code, mais je ne vois pas comment.

  2. #2
    Expert confirmé
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 419
    Par défaut
    Les callbacks de tes écouteurs sont exécutés après la ligne 31.

    Si tu initialises ta variable inputId avec 'toto' par exemple, tu verras qu'elle vaudra 'toto' à la ligne 31.

  3. #3
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 684
    Par défaut
    Bonjour,

    peut-être un problème lié au html, à la construction du formulaire?

  4. #4
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 684
    Par défaut
    Oui, Marco46!

    Les déclarations de variables sont traitées avant que le code soit exécuté, quel que soit leur emplacement dans le code
    - https://developer.mozilla.org/fr/doc...structions/var

    C'est valable pour les déclarations avec var, en tout cas;

  5. #5
    Membre éprouvé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 718
    Par défaut
    Oui, vous m'avez appris quelque chose mais alors comment faire pour que la variable soit affectée par les écouteurs avant la suite du code et la fonction CalAdd ne doit être exécuté qu'une fois mais je dois juste mettre à jour le inputFieldId. Je vous donne le code entier:
    Code : 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    // Gestion du calendrier pour les champs dates
    // http://blog.niap3d.com/jsSimpleDatePickr
    // Nouvelle version 2.1
     
    "use strict";
     
    const mainForm = document.querySelector('form');
     
    var cal = new jsSimpleDatePickr()
    	, inputId
    	;
     
    mainForm.source_date.addEventListener('focus', function(e) {
    	inputId = mainForm.source_date.id;
    }, false );
     
    mainForm.request_date.addEventListener('focus', function(e) {
    	inputId = mainForm.request_date.id;
    }, false );
     
    mainForm.offer_date.addEventListener('focus', function(e) {
    	inputId = mainForm.offer_date.id;
    }, false );
     
    mainForm.call_date.addEventListener('focus', function(e) {
    	inputId = mainForm.call_date.id;
    }, false );
     
    //<![CDATA[
    cal.CalAdd({
    'divId': 'calendar',
    'inputFieldId': inputId,
    'dateMask': 'JJ/MM/AAAA',
    'dateCentury': 20,
    'titleMask': 'M AAAA',
    'navType': '11',
    'classTable': 'jsCalendar',
    'classDay': 'day',
    'classDaySelected': 'selectedDay',
    'monthLst': fromPHPtoJS.monthes,
    'dayLst': fromPHPtoJS.shortDays,
    'hideOnClick': false,
    'showOnLaunch': true
    });
    //]]>
    La fonction CalAdd n'est pas de moi et dans cette fonction, je ne comprends pas à quoi correspondent //<![CDATA[ et //]]>.

  6. #6
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 513
    Par défaut
    Salut,

    <![CDATA ]]> pour isoler un script du reste de la page. Les plus vieux navigateurs avaient effectivement tendance à parser les symboles < et > des codes javascript comme des balises, ce qui provoquait des erreurs et a poussé à utiliser des commentaires standards HTML <!-- --> à l'intérieur des balises <script>, et surtout pas <![CDATA ]]>.

    En revanche il faut utiliser <![CDATA ]]>dans un document XML contenant du Javascript. C'est le cas des pages XHTML servies avec un content-type application xhtml/xml (qui sont très rares car la spécification HTML5 a fait concurrence avec XHTML1.1 auprès des utilisateurs, et car les versions d'Internet Explorer disponibles à l'époque du XHTML n'étaient pas capable de parser un document HTML servi en XML).

    Concernant l'utilisation multiple de jsSimpleDatePickr, j'ai bien cherché sur google pour trouver au moins une bonne documentation, mais sans succès...

    Dans l'exemple ci-dessous, on met un seul conteneur pour plusieurs input, puis on modifie le paramètre inputFieldId de l'objet myCalendar.jsSDPObj[0] lors de focus et après on appelle la fonction CalDoFromField :
    Code html : 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    <!doctype html>
    <html lang="fr">
    <head>
    	<meta charset="utf-8" />
    	<title>Simple Date Picker</title>
    	<link href="https://blog.niap3d.com/calendrier-javascript/css/default_blue.css" rel="stylesheet"/>
    	<script type="text/javascript"  src="https://blog.niap3d.com/calendrier-javascript/js/jsSimpleDatePickr.2.11.js"!></script>
    </head>
    <body>
    	<form id="myForm">
    		<input name="source_date" id="source_date" class="date" />
    		<input name="request_date" id="request_date" class="date"  />
    		<input name="offer_date" id="offer_date" class="date" />
    		<input name="call_date" id="call_date" class="date" />
    	</form>
     
    	<div id="calendar-wrapper" class="calendarMain"></div>
     
    	<script type="text/javascript">
                    var myCalendar= new jsSimpleDatePickr()
                    ,inputId
                    ,mainForm = document.querySelector('form')
                    ,inputs=document.forms[mainForm.id].getElementsByClassName('date');
                    for(let i=0;i<inputs.length;i++){
                            inputs[i].addEventListener('focus',function(e){
                                    inputId = this.id;
                                    myCalendar.jsSDPObj[0]["inputFieldId"]=inputId;
                                    myCalendar.CalDoFromField(inputId,"toogle");//passer le inputId en paramètre + le paramètre "toogle" ==> affiche/masque le datepicker
                                    console.log('jsSDPObj :',myCalendar.jsSDPObj[0],', inputId :',inputId);
                            },false);
                    }
                    myCalendar.CalAdd({
                            'divId': "calendar-wrapper",
                            'inputFieldId':"source_date",//par défaut
                            'dateMask': 'JJ/MM/AAAA',
                            'dateCentury': 20,
                            'titleMask': 'M AAAA',
                            'navType': '01',
                            'classTable': 'jsCalendar',
                            'classDay': 'day',
                            'classDaySelected': 'selectedDay',
                            'monthLst': ['Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre'],
                            'dayLst': ['D', 'L', 'M', 'M', 'J', 'V', 'S'],
                            'hideOnClick': true,
                            'showOnLaunch': false,
                            "callBack":function(date){console.log(' (callback) date :',date);}
                    });
     
            </script>
    </body>
    </html>

    Le seul problème qui te reste, c'est de positionner le conteneur #calendar-wrapper en dessus/dessous de l'input concerné, et ça je pense que tu peux le faire avec javascript...

  7. #7
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Billets dans le blog
    125
    Par défaut
    Citation Envoyé par Toufik83 Voir le message
    [...]
    Concernant l'utilisation multiple de jsSimpleDatePickr, j'ai bien cherché sur google pour trouver au moins une bonne documentation, mais sans succès...
    [...]


    Je n'ai rien trouvé de plus récent que :

    2017 : https://blog.niap3d.com/calendrier-javascript/
    2014 : https://blog.niap3d.com/fr/4,10,news...t-gratuit.html

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  8. #8
    Membre éprouvé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 718
    Par défaut
    Il reste encore deux points à régler, mais ton code correspond à ce que j'avais imaginé mais avais été incapable de réaliser. J'étais déjà entré dans le code du datepicker sans être capable de bien l'utiliser. Donc déjà un premier grand merci. J'ai modifié quelques lignes et paramètres pour m'adapter à ma configuration et avoir un affichage permanent.
    Il reste deux défauts:
    • Lorsque je clique sur le premier champ (qu'il soit ou non le champ par défaut), le calendrier disparaît malgré le paramètre 'show' de CalDoFromField().
    • La date s'initialise toujours au 20 juin 1908. Elle devrait s'initialiser, soit à la date du jour lorsque le champ est vide, soit à la valeur du champ lorsqu'il y en une.


    Il semblerait que le problème réside entre les lignes 71, 72 et 83 et la fonction CalDateInit mais je n'arrive pas à résoudre le problème.
    Pour info, j'ai suggéré à deux reprises à l'auteur d'établir une documentation ( voir son blog )
    Dans des configurations plus classiques, j'utilise régulièrement sans difficultés ce datepicker depuis 2017.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Variable POST indéfinie
    Par Mickael2604 dans le forum Langage
    Réponses: 6
    Dernier message: 02/03/2010, 07h11
  2. Valeur variable reste inchangée
    Par gator dans le forum Langage
    Réponses: 4
    Dernier message: 18/11/2009, 19h05
  3. [HTML] Variable ${theme_images} indéfinie
    Par kahya dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 20/05/2008, 10h30
  4. Réponses: 3
    Dernier message: 25/10/2007, 10h25
  5. [4D 2004.5/MacOSX.4] Variable système indéfinie ?
    Par Jean-Marc JULES dans le forum 4D
    Réponses: 8
    Dernier message: 26/02/2007, 08h39

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