<input type="checkbox" onclick="onClickHandler()" onchange="onChangeHandler()" />
De dentro onClickHandler
e / ou onChangeHandler
, como posso determinar qual é o novo estado da caixa de seleção?
<input type="checkbox" onclick="onClickHandler()" onchange="onChangeHandler()" />
De dentro onClickHandler
e / ou onChangeHandler
, como posso determinar qual é o novo estado da caixa de seleção?
Respostas:
A resposta curta:
Use o click
evento, que não será acionado até após a atualização do valor e será acionado quando você desejar:
<label><input type='checkbox' onclick='handleClick(this);'>Checkbox</label>
function handleClick(cb) {
display("Clicked, new value = " + cb.checked);
}
A resposta mais longa:
O change
manipulador de eventos não é chamado até que o checked
estado seja atualizado ( exemplo ao vivo | fonte ), mas porque (como Tim Büthe aponta nos comentários) o IE não aciona o change
evento até que a caixa de seleção perca o foco, você não consegue a notificação proativamente. Pior, com o IE, se você clicar em um rótulo para a caixa de seleção (em vez da própria caixa de seleção) para atualizá-lo, poderá ter a impressão de que está obtendo o valor antigo (tente com o IE aqui clicando no rótulo: exemplo vivo | fonte ). Isso ocorre porque, se a caixa de seleção tiver foco, clicar no rótulo afasta o foco, dispara o change
evento com o valor antigo e, em seguida, oclick
acontece definindo o novo valor e voltando a focar na caixa de seleção. Muito confuso.
Mas você pode evitar todo esse desagrado se você o usar click
.
Eu usei manipuladores DOM0 ( onxyz
atributos) porque é isso que você perguntou, mas para o registro, geralmente recomendo conectar manipuladores no código (DOM2 addEventListener
ou attachEvent
em versões mais antigas do IE) em vez de usar onxyz
atributos. Isso permite anexar vários manipuladores ao mesmo elemento e evita que todos os manipuladores sejam funções globais.
Uma versão anterior desta resposta usava este código para handleClick
:
function handleClick(cb) {
setTimeout(function() {
display("Clicked, new value = " + cb.checked);
}, 0);
}
O objetivo parecia ser permitir que o clique fosse concluído antes de analisar o valor. Tanto quanto sei, não há razão para fazer isso, e não faço ideia do porquê. O valor é alterado antes que o click
manipulador seja chamado. De fato, a especificação é bastante clara sobre isso . A versão sem setTimeout
funciona perfeitamente bem em todos os navegadores que experimentei (até no IE6). Só posso supor que estava pensando em outra plataforma em que a mudança não é feita até depois do evento. De qualquer forma, não há razão para fazer isso com as caixas de seleção HTML.
tab
+ space
) também acionará o onclick
manipulador (verificado no Chrome 51, pelo menos).
Para o React.js, você pode fazer isso com um código mais legível. Espero que ajude.
handleCheckboxChange(e) {
console.log('value of checkbox : ', e.target.checked);
}
render() {
return <input type="checkbox" onChange={this.handleCheckboxChange.bind(this)} />
}
onchange
funciona corretamente+IE9
. Fonte