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 :

Routine de calcul en JS


Sujet :

JavaScript

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 43
    Points : 36
    Points
    36
    Par défaut Routine de calcul en JS
    Bonjour,

    je cherche à réaliser un calculateur de volume dans Wordpress.

    Voir l'exemple qui marche sur mon site : https://adopt-un-box.la-rochelle-web...me-formulaire/

    Le problème : cet page calcule bien le volume nécessaire pour les 100 premiers objets. Mais le calcul, réalisé à partir d'un plugins sans doute "bridé", ne fonctionne pas pour les objets de 100 à 139 (il y a 139 objets en tout).

    Le principe : l'utilisateur entre le nombre (Ni)de chaque objet présenté qu'il souhaite stocker dans un box.

    Chaque objet a un volume défini et enregistré dans un champs input non visible (Vi)

    Une fonction js appelée "Somme" doit :

    - calculer le volume global appelé "total". Sous forme mathématique : total = somme(Ni x Vi)

    - afficher les résultat dans l'input "total"

    Je découvre le javascript et j'ai "bricolé" la fonction suivante fonction qui ne marche pas.

    Tout d'abord le code HTML, puis le script js :
    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
    <input type="number" id="number-1"/><input type="number" name="volume-1"/><br/>
    <input type="number" id="number-2"/><input type="number" name="volume-2"/><br/>
    ...
    <input type="number" id="number-139"/><input type="number" name="volume-139"/><br/>
    <input type="number" id="total"/>
     
    <script type="text/javascript">
    function somme() {
            "use strict";
            var sommeRes = 0, i, NbObjets = 139;
            
            for (i = 1; i <= NbObjets; i += 1) {
                    sommeRes += parseFloat(document.getElementById("number-" + i).value) * parseFloat(document.getElementById("volume-" + i).value);
            }
     
            // Si la sommeRes n’est pas définie on ne l’affiche pas.
            if (isNaN(sommeRes)) {
                    sommeRes = "";
            }
            document.getElementById("total").value = sommeRes;
            }
     
    window.onload = function () {
            "use strict";
     
            document.getElementById("number-1").onchange = function () {
                    somme();
            };
            document.getElementById("number-2").onchange = function () {
                    somme();
            };
            .....
            
            document.getElementById("number-139").onchange = function () {
                    somme();
            };
    };
    </script>
    J'ai besoin de votre aide !

    Quelqu'un de plus doué que moi peut-il m'expliquer pourquoi cette fonction ne marche SVP ?

    Quel serait le code corrigé qui fonctionne SVP ?



    Merci beaucoup !

    Alain

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 356
    Points : 15 702
    Points
    15 702
    Par défaut
    la formule que vous avez mis dans le shortcode "calculator" va seulement jusqu'à 99. votre soucis de calcul vient peut-être de là ?

  3. #3
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 436
    Points : 4 930
    Points
    4 930
    Par défaut
    Bonjour,

    Tu attaches 139 écouteurs d'événements comme ça ?. il va falloir utiliser des boucles comme forEach par exemple et des méthodes de manipulation des éléments du DOM comme nextElementSibling pour récupérer le nœud suivant et querySelectorAll pour récupérer tous les éléments ayant un id commençant par "number-" :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <input type="number" min="0" id="number-1" /><input type="number" min="1"  value="1" /><br />
    <input type="number" min="0" id="number-2" /><input type="number" min="1" value="1" /><br />
    <input type="number" id="total" />

    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
     
    var inputsNumber = document.querySelectorAll('[id^=number-]'),
      sommeRes = 0,
      i, NbObjets = inputsNumber.length;
     
    function somme() {
     
      sommeRes = 0;
      inputsNumber.forEach((elem) => {
        console.log(elem.id, elem.value);
        if (isNaN(elem.value)) elem.value = 1;
        sommeRes += elem.value * elem.nextElementSibling.value;
      });
      // Si la sommeRes n'est pas définie on le remplace par "".
      if (isNaN(sommeRes)) {
        sommeRes = "";
      }
      document.getElementById("total").value = sommeRes;
    }
     
    window.onload = function() {
      inputsNumber.forEach((elem) => {
        console.log(elem.id, elem.value);
        document.getElementById(elem.id).onchange = function() {
          somme();
        }
      });
    };

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 075
    Points : 44 667
    Points
    44 667
    Par défaut
    Bonjour,
    tu peux faire plus concis en utilisant l'événement change sur un élément <form>.
    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
    <form> 
      <p><input type="number" min="0"><input type="number" min="1" value="1">
      <p><input type="number" min="0"><input type="number" min="1" value="1">
      <hr>
      <p><output></output>
    </form>
    <script>
    const elNumbers = document.querySelectorAll("[type='number']");
    const elOut = document.querySelector("output");
    document.querySelector("form").addEventListener("change", calcul);
     
    function calcul() {
      let somme = 0;
      elNumbers.forEach((el) => {  // d'autres méthodes possibles
        somme += +el.value;
      });
      elOut.textContent = somme;
    }
    </script>
    il suffit ensuite de décliner pour adapter au besoin.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 43
    Points : 36
    Points
    36
    Par défaut
    Bonsoir Toufik83 et Nosmoking,

    merci pour votre aide précieuse.

    Le code donné par Toufi83 fonctionne parfaitement.

    Génial, merci mille fois.

    Alain

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

Discussions similaires

  1. [TP7] Calculer sin, cos, tan, sqrt via le FPU
    Par zdra dans le forum Assembleur
    Réponses: 8
    Dernier message: 25/11/2002, 04h09
  2. Calcul des numéros de semaine d'un calendrier
    Par Invité dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 06/11/2002, 21h29
  3. Réponses: 8
    Dernier message: 18/09/2002, 03h20
  4. Récupérer 10 nb différents avec un calcul aléatoire
    Par BXDSPORT dans le forum Langage
    Réponses: 3
    Dernier message: 04/08/2002, 02h35
  5. Algo de calcul de FFT
    Par djlex03 dans le forum Traitement du signal
    Réponses: 15
    Dernier message: 02/08/2002, 17h45

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