関数を次のようなチェックボックス要素にバインドすると:
$("#myCheckbox").click( function() {
alert($(this).is(":checked"));
});
このチェックボックスは、チェックされた属性を変更しますbeforeイベントがトリガーされます。これは通常の動作であり、逆の結果になります。
しかし、私がするとき:
$("#myCheckbox").click();
チェックボックスは、チェック属性を変更しますafterイベントがトリガーされます。
私の質問は、通常のクリックと同じようにjQueryからクリックイベントをトリガーする方法はありますか(最初のシナリオ)?
PS:私はすでにtrigger('click')
で試しました;
$('#myCheckbox').change(function () {
if ($(this).prop("checked")) {
// checked
return;
}
// not checked
});
注:古いバージョンのjqueryでは、attr
を使用しても問題ありませんでした。 現在、prop
を使用することをお勧めします 状態を読み取ります。
2016年6月現在(jquery 2.1.4を使用)、他の推奨ソリューションはいずれも機能しません。 attr('checked')
をチェックすると常にundefined
が返され、is('checked)
をチェックすると常にfalse
が返されます。
Propメソッドを使用するだけです:
$("#checkbox").change(function(e) {
if ($(this).prop('checked')){
console.log('checked');
}
});
私はまだjQuery 1.7.2でこの動作を経験しています。簡単な回避策は、setTimeoutを使用してクリックハンドラーの実行を延期し、その間にブラウザーに魔法をかけることです。
$("#myCheckbox").click( function() {
var that = this;
setTimeout(function(){
alert($(that).is(":checked"));
});
});
$("#checkbox").change(function(e) {
if ($(this).prop('checked')){
console.log('checked');
}
});
<input id="widget-wpb_widget-3-custom_date" class="mycheck" type="checkbox" value="d/M/y" name="widget-wpb_widget[3][custom_date]" unchecked="true">
var atrib = $('.mycheck').attr("unchecked",true);
$('.mycheck').click(function(){
if ($(this).is(":checked"))
{
$('.mycheck').attr("unchecked",false);
alert("checkbox checked");
}
else
{
$('.mycheck').attr("unchecked",true);
alert("checkbox unchecked");
}
});
このかなり望ましくない動作が予想される場合は、jQuery.trigger()から追加のパラメーターをチェックボックスのクリックハンドラーに渡すことです。この追加のパラメーターは、クリックハンドラーに、ユーザーがチェックボックス自体を直接クリックするのではなく、プログラムでトリガーされたことを通知します。チェックボックスのクリックハンドラーは、報告されたチェックステータスを反転できます。
そこで、IDが「myCheckBox」のチェックボックスでクリックイベントをトリガーする方法を次に示します。また、trueに設定されたnonUIという単一のメンバーを持つオブジェクトパラメーターを渡すことに注意してください。
$("#myCheckbox").trigger('click', {nonUI : true})
そして、チェックボックスのクリックイベントハンドラーでこれを処理する方法を次に示します。ハンドラー関数は、2番目のパラメーターとしてnonUIオブジェクトの存在を確認します。 (最初のパラメーターは常にイベント自体です。)パラメーターが存在し、trueに設定されている場合、報告された.checkedステータスを反転します。そのようなパラメーターが渡されない場合(ユーザーがUIのチェックボックスをクリックするだけではない場合)、実際の.checkedステータスを報告します。
$("#myCheckbox").click(function(e, parameters) {
var nonUI = false;
try {
nonUI = parameters.nonUI;
} catch (e) {}
var checked = nonUI ? !this.checked : this.checked;
alert('Checked = ' + checked);
});
http://jsfiddle.net/BrownieBoy/h5mDZ/ のJSFiddleバージョン
Chrome、Firefox、IE 8でテストしました。
$("#personal").click(function() {
if ($(this).is(":checked")) {
alert('Personal');
/* var validator = $("#register_france").validate();
validator.resetForm(); */
}
}
);
さて、最初のシナリオに合わせて、これは私が思いついたものです。
基本的に、「クリック」イベントをバインドする代わりに、「変更」イベントをアラートにバインドします。
次に、イベントをトリガーすると、まずクリックをトリガーし、次に変更をトリガーします。
Nick Craverの答えに加えて、これがIE 8
で適切に機能するためには、追加のクリックハンドラーをチェックボックスに追加する必要があります。
// needed for IE 8 compatibility
if ($.browser.msie)
$("#myCheckbox").click(function() { $(this).trigger('change'); });
$("#myCheckbox").change( function() {
alert($(this).is(":checked"));
});
//Trigger by:
$("#myCheckbox").trigger('click').trigger('change');
そうしないと、IE 8
がクリックされたときにチェックボックスとラジオにフォーカスを保持するため、コールバックはチェックボックスがフォーカスを失ったときにのみトリガーされます。
ただし、IE 9
でテストしていません。
$( "#checkbox" ).change(function() {
if($(this).is(":checked")){
alert('hi');
}
});