215 votes

Case à cocher Javascript onChange

J'ai une case à cocher dans un formulaire et j'aimerais qu'elle fonctionne selon le scénario suivant :

  • si quelqu'un le vérifie, la valeur d'un champ de texte ( totalCost ) doit être fixé à 10 .
  • puis, si je reviens en arrière et que je décoche, une fonction calculate() fixe la valeur de totalCost en fonction d'autres paramètres du formulaire.

J'ai donc besoin de la partie où, lorsque je coche la case, je fais une chose et lorsque je la décoche, j'en fais une autre.

17voto

Eugene Points 36

La solution suivante utilise jquery. Supposons que vous ayez une case à cocher dont l'identifiant est checkboxId .

const checkbox = $("#checkboxId");

checkbox.change(function(event) {
    var checkbox = event.target;
    if (checkbox.checked) {
        //Checkbox has been checked
    } else {
        //Checkbox has been unchecked
    }
});

4voto

Bart Points 39

Référencer la case à cocher par son identifiant et non par le #. Attribuer la fonction à l'attribut onclick plutôt que d'utiliser l'attribut change

var checkbox = $("save_" + fieldName);
checkbox.onclick = function(event) {
    var checkbox = event.target;

    if (checkbox.checked) {
        //Checkbox has been checked
    } else {
        //Checkbox has been unchecked
    }
};

0voto

Dennis Bruijn Points 141

Javascript

  // on toggle method
  // to check status of checkbox
  function onToggle() {
    // check if checkbox is checked
    if (document.querySelector('#my-checkbox').checked) {
      // if checked
      console.log('checked');
    } else {
      // if unchecked
      console.log('unchecked');
    }
  }

HTML

<input id="my-checkbox" type="checkbox" onclick="onToggle()">

0voto

Kamil Kiełczewski Points 6496

Essayer

totalCost.value = checkbox.checked ? 10 : calculate();

function change(checkbox) {
  totalCost.value = checkbox.checked ? 10 : calculate();
}

function calculate() {
  return other.value*2;
}

input { display: block}

Checkbox: <input type="checkbox" onclick="change(this)"/>
Total cost: <input id="totalCost" type="number" value=5 />
Other: <input id="other" type="number" value=7 />

0voto

Bruce Tong Points 341

Je sais que cela semble être une réponse de noob mais je la mets ici pour qu'elle puisse aider d'autres personnes à l'avenir.

Supposons que vous construisiez un tableau avec une boucle foreach. Et que vous ajoutiez en même temps des cases à cocher à la fin.

<!-- Begin Loop-->
<tr>
 <td><?=$criteria?></td>
 <td><?=$indicator?></td>
 <td><?=$target?></td>
 <td>
   <div class="form-check">
    <input type="checkbox" class="form-check-input" name="active" value="<?=$id?>" <?=$status?'checked':''?>> 
<!-- mark as 'checked' if checkbox was selected on a previous save -->
   </div>
 </td>
</tr>
<!-- End of Loop -->

Vous placez un bouton sous le tableau avec une entrée cachée :

<form method="post" action="/goalobj-review" id="goalobj">

 <!-- we retrieve saved checkboxes & concatenate them into a string separated by commas.i.e. $saved_data = "1,2,3"; -->

 <input type="hidden" name="result" id="selected" value="<?= $saved_data ?>>
 <button type="submit" class="btn btn-info" form="goalobj">Submit Changes</button>
</form>

Vous pouvez écrire votre script comme suit :

<script type="text/javascript">
    var checkboxes = document.getElementsByClassName('form-check-input');
    var i;
    var tid = setInterval(function () {
        if (document.readyState !== "complete") {
            return;
        }
        clearInterval(tid);
    for(i=0;i<checkboxes.length;i++){
        checkboxes[i].addEventListener('click',checkBoxValue);
    }
    },100);

    function checkBoxValue(event) {
        var selected = document.querySelector("input[id=selected]");
        var result = 0;
        if(this.checked) {

            if(selected.value.length > 0) {
                result = selected.value + "," + this.value;
                document.querySelector("input[id=selected]").value = result;
            } else {
                result = this.value;
                document.querySelector("input[id=selected]").value = result;
            }
        }
        if(! this.checked) { 

// trigger if unchecked. if checkbox is marked as 'checked' from a previous saved is deselected, this will also remove its corresponding value from our hidden input.

            var compact = selected.value.split(","); // split string into array
            var index = compact.indexOf(this.value); // return index of our selected checkbox
            compact.splice(index,1); // removes 1 item at specified index
            var newValue = compact.join(",") // returns a new string
            document.querySelector("input[id=selected]").value = newValue;
        }

    }
</script>

Les identifiants de vos cases à cocher seront soumis sous la forme d'une chaîne "1,2" dans la variable résultat. Vous pouvez ensuite le décomposer au niveau du contrôleur comme vous le souhaitez.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X