<input type="checkbox" onclick="onClickHandler()" onchange="onChangeHandler()" />
onClickHandler
および/またはonChangeHandler
内から、チェックボックスの新しい状態をどのように判断できますか?
短い答え:
click
イベントを使用します。このイベントは、値が更新されるまでは発生せず、必要に応じて発生します。
<label><input type='checkbox' onclick='handleClick(this);'>Checkbox</label>
function handleClick(cb) {
display("Clicked, new value = " + cb.checked);
}
長い答え:
change
イベントハンドラは、checked
状態が更新されるまで呼び出されません( ライブ例 | source )しかし、(TimBütheがコメントで指摘しているように)IEはチェックボックスがフォーカスを失うまでchange
イベントを発生させないので、あなたは積極的に通知を受け取りません。さらに悪いことに、チェックボックスを更新するために(チェックボックス自体ではなく)ラベルのラベルをクリックすると、IEと表示されます。古い値(ここでラベルをクリックしてIEで試してください: ライブの例 | source )これは、チェックボックスにフォーカスがある場合、ラベルをクリックするとフォーカスが外れ、古い値でchange
イベントが発生し、click
が新しい値を設定してチェックボックスにフォーカスを戻すことが発生するためです。非常に紛らわしいです。
しかし、代わりにclick
を使用すれば、そのような不快感をすべて回避することができます。
DOM0ハンドラー(onxyz
属性)を使用したのですが、addEventListener
属性を使用するのではなく、レコード(DOM2のattachEvent
、または古いバージョンのIEではonxyz
)でハンドラーをフックすることをお勧めします。これにより、同じ要素に複数のハンドラをアタッチすることができ、すべてのハンドラをグローバル関数にすることを回避できます。
この回答の以前のバージョンでは、handleClick
にこのコードを使用していました。
function handleClick(cb) {
setTimeout(function() {
display("Clicked, new value = " + cb.checked);
}, 0);
}
目標は、値を確認する前にクリックを完了できるようにすることでした。私が知っている限りでは、それをする理由はありません、そして私はなぜ私がしたのかわかりません。 click
ハンドラーが呼び出される前に値が変更されます。実際、その仕様は についてはっきりしています 。 setTimeout
が付いていないバージョンは、私が試したすべてのブラウザ(IE6でさえ)で完璧に動作します。イベントが終わるまで変更が行われないその他のプラットフォームを考えていたとしか思えません。いずれにせよ、HTMLのチェックボックスでそれをする理由はありません。
これを使って
<input type="checkbox" onclick="onClickHandler()" id="box" />
<script>
function onClickHandler(){
var chk=document.getElementById("box").value;
//use this value
}
</script>
React.jsでは、もっと読みやすいコードでこれを行うことができます。それが役に立てば幸い。
handleCheckboxChange(e) {
console.log('value of checkbox : ', e.target.checked);
}
render() {
return <input type="checkbox" onChange={this.handleCheckboxChange.bind(this)} />
}