私は次のものを持っています:
<form id="myform">
<input type="checkbox" name="check1" value="check1">
<input type="checkbox" name="check2" value="check2">
</form>
JQueryを使用してanymyform
で発生するイベントをチェックし、どのチェックボックスが切り替えられたかを確認する方法(およびオン/オフが切り替えられたかどうかを知る方法)
$('#myform :checkbox').change(function() {
// this will contain a reference to the checkbox
if (this.checked) {
// the checkbox is now checked
} else {
// the checkbox is now no longer checked
}
});
変更イベントを使用します。
$('#myform :checkbox').change(function() {
// this represents the checkbox that was checked
// do something with it
});
いくつかの有用な答えがありますが、すべてのlatestオプションをカバーするものはありません。そのため、私のすべての例は、一致するlabel
要素の存在に対応し、チェックボックスを動的に追加して、サイドパネルに結果を表示することもできます(console.log
をリダイレクトすることにより)。
click
のcheckboxes
イベントをリッスンすることはnotです。これは、キーボードの切り替えや、一致するlabel
要素がクリックされた場所での変更を許可しないためです。常にchange
イベントをリッスンします。
:checkbox
ではなく、jQuery input[type=checkbox]
擬似セレクターを使用します。 :checkbox
は短く、読みやすくなっています。
JQuery :checked
擬似セレクターでis()
を使用して、チェックボックスがチェックされているかどうかをテストします。これは、すべてのブラウザーで機能することが保証されています。
$('#myform :checkbox').change(function () {
if ($(this).is(':checked')) {
console.log($(this).val() + ' is now checked');
} else {
console.log($(this).val() + ' is now unchecked');
}
});
JSFiddle:http://jsfiddle.net/TrueBlueAussie/u8bcggfL/2/
:checkbox
セレクターを使用します。これはinput[type=checkbox]
を使用するよりも望ましい方法です委任されたイベントハンドラは、要素がまだ存在しない(動的にロードまたは作成される)状況のために設計されており、very便利です。祖先要素に対するデリゲート責任(そのため用語)。
$('#myform').on('change', ':checkbox', function () {
if ($(this).is(':checked')) {
console.log($(this).val() + ' is now checked');
} else {
console.log($(this).val() + ' is now unchecked');
}
});
JSFiddle:http://jsfiddle.net/TrueBlueAussie/u8bcggfL/4/
change
)をリッスンして、変化しない祖先要素(この場合は#myform
)にバブルアップすることで機能します。':checkbox'
)をエレメントバブルチェーンのみに適用します。document
をデフォルトとして使用して、委任されたイベントハンドラを接続します。body
を使用して委任されたイベントをアタッチしないでください。マウスイベントの取得を停止する可能性があるバグ(スタイリングに関連する)があります。委任されたハンドラーの結果は、一致する要素が存在する必要があるのはat time timeだけであり、イベントハンドラーが登録されたときではないということです。これにより、動的に追加されたコンテンツがイベントを生成できます。
Q:遅いですか?
A:イベントがユーザー相互作用の速度である限り、速度の無視できるの違いを心配する必要はありません。委任されたイベントハンドラーと直接接続されたハンドラーの間。委任の利点は、小さな欠点をはるかに上回ります。委任されたイベントハンドラーは通常、単一の一致する要素に接続するため、実際には登録する方が速いです。
prop('checked', true)
がchange
イベントを発生させないのはなぜですか?これは実際には設計によるものです。イベントが発生した場合、無限の更新の状況に簡単に陥ります。代わりに、checkedプロパティを変更した後、trigger
(triggerHandler
ではなく)を使用して、変更イベントを同じ要素に送信します。
例えばtrigger
なしでイベントは発生しません
$cb.prop('checked', !$cb.prop('checked'));
JSFiddle:http://jsfiddle.net/TrueBlueAussie/u8bcggfL/5/
例えばtrigger
を使用すると、通常の変更イベントがキャッチされます
$cb.prop('checked', !$cb.prop('checked')).trigger('change');
JSFiddle:http://jsfiddle.net/TrueBlueAussie/u8bcggfL/6/
注:
triggerHandler
を使用しないでください。JSFiddle:http://jsfiddle.net/TrueBlueAussie/u8bcggfL/8/
willは、イベントハンドラー直接接続されたに対して機能しますが:
JSFiddle:http://jsfiddle.net/TrueBlueAussie/u8bcggfL/9/
.triggerHandler()でトリガーされたイベントは、DOM階層をバブルアップしません。ターゲット要素によって直接処理されない場合、何も実行されません。
リファレンス: http://api.jquery.com/triggerhandler/
これでカバーされないと思われる追加機能がある場合は、追加を提案してください。
JQuery(1.7)で新しい「on」メソッドを使用: http://api.jquery.com/on/
$('#myform').on('change', 'input[type=checkbox]', function(e) {
console.log(this.name+' '+this.value+' '+this.checked);
});
$('#myform input:checkbox').click(
function(e){
alert($(this).is(':checked'))
}
)
質問者が具体的にjQueryを要求し、選択された答えが正しいという事実を認めると、この問題は実際にはneedjQueryごとではないことに注意する必要があります。この問題を解決せずに解決したい場合は、追加機能を追加するチェックボックスのonClick
属性を次のように設定するだけです。
HTML:
<form id="myform">
<input type="checkbox" name="check1" value="check1" onClick="cbChanged(this);">
<input type="checkbox" name="check2" value="check2" onClick="cbChanged(this);">
</form>
javascript:
function cbChanged(checkboxElem) {
if (checkboxElem.checked) {
// Do something special
} else {
// Do something else
}
}
私は最初の答えからコードを試してみましたが、機能していませんが、私は遊んでいて、この仕事は私のために
$('#vip').change(function(){
if ($(this).is(':checked')) {
alert('checked');
} else {
alert('uncheck');
}
});