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 :

definir un compteur depuis la value d'un hidden


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 163
    Par défaut definir un compteur depuis la value d'un hidden
    salut à tous

    je suis en train de bosser sur un Js qui me permettrai de faire des insertion de champs de tout type dans un formulaire...

    mon soucis actuel porte sur la définition de mon counter suivant la valeur de hiddenCounter recuperer (cf 2premiere lign du script):
    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    /*on verifie si le champ hiddenCounter existe afin de definir counter*/
    var hiddenCounter = document.getElementById('hiddenCounter').value;
    var counter = (hiddenCounter > 0) ? hiddenCounter : 0;
     
    function moreFields()
    {
       counter++;
     
       /*on clone le noeud du passage à recréé*/
       var newFields = document.getElementById('readroot').cloneNode(true);
       /*on redefinit l'id de celui-ci*/
       var insert = 'insert_'
       newFields.id = insert + counter;
     
       /*on definit les noeuds enfant de ce dernier*/
       var newField = newFields.childNodes;
     
       for(var i=0;i<newField.length;i++)
       {
          /*on redefinit l'attibut for du noeud label à chaque label rencontrer*/
          if(newField[i].nodeName == 'LABEL')
          {
             var lastCibleLabel = newField[i].getAttribute("for");
             newCibleLabel = lastCibleLabel + counter;
             newField[i].setAttribute("for",newCibleLabel);
          }
          /*on initialise une variable tabindexMaxi pour enregistrement de la valeur maxi de tabindex pour le clone*/
          var tabindexMaxi = '';
     
          /*si on a un champs quelquonque de forulaire, on réassigne les attributs id pour concordance au label, et name pour recuperation POST*/
          if(newField[i].nodeName == 'INPUT' || newField[i].nodeName == 'SELECT' || newField[i].nodeName == 'TEXTAREA')
          {
             newField[i].setAttribute("id",newCibleLabel);
             newField[i].name = newField[i].name + counter;
             /*pour chaque champ de formulaire detecter, on ecrase la valeur de la variable tabindexMaxi afin de détecter la valeur maxi de tabindex pour réincrémenter */
             tabindexMaxi = newField[i].getAttribute("tabindex");
          }
       }
     
       /*on definit la valeur de depart du tabindex pour ce nouveau noeud cloner*/
       tabindexValue = tabindexMaxi * counter;
     
       /* on redefinit ensuite tout les tabindex du noeud cloner suivant counter et tabindexMaxi*/
       for(var i=0;i<newField.length;i++)
       {
          /*si on a des champs quelquonque de formulaire, on réassigne l'attribut tabindex*/
          if(newField[i].nodeName == 'INPUT' || newField[i].nodeName == 'SELECT' || newField[i].nodeName == 'TEXTAREA')
          {
             /*on incremente la valeur de tabulation*/
             tabindexValue++;
             /*si on est dans le cas exeptionnel des input de type="radio", c'est le même tabindex pour le paquet de radio*/
             if(newField[i].type == 'radio')
             {
                newField[i].setAttribute("tabindex",tabindexValue);
                /*on decremente tabindexValue apès redefinition*/
                tabindexValue--;
                /*on definit une variable de controle de detection de paquet de radio*/
                var detectionRadio = true;
             }
             else
             {
                /*si il y a eut precedment detection de radio, on redefinit la var de detection*/
                if(detectionRadio == true)
                {
                   detectionRadio = false;
                   /*on incremente de nouveau la valeur de tabulation*/
                   tabindexValue++;
                }
                newField[i].setAttribute("tabindex",tabindexValue);
             }
          }
       }
     
       /*on insert ce noeud clone dans le formulaire avant l'element d'id writeroot*/
       var insertBeforeThis = document.getElementById('insertBeforeThis');
       insertBeforeThis.parentNode.insertBefore(newFields,insertBeforeThis);
     
       /*on redefinit aussi les tabindex suivant jusqu'a fin du formulaire*/
       var formulaireNodes = document.getElementByTagName("form").childNodes;
       for(i=0;formulaireNodes.length;i++)
       {
          if(formulaireNodes[i].id == 'insertBeforeThis') startTabindexDefinition = true;
     
          /*si on a des champs ou boutons quelquonque de formulaire, on réassigne l'attribut tabindex*/
          if(startTabindexDefinition && (formulaireNodes[i].nodeName == 'INPUT' || formulaireNodes[i].nodeName == 'SELECT' || formulaireNodes[i].nodeName == 'TEXTAREA'))
          {
             /*on incremente la valeur de tabulation*/
             tabindexValue++;
             /*si on est dans le cas exeptionnel des input de type="radio", c'est le même tabindex pour le paquet de radio*/
             if(formulaireNodes[i].type == 'radio')
             {
                formulaireNodes[i].setAttribute("tabindex",tabindexValue);
                /*on decremente tabindexValue apès redefinition*/
                tabindexValue--;
                /*on definit une variable de controle de detection de paquet de radio*/
                var detectionRadio = true;
             }
             else
             {
                /*si il y a eut precedment detection de radio, on redefinit la var de detection*/
                if(detectionRadio == true)
                {
                   detectionRadio = false;
                   /*on incremente de nouveau la valeur de tabulation*/
                   tabindexValue++;
                }
                formulaireNodes[i].setAttribute("tabindex",tabindexValue);
             }
          }
       }
     
       /*on insert la valeur du compteur dans le champs hidden d'id hiddenCounter*/
       var newHiddenCounter = document.getElementById('hiddenCounter');
       newHiddenCounter.value = counter;
    }
    function afficheCounter()
    {
       alert(counter);
    }
    j'ai pour essai pour l'instant, coté html, un input hidden comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type="hidden" id="hiddenCounter" name="hidden_counter" value="10" />
    mon problème est que ma variable counter est "undefined" alors qu'un alert sur document.getElementById('hiddenCounter').value me retourne 10...

    pourquoi ma variable counter n'est pas definit depuis ma value de hiddenCounter ?

    Merci d'avance pour votre aide

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Par défaut
    Bonjour,
    un compteur doit être numérique.
    Or un .value est toujours de type string
    ==>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var hiddenCounter = parseInt(document.getElementById('hiddenCounter').value, 10);
    A+

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 163
    Par défaut
    ok, j'ai presque du mieux
    j'ai fait ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    /*on verifie si le champ hiddenCounter existe afin de definir counter*/
    var hiddenCounter = parseInt(document.getElementById('hiddenCounter').value, 10);
    var counter = (hiddenCounter > 0) ? hiddenCounter : 0;
     
    function afficheCounter()
    {
       alert(counter);
    }
    dans ce cas rien ne fonctionne (alert me retourne "undefined")
    par contre en faisant comme suit, cela fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function afficheCounter()
    {
       /*on verifie si le champ hiddenCounter existe afin de definir counter*/
       var hiddenCounter = parseInt(document.getElementById('hiddenCounter').value, 10);
       var counter = (hiddenCounter > 0) ? hiddenCounter : 0;
       alert(counter);
    }
    je remet mon code complet au cas où
    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    /*on verifie si le champ hiddenCounter existe afin de definir counter*/
    var hiddenCounter = parseInt(document.getElementById('hiddenCounter').value, 10);
    var counter = (hiddenCounter > 0) ? hiddenCounter : 0;
     
    function moreFields()
    {
       counter++;
     
       /*on clone le noeud du passage à recréé*/
       var newFields = document.getElementById('readroot').cloneNode(true);
       /*on redefinit l'id de celui-ci*/
       var insert = 'insert_'
       newFields.id = insert + counter;
     
       /*on definit les noeuds enfant de ce dernier*/
       var newField = newFields.childNodes;
     
       for(var i=0;i<newField.length;i++)
       {
          /*on redefinit l'attibut for du noeud label à chaque label rencontrer*/
          if(newField[i].nodeName == 'LABEL')
          {
             var lastCibleLabel = newField[i].getAttribute("for");
             newCibleLabel = lastCibleLabel + counter;
             newField[i].setAttribute("for",newCibleLabel);
          }
          /*on initialise une variable tabindexMaxi pour enregistrement de la valeur maxi de tabindex pour le clone*/
          var tabindexMaxi = '';
     
          /*si on a un champs quelquonque de forulaire, on réassigne les attributs id pour concordance au label, et name pour recuperation POST*/
          if(newField[i].nodeName == 'INPUT' || newField[i].nodeName == 'SELECT' || newField[i].nodeName == 'TEXTAREA')
          {
             newField[i].setAttribute("id",newCibleLabel);
             newField[i].name = newField[i].name + counter;
             /*pour chaque champ de formulaire detecter, on ecrase la valeur de la variable tabindexMaxi afin de détecter la valeur maxi de tabindex pour réincrémenter */
             tabindexMaxi = parseInt(newField[i].getAttribute("tabindex"), 10);
          }
       }
     
       /*on definit la valeur de depart du tabindex pour ce nouveau noeud cloner*/
       tabindexValue = tabindexMaxi * counter;
     
       /* on redefinit ensuite tout les tabindex du noeud cloner suivant counter et tabindexMaxi*/
       for(var i=0;i<newField.length;i++)
       {
          /*si on a des champs quelquonque de formulaire, on réassigne l'attribut tabindex*/
          if(newField[i].nodeName == 'INPUT' || newField[i].nodeName == 'SELECT' || newField[i].nodeName == 'TEXTAREA')
          {
             /*on incremente la valeur de tabulation*/
             tabindexValue++;
             /*si on est dans le cas exeptionnel des input de type="radio", c'est le même tabindex pour le paquet de radio*/
             if(newField[i].type == 'radio')
             {
                newField[i].setAttribute("tabindex",tabindexValue);
                /*on decremente tabindexValue apès redefinition*/
                tabindexValue--;
                /*on definit une variable de controle de detection de paquet de radio*/
                var detectionRadio = true;
             }
             else
             {
                /*si il y a eut precedment detection de radio, on redefinit la var de detection*/
                if(detectionRadio == true)
                {
                   detectionRadio = false;
                   /*on incremente de nouveau la valeur de tabulation*/
                   tabindexValue++;
                }
                newField[i].setAttribute("tabindex",tabindexValue);
             }
          }
       }
     
       /*on insert ce noeud clone dans le formulaire avant l'element d'id writeroot*/
       var insertBeforeThis = document.getElementById('insertBeforeThis');
       insertBeforeThis.parentNode.insertBefore(newFields,insertBeforeThis);
     
       /*on redefinit aussi les tabindex suivant jusqu'a fin du formulaire*/
       var formulaireNodes = document.getElementByTagName("form").childNodes;
       for(i=0;formulaireNodes.length;i++)
       {
          if(formulaireNodes[i].id == 'insertBeforeThis') startTabindexDefinition = true;
     
          /*si on a des champs ou boutons quelquonque de formulaire, on réassigne l'attribut tabindex*/
          if(startTabindexDefinition && (formulaireNodes[i].nodeName == 'INPUT' || formulaireNodes[i].nodeName == 'SELECT' || formulaireNodes[i].nodeName == 'TEXTAREA'))
          {
             /*on incremente la valeur de tabulation*/
             tabindexValue++;
             /*si on est dans le cas exeptionnel des input de type="radio", c'est le même tabindex pour le paquet de radio*/
             if(formulaireNodes[i].type == 'radio')
             {
                formulaireNodes[i].setAttribute("tabindex",tabindexValue);
                /*on decremente tabindexValue apès redefinition*/
                tabindexValue--;
                /*on definit une variable de controle de detection de paquet de radio*/
                var detectionRadio = true;
             }
             else
             {
                /*si il y a eut precedment detection de radio, on redefinit la var de detection*/
                if(detectionRadio == true)
                {
                   detectionRadio = false;
                   /*on incremente de nouveau la valeur de tabulation*/
                   tabindexValue++;
                }
                formulaireNodes[i].setAttribute("tabindex",tabindexValue);
             }
          }
       }
     
       /*on insert la valeur du compteur dans le champs hidden d'id hiddenCounter*/
       var newHiddenCounter = document.getElementById('hiddenCounter');
       newHiddenCounter.value = counter;
    }
    function afficheCounter()
    {
       alert(counter);
    }
    lors de mon test sur script complet, alert(counter); me rtourne d'abord "undefinied", et apres une ou plusieurs execution de ma fonction moreFields(), il me retourne "NaN"

    si quelqu'un à une idée sur le problème de non definition de ce compteur ?
    Ps est ce que la redefinition de newHiddenCounter semble correcte ou faut il que je passe par setAttribute()?

    merci d'avance

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 163
    Par défaut
    toujour ce même problème... j'ai beau reprendre de fond en comble mais pas moyen de comprendre pourquoi mon compteur n'est pas definit

    si quelqu'un à une idée

  5. #5
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par défaut
    parceque le champs n'existe pas lorsque le ligne est interprétée ...

    soit tu mets la ligne àprès que l'input hidden soit instancié soit tu mets la ligne dasn une fonction que tu lances sur le onload ...
    par exemple :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function init(){
    var hiddenCounter = parseInt(document.getElementById('hiddenCounter').value, 10);
    var counter = (hiddenCounter > 0) ? hiddenCounter : 0;
     }
    puis dans le onload

    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 163
    Par défaut
    oki j'avance doucement quand à l'aboutissement de ce JS et je rencontre un probleme...

    à un moment du script je fait ceci pour determiner les noeud enfant de mon <form></form>:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var formulaireNodes = document.getElementsByTagName("form").childNodes;
       for(i=0;formulaireNodes.length;i++)
       {
          ...
       }
    Ceci me renvoi qui n'existe aucune propriété pour mon formulaireNodes.length

    Si quelqu'un a une idée

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

Discussions similaires

  1. Réaliser un compteur depuis une date précise
    Par g0g059 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 04/12/2010, 14h23
  2. [DATA] missing values dans l'importation depuis SPSS
    Par Claude_S dans le forum SAS Base
    Réponses: 8
    Dernier message: 22/07/2009, 09h38
  3. Affecter value à un input depuis un href
    Par fabou3377 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 09/08/2007, 19h46
  4. Réponses: 1
    Dernier message: 29/08/2006, 16h29
  5. [FLASH MX] Définir une position x fixe : depuis la droite
    Par Miles Raymond dans le forum Flash
    Réponses: 14
    Dernier message: 07/07/2006, 15h48

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