Caixa de seleção Javascript onChange

130

Eu tenho uma caixa de seleção em um formulário e gostaria que funcionasse de acordo com o seguinte cenário:

  • se alguém verificar, o valor de um campo de texto ( totalCost) deve ser definido como 10.
  • então, se eu voltar e desmarcar, uma função calculate()define o valor de totalCostacordo com outros parâmetros no formulário.

Então, basicamente, preciso da parte em que, ao marcar a caixa de seleção, faço uma coisa e, quando desmarco, faço outra.

bikey77
fonte
Checkboxid.Checked == verdadeiro / falso {Escreva seu evento}.
Naresh

Respostas:

150
function calc()
{
  if (document.getElementById('xxx').checked) 
  {
      document.getElementById('totalCost').value = 10;
  } else {
      calculate();
  }
}

HTML

<input type="checkbox" id="xxx" name="xxx" onclick="calc();"/>
Senad Meškin
fonte
30
E se o usuário usa o teclado?
Thomthom 18/12/2013
6
Aqui está um JsFiddle onde todas as diferentes maneiras podem ser testadas: clique, teclado, rótulo e tecla de acesso. Todos eles acionam o evento no Firefox.
Roman Starkov
4
Infelizmente, o evento não é acionado quando o estado da caixa de seleção é alterado através do JavaScript.
StanE 23/06
2
lol, use isso no javascript $ ('# checkbox'). attr ('marcado', 'marcado'); $ ('# caixa de seleção'). click ();
Senad Meškin
5
Você deve usar o onchange, ele foi projetado especificamente para o caso de uso do OP. (obrigado ReeCube abaixo pelo link) developer.mozilla.org/pt-BR/docs/Web/Events/change
Armando
90

Javascript puro:

const checkbox = document.getElementById('myCheckbox')

checkbox.addEventListener('change', (event) => {
  if (event.target.checked) {
    alert('checked');
  } else {
    alert('not checked');
  }
})
My Checkbox: <input id="myCheckbox" type="checkbox" />

Vic
fonte
28

Se você estiver usando jQuery .., posso sugerir o seguinte: NOTA: Fiz uma suposição aqui

$('#my_checkbox').click(function(){
    if($(this).is(':checked')){
        $('input[name="totalCost"]').val(10);
    } else {
        calculate();
    }
});
Liangliang Zheng
fonte
19

Use um evento onclick, porque cada clique em uma caixa de seleção realmente o altera.

SergeS
fonte
29
E se o usuário usar o teclado?
Thomthom 18/12/2013
14
É strage, mas ainda é clique #
SergeS 19/12/2013
6
Na verdade, o clique funciona e é acionado quando você usa um rótulo para alternar a caixa de seleção. Mas você deve usar melhor o evento 'change'! O evento 'change' é destinado a isso: developer.mozilla.org/en-US/docs/Web/Events/change
ReeCube
E o clique duplo?
Chalky
4
Bem, agora são dois cliques, não é?
precisa
13

A solução a seguir utiliza o jquery. Vamos supor que você tenha uma caixa de seleção com o ID de checkboxId.

const checkbox = $("#checkboxId");

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

HTML:

<input type="checkbox" onchange="handleChange(event)">

JS:

function handleChange(e) {
     const {checked} = e.target;
}
Ali Kleit
fonte
3

Faça referência à caixa de seleção por seu ID e não com o # Atribuir a função ao atributo onclick em vez de usar o atributo 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
    }
};
Bart
fonte
1

Eu sei que isso parece uma resposta noob, mas estou colocando aqui para que possa ajudar outras pessoas no futuro.

Suponha que você esteja construindo uma tabela com um loop foreach. E ao mesmo tempo adicionando caixas de seleção no final.

<!-- 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 -->

Você coloca um botão abaixo da tabela com uma entrada oculta:

<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>

Você pode escrever seu script assim:

<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>

Os IDs de suas caixas de seleção serão enviados como uma string "1,2" na variável de resultado. Você pode dividi-lo no nível do controlador da maneira que desejar.

Bruce Tong
fonte
0

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()">

0x1ad2
fonte
0

experimentar

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

Kamil Kiełczewski
fonte