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 :

Saisir un montant de type salaire


Sujet :

JavaScript

  1. #1
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 628
    Points
    3 628
    Billets dans le blog
    8
    Par défaut Saisir un montant de type salaire
    Bonjour,

    J'ai le souci suivant :
    Sur un formulaire HTML5 avec plusieurs champs de type number, je veux saisir des salaires, des charges, des emprunts...
    Sous Firefox, c'est bien sympathique, on peut cliquer sur le petit bouton up...
    Problème, il monte par défaut de 1.
    Et j'aimerais qu'il grimpe par défaut de 100...
    Or, si je mets step="100", ça fait tout autre chose, puisque ça oblige le client à mettre un multiple de 100.
    Une idée pour me permettre de garder un pas de 100 tout en laissant le client finir à la main en saisissant 1554 s'il le souhaite ?
    .

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 900
    Points : 6 678
    Points
    6 678
    Par défaut
    La seule manière que je vois serait d'utiliser un champ texte normal, de lui coller deux png clickables en forme de flèches et de contrôler le tout en javascript.

  3. #3
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Pas très PHP comme question

    L'idée est d'avoir deux input number. Pour le premier on cache les flèches, pour le second on le positionne sous le premier.
    Concernant le second input. On met un pas de 100, un mini de -100 un maxi de 100. Quand la valeur du second input change on l'additionne à la valeur du premier et on remet le second input à 0.
    De cette manière on simule un -100 ou un +100 à chaque clic.

    Ne fonctionne que sur Firefox... je suis une quiche en css.

    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
    <!DOCTYPE html> 
    <html>
    <head>
    <style>
    input[class=hide]::-webkit-inner-spin-button, 
    input[class=hide]::-webkit-outer-spin-button { 
      -webkit-appearance: none; 
      margin: 0; 
    }input[class=hide] {
        -moz-appearance:textfield;
    }
    #spinner {
        position: relative-to element(#montant);
     left: -138px;
    }
    </style>
    </head>
    <body>
    <input class="hide" id="montant" type="number" placeholder="Saisie" value="0" style="position: relative; z-index: 100"/>
    <input type="number" id="spinner"  step="100" min="-100" max="100" style="position: relative; z-index: 90" onchange="document.getElementById('montant').value=parseFloat(document.getElementById('montant').value)+parseInt(this.value);this.value=0;"/>
    </body>
    </html>

    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
    <!DOCTYPE html> 
    <html>
    <head>
    <style>
    input[class=hide]::-webkit-inner-spin-button, 
    input[class=hide]::-webkit-outer-spin-button { 
      -webkit-appearance: none; 
      margin: 0; 
    }input[class=hide] {
        -moz-appearance:textfield;
    }
    #montant {
     position:relative;
     z-index:100
    }
    #spinner {
        position: relative-to element(#montant);
     left: -138px;
     position:relative;
     z-index:90;
    }
    </style>
    <script>
    function toto(anObj)
    {
     document.getElementById('montant').value=parseFloat(document.getElementById('montant').value)+parseInt(anObj.value);
     anObj.value=0;
    }
    function changeStep(value)
    {
     document.getElementById('spinner').step = value;
     document.getElementById('spinner').min = value * -1;
     document.getElementById('spinner').max = value;
    }
    </script>
    </head>
    <body>
    <input class="hide" id="montant" type="number" placeholder="Saisie" value="0" />
    <input type="number" id="spinner"  step="100" min="-100" max="100"  onchange="toto(this)"/>
    <select id="step" onchange="changeStep(this.value)">
     <option value="1">Pas de 1 </option> 
     <option value="10">Pas de 10 </option> 
     <option value="100" selected>Pas de de 100 </option> 
     <option value="1000">Pas de de 1000 </option> 
    </select>
    </body>
    </html>

  4. #4
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 628
    Points
    3 628
    Billets dans le blog
    8
    Par défaut
    Merci pour tout messieurs !
    Je vois ça lundi et je vous fais un retour !

  5. #5
    Invité
    Invité(e)
    Par défaut
    @badaze
    Pourquoi faire simple quand on peut faire compliqué...

    • Un input "text", avec un pattern "numérique" (histoire de contrôler la saisie)
    • 2 boutons "+" et "-"

    Ensuite, en JS, ce n'est quand même pas bien compliqué d'appliquer (au clic sur un bouton) "+100" ou "-100" à la valeur de l'input.

    Cela dit.... Si le gars n'est pas capable de taper directement 1554 dans l'input...
    ... C'est plutôt d'une aide médicale qu'il a besoin...


    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <input type="text" pattern="([0-9]+)(.[0-9]{2})?" title="Saisie" value="" class="input-number" id="montant" />
    <button type="button" class="btn-step btn-plus" data-id="montant">+</button><button type="button" class="btn-step btn-moins" data-id="montant">-</button>
    Code css : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    .input-number { width:70px; padding:5px; text-align:right; }
    .btn-step { width:30px; padding:5px; cursor:pointer; }
    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
    var the_step = 100;
    var btns_step = document.querySelectorAll('button.btn-step');
    btns_step.forEach(function(btn){
      btn.addEventListener('click',function(){
        var input = document.querySelector( '#'+btn.dataset.id ); // on récupère l id de l input dans le data-id du bouton
        var input_val = (input.value!='')? parseFloat(input.value) : 0; // valeur actuelle ou 0
        if( btn.classList.contains('btn-plus'))
        {
          input.value = input_val + the_step;
        } 
        else if( btn.classList.contains('btn-moins'))
        {
          input.value = (input_val - the_step>=0)? input_val - the_step : 0; // valeur positive
        }
      });
    });
    Dernière modification par Invité ; 12/10/2018 à 12h51.

  6. #6
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 628
    Points
    3 628
    Billets dans le blog
    8
    Par défaut
    Cela dit.... Si le gars n'est pas capable de taper directement 1554 dans l'input...
    ... C'est plutôt d'une aide médicale qu'il a besoin...
    Lol...
    Le gars n'en est pas à ce point, tu as raison.
    Son problème est plutôt que comme je mettais des input type="number", ben il voit les petites flèches et il peut pas s'empêcher de jouer avec, et de se dire : "Ouah, c'est nul, ça saute de 1 en 1"...
    Normal quoi, le gars...
    Donc je règle le problème comme tu le conseilles. Input de type text et pattern de type nombre... sans autre formalité. Finalement, tu peux redéplacer le sujet dans HTML (lol, non, je rigole).

    Mais j'espère que quelqu'un a fait remonter à M. HTML5 que l'on pourrait ajouter un attribut "pace" à l'input de type number, qui ne contraindrait pas l'utilisateur à saisir un multiple, m'enfin, ça m'étonnerait qu'il me lise, M. HTML5.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour Dendrite,

    Je t'ai mis le code (dans mon message précédent).

    Le pattern va à 2 décimales : 1523.35
    Pour un numérique sans décimales : pattern="([0-9]+)".

    Remarque :
    On peut aussi mettre cette valeur dans un data-step des boutons.

    Ainsi, on peut faire varier d'un input à l'autre si on veut :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <p><label>Montant :</label>
      <input type="text" pattern="\d+(\.\d{2})?" title="Nombre à 2 décimales (xxxx.xx)" value="" class="input-number" id="montant" />
    <button type="button" class="btn-step btn-plus" data-id="montant" data-step="100">+</button><button type="button" class="btn-step btn-moins" data-id="montant" data-step="100">-</button> (step : 100)
    </p>
    <p><label>Salaire :</label>
      <input type="text" pattern="\d+(\.\d{2})?" title="Nombre à 2 décimales (xxxx.xx)" value="" class="input-number" id="salaire" />
    <button type="button" class="btn-step btn-plus" data-id="salaire" data-step="5">+</button><button type="button" class="btn-step btn-moins" data-id="salaire" data-step="5">-</button> (step : 5)
    </p>
    Code css : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    label { display:inline-block; width:80px; }
    .input-number { width:70px; padding:5px; text-align:right; }
    .btn-step { width:30px; padding:5px; cursor:pointer; }
    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
    var btns_step = document.querySelectorAll('button.btn-step');
    btns_step.forEach(function(btn){
      btn.addEventListener('click',function(){
        var the_step = parseFloat( btn.dataset.step ); // on récupère le step dans le data-step du bouton
        var input = document.querySelector( '#'+btn.dataset.id ); // on récupère l id de l input dans le data-id du bouton
        var input_val = (input.value!='')? parseFloat(input.value) : 0; // valeur actuelle ou 0
        if( btn.classList.contains('btn-plus'))
        {
          input.value = input_val + the_step;
        } 
        else if( btn.classList.contains('btn-moins'))
        {
          input.value = (input_val - the_step>=0)? input_val - the_step : 0; // valeur positive
        }
      });
    });

    Démo ici : https://codepen.io/jreaux62/pen/oaejeb
    Dernière modification par Invité ; 12/10/2018 à 14h46.

  8. #8
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 628
    Points
    3 628
    Billets dans le blog
    8
    Par défaut
    Merki Jreaux, j'achète et je marque résolu.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Le seul "inconvénient" (mineur) est que sur tablette/smartphone, pour la saisie manuelle, il ouvrira le clavier "normal" (alpha) au lieu du clavier "numérique".
    Cela dit, les boutons fonctionneront toujours très bien.

  10. #10
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 900
    Points : 6 678
    Points
    6 678
    Par défaut
    Attention à échapper le point dans la pattern html:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pattern="[0-9]+(\.[0-9]{2})?"

  11. #11
    Invité
    Invité(e)
    Par défaut
    Merci, Maître es-regex

    Et si je ne m'abuse, ça peut s'écrire :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    pattern="\d+(\.\d{2})?"

  12. #12
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    @badaze
    Pourquoi faire simple quand on peut faire compliqué...

    • Un input "text", avec un pattern "numérique" (histoire de contrôler la saisie)
    • 2 boutons "+" et "-"

    Ensuite, en JS, ce n'est quand même pas bien compliqué d'appliquer (au clic sur un bouton) "+100" ou "-100" à la valeur de l'input.
    J’essaie toujours d’être pragmatique en informatique. Mais de temps en temps je me lâche !

  13. #13
    Invité
    Invité(e)
    Par défaut
    Tu as RAISON !

    Si Pasteur n'avait pas insisté....
    Ou Marie Curie...
    Dernière modification par Invité ; 13/10/2018 à 12h39.

  14. #14
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 900
    Points : 6 678
    Points
    6 678
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    Et si je ne m'abuse, ça peut s'écrire :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    pattern="\d+(\.\d{2})?"
    Oui on peut très bien utiliser \d à la place de [0-9].

    Cette question n'est pas si évidente qu'elle en à l'air car la classe \d pourrait éventuellement s'entendre à l'unicode et contenir en plus des chiffres ASCII 0-9 des chiffres d'autres alphabets comme \u{0660}-\u{0669} (chiffres en arabe).

    La documentation html5 à propos de l'attribut pattern s'en réfère à Javascript:
    If specified, the attribute’s value must match the JavaScript Pattern production. [ECMA-262]
    .

    Et la specification ECMAScript est claire sur ce sujet:
    21.2.2.12CharacterClassEscape
    The production CharacterClassEscape::d evaluates as follows:

    Return the ten-element set of characters containing the characters 0 through 9 inclusive.
    Il n'est fait mention ni de "mode" unicode, ni de locales susceptibles de modifier le contenu de \d.

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

Discussions similaires

  1. Forcer l'utilisateur a saisir du numerique dans un input type="text"
    Par scraly dans le forum Général JavaScript
    Réponses: 15
    Dernier message: 02/06/2016, 21h30
  2. [AC-97] Saisir Date type : calendrier.
    Par Jazz_ dans le forum IHM
    Réponses: 2
    Dernier message: 23/08/2010, 13h33
  3. Réponses: 1
    Dernier message: 18/09/2009, 19h37
  4. Réponses: 2
    Dernier message: 21/07/2006, 10h06
  5. Réponses: 7
    Dernier message: 02/06/2003, 08h38

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