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 :

Calcul automatique dans tableau dynamique


Sujet :

JavaScript

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2013
    Messages : 9
    Points : 2
    Points
    2
    Par défaut Calcul automatique dans tableau dynamique
    Bonjour,

    je réalise un formulaire afin de traiter les bons de commandes.

    J'ai un tableau dynamique qui ce présente comme ceci:


    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
    <table class="dTable" style="text-align:center; width:90%; margin-top:30px;">
        <thead>
                <th style="text-align:center; width:5%">Poste <br/>analytique</th>
                <th style="text-align:center; width:5%">Code <br/>chantier</th>
                <th style="text-align:center; width:40%">D&eacute;signation</th>
                <th style="text-align:center; width:5%">Unit&eacute;</th>
                <th style="text-align:center; width:5%">Quantit&eacute;</th>
                <th style="text-align:center; width:10%">Prix unitaire <br/>H.T.</th>
                <th style="text-align:center; width:10%">Montant H.T.</th>
                <th style="text-align:center; width:5%">Taux <br/>TVA</th>
    </thead>
    <tbody>    
            <tr>
                <td><input class="tableau" type="text" name="champ1[]" id="champ1[]" /></td>
                <td><input class="tableau" type="text" name="champ2[]" id="champ2[]" /></td>
                <td><input class="tableau" type="text" name="champ3[]" id="champ3[]" /></td>
                <td><input class="tableau" type="text" name="champ4[]" id="champ4[]" /></td>
                <td><input class="tableau" type="text" name="champ5[]" id="champ5[]" value="8"></td>
                <td><input class="tableau" type="text" name="champ6[]" id="champ6[]" value="" OnKeyUp="javascript:calcul(this.value, document.getElementById('champ5').value);"> </td> 
                <td><input class="tableau" type="text" name="champ7[]" id="champ7[]" value="" ></td>
                <td><input class="tableau" type="text" name="champ8[]" id="champ8[]"/></td>
                <td><a href="#" onclick="delLigne(this); return false;">Supp</a></td>
        </tbody>
    <tfoot>        
    <tr><th colspan="9"><a href="#" onclick="addLigne(this); return false;">Ajouter une ligne</a></th></tr>        
    </tfoot>
    J'utilise du javascript pour le calcul.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function calcul(chiffre1, chiffre2)
    {
        result = chiffre1*chiffre2;
        document.getElementById('champ7').value = result;
    }
    Avec une seule ligne cela fonctionne.
    Cependant je n'arrive pas à faire fonctionner le code javascript en dynamique pour qu'il effectue les calcul automatiquement avec les champ5[],champ6[],champ7[].

    Pouvez-vous m'aider à résoudre ce problème?
    Merci d'avance.

  2. #2
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    Bonjour,
    commençons par le début
    OnKeyUp="javascript:calcul(this.value, document.getElementById('champ5').value);"
    il est inutile de mettre javascript: les événements attendant un script javascript.

    Une ID doit être UNIQUE dans la page et comme tu as initialisé les ID de tes champs il y a lourd à parier qu'il y aura duplication, d'ailleurs dans la solution que je vais te présenter tu en aura pas besoin.

    Dernier point qui est plus relatif au CSS, pourquoi mettre des styles inline alors que tu sais te servir des feuilles de style, à preuve tes class sur les INPUTs.

    Venons en au fait
    Pouvez-vous m'aider à résoudre ce problème?
    Dans la fonction de calcul il te suffit de remonter au parent de l'INPUT pour atteindre le parent TR...passons à ce que pourrait être la fonction

    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
    function calcul(obj){
      // recherche TD parente de l'input (obj) passé en paramètre
      var oTD = obj.parentNode;
      // recherche TR parente de la TD
      var oTR = oTD.parentNode;
      // récup de la position de la TD sur la ligne
      var ind = oTD.cellIndex;
      // récup. TD précédente
      var oTDavant = oTR.cells[ind-1];
      // récup. TD suivante
      var oTDapres = oTR.cells[ind+1];
      // récup de l'INPUT de la TD précédente
      var oInputAvant = oTDavant.firstChild;
      // récup. de l'INPUT de la TD suivante
      var oInputApres = oTDapres.firstChild;
      // OUF!!! enfin le calcul
      oInputApres.value = oInputAvant.value * obj.value;
    }
    la fonction devra être appelée de la façon suivante dans ton code, les ID ont été supprimées
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <td><input class = "tableau" type = "text" name = "champ6[]" value = "" onkeyup = "calcul(this);"> </td>

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2013
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Merci beaucoup,
    J'aurais pu passer encore des jours sans trouver la solution.

    Je vais continuer à peaufiner mon code, notamment les styles inline.
    Pour ceux qui voudrait le code le voici :

    dans le head:


    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
    <!-- Ajout/suppression ligne du tableau  -->
    <script type="text/javascript" src="dtable.js"></script>
    <!--  -->
     
     <script type="text/javascript">
    function calcul(obj){
      // recherche TD parente de l'input (obj) passé en paramètre
      var oTD = obj.parentNode;
      // recherche TR parente de la TD
      var oTR = oTD.parentNode;
      // récup de la position de la TD sur la ligne
      var ind = oTD.cellIndex;
      // récup. TD précédente
      var oTDavant = oTR.cells[ind-1];
      // récup. TD suivante
      var oTDapres = oTR.cells[ind+1];
      // récup de l'INPUT de la TD précédente
      var oInputAvant = oTDavant.firstChild;
      // récup. de l'INPUT de la TD suivante
      var oInputApres = oTDapres.firstChild;
      // OUF!!! enfin le calcul
      oInputApres.value = oInputAvant.value * obj.value;
    }
    </script>
    dans le body:

    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
    <table class="dTable">
        <thead>
            <tr>
    			<th>Poste <br/>analytique</th>
    			<th>Code <br/>chantier</th>
    			<th>D&eacute;signation</th>
    			<th>Unit&eacute;</th>
    			<th>Quantit&eacute;</th>
    			<th>Prix unitaire <br/>H.T.</th>
    			<th>Montant H.T.</th>
    			<th>Taux <br/>TVA</th>
                <th></th>
            </tr>
        </thead>
        <tbody id="mon_tableau">
     
            <tr>
                <td><input class = "tableau" type = "text" name = "champ1[]" /></td>
                <td><input class = "tableau" type = "text" name = "champ2[]" /></td>
                <td><input class = "tableau" type = "text" name = "champ3[]" /></td>
                <td><input class = "tableau" type = "text" name = "champ4[]" /></td>
    	    <td><input class = "tableau" type = "text" name = "champ5[]"/></td>
    	    <td><input class = "tableau" type = "text" name = "champ6[]" onkeyup = "calcul(this);"/> </td> 
                <td><input class = "tableau" type = "text" name = "champ7[]"/></td>
                <td><input class = "tableau" type = "text" name = "champ8[]" /></td>
                <td><a href="#" onclick="delLigne(this); return false;">Supp</a></td>
            </tr>
        </tbody>
    		<tfoot>
    	  <tr><th><a href="#" onclick="addLigne(this); return false;">Ajouter une ligne</a></th></tr>
    		</tfoot>			
    </table>

    et le js pour ajouter et supprimer les lignes:

    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
    window.onload = dtableInit;
     
    /* initialise le script */
    function dtableInit() {
        var table = document.getElementsByTagName('TABLE');
        for ( var i = 0; i < table.length; i++ ) {
            // on récupère tous les tableaux dynamiques
            if ( table[i].className = 'dTable' ) {
                var tbody = table[i].tBodies[0];
                var newTr = tbody.rows[0].cloneNode(true);
     
                // on masque la première ligne du tbody (la ligne de reference)
                tbody.rows[0].style.display = 'none';
     
                // on en ajoute une
                tbody.appendChild(newTr);
            }
        }
    }
     
    /* trouve le tag "parentTagName" parent de "element" */
    function getParent(element, parentTagName) {
        if ( ! element )
            return null;
        else if ( element.nodeType == 1 && element.tagName.toLowerCase() == parentTagName.toLowerCase() )
            return element;
        else
            return getParent(element.parentNode, parentTagName);
    }
     
    /* ajoute une ligne */
    function addLigne(link) {
        // 1. récuperer le node "TABLE" à manipuler
        var td = link.parentNode;
        var table = getParent(td,'TABLE');
     
        // 2. on va manipuler le TBODY
        var tbody = table.tBodies[0];
     
        // 3. on clone la ligne de reference
        var newTr = tbody.rows[0].cloneNode(true);
        tbody.appendChild(newTr);
     
        if ( document.all )  // pour IE
            newTr.style.display = "block";
        else
            newTr.style.display = "table-row"; // pour Gecko
    }
     
    /* supprimer une ligne */
    function delLigne(link) {
        // 1. récuperer le node "TABLE" à manipuler
        var td = link.parentNode;
        var table = getParent(td, 'TABLE');
     
        // 2. récuperer le TBODY
        var tbody = table.tBodies[0];
     
        // 3. Supprimer le TR
        tbody.removeChild(getParent(td, 'TR'));
    }

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

Discussions similaires

  1. Calcul automatique dans un tableau dynamique
    Par samiker dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 28/12/2014, 00h17
  2. Calcul automatique dans un tableau
    Par valmeras dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 15/04/2014, 16h25
  3. [JTable] Calcul automatique dans un JTable
    Par jason-red dans le forum Composants
    Réponses: 4
    Dernier message: 19/10/2006, 11h53
  4. calculs automatiques dans un formulaire dynamique
    Par renaud26 dans le forum Général JavaScript
    Réponses: 34
    Dernier message: 13/07/2006, 18h13
  5. Calcul automatique dans des tableaux
    Par fremsoi dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 12
    Dernier message: 01/06/2006, 17h58

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