jQuery、チェックボックス、.is(“:checked”)


88

関数を次のようなチェックボックス要素にバインドすると:

$("#myCheckbox").click( function() {
    alert($(this).is(":checked"));
});

チェックボックスは、イベントがトリガーされる前にチェックされた属性を変更します。これは通常の動作であり、逆の結果になります。

しかし、私がするとき:

$("#myCheckbox").click();

チェックボックスは、イベントがトリガーされた後に、checked属性を変更します。

私の質問は、通常のクリックのようにjQueryからクリックイベントをトリガーする方法はありますか(最初のシナリオ)?

PS:私はすでに試しましたtrigger('click');


5
これを確認しました。あなたは完全に正しいです。それはないようで、それはバグかもしれませんように。私はそれをjQueryのバグとして挙げ、何が起こるかを確認しますdev.jquery.com
cletus

1
「変更」イベントはどうですか?
ZippyV 2010

@cletus確かに、これはJquery 1.4.2のバグです。1.3.2は問題なく動作します。
ベン

1.4.2と1.3.2の両方で同じ動作が見られます。jsfiddle.net
Nick Craver

@Nickは通常のマウスクリックとは逆の動作をします。正直なところ、なぜ1.3.2が機能し、1.4.2が機能しないのかわかりませんが、それでも変更する必要があります。
ベン

回答:


97
$('#myCheckbox').change(function () {
    if ($(this).prop("checked")) {
        // checked
        return;
    }
    // not checked
});

注:古いバージョンのjqueryでは、を使用しても問題ありませんでしたattr。状態の読み取りに使用propすることをお勧めします


1
私はそれを試しました、「$(#myCheckbox).click()」はボックスのチェックを外し/チェックしますが、変更機能はトリガーされません。また、click()を呼び出す代わりに「checked」属性を変更して、「change」関数を「live」に設定してみました。
ベン、

@ベン-これを実行するには、別の方法でトリガーする必要があります。トリガーステートメントの私の回答を参照してください。
Nick Craver

@Nickありがとう。解決策を最初に発表したのはtcurdtの回答です。ばかげた私は '変更'メソッドをトリガーしませんでした。
ベン

19
また、jqueryの新しいバージョンでは、他の誰かを捕まえる場合に備えて、関数はattr( "checked")ではなくprop( "checked")です。
danski 2013

特に下位互換性がないため、「prop」は避けます。IEで。
vapcguy 2015年

27

jQuery 1.3.2および1.4.2で機能する回避策があります。

$("#myCheckbox").change( function() {
    alert($(this).is(":checked"));
});

//Trigger by:
$("#myCheckbox").trigger('click').trigger('change');​​​​​​​​​​​​​

しかし、私は同意します。この動作は、ネイティブイベントと比較するとバグが多いようです。


10

2016年6月現在(jquery 2.1.4を使用)、他の提案されたソリューションはどれも機能しません。チェックはattr('checked')常に戻りundefinedis('checked)常に戻りますfalse

propメソッドを使用するだけです。

$("#checkbox").change(function(e) {

  if ($(this).prop('checked')){
    console.log('checked');
  }
});

2
is('checked)「checked」はCSS擬似セレクタではないため、falseを返します。is(':checked')代わりに ":checked"を探すようにしてください。
dhaupin 2017

4

私はまだjQuery 1.7.2でこの動作を経験しています。簡単な回避策は、setTimeoutを使用してクリックハンドラの実行を延期し、その間にブラウザに魔法をかけさせることです。

$("#myCheckbox").click( function() {
    var that = this;
    setTimeout(function(){
        alert($(that).is(":checked"));
    });
});

うん!少し話題外ですが、デフォルトで「アクティブ」にしたい場合、誰かが「新しいレコードを追加」をクリックしたときにチェックボックス付きの剣道グリッドで同じことをしなければなりませんでした。私もそれに500msの時間を与えなければなりませんでした。それから私は追加する必要がありました.click()、そして、設定し.attr('value', 'true')、そして.change()、それから.blur()....私はプログラム的に「更新」ボタンをクリックしたときに、それがプログラムのボックスを設定します前に
vapcguy

2

このやや望ましくない動作が予想される場合は、jQuery.trigger()からチェックボックスのクリックハンドラーに追加のパラメーターを渡すことで回避できます。この追加のパラメーターは、ユーザーがチェックボックス自体を直接クリックするのではなく、クリックがプログラムによってトリガーされたことをクリックハンドラーに通知するためのものです。チェックボックスのクリックハンドラーは、報告されたチェックステータスを反転できます。

これが、ID "myCheckBox"のチェックボックスでクリックイベントをトリガーする方法です。また、trueに設定されている単一のメンバーnonUIを使用してオブジェクトパラメーターを渡していることに注意してください。

$("#myCheckbox").trigger('click', {nonUI : true})

チェックボックスのクリックイベントハンドラーでこれを処理する方法を次に示します。ハンドラー関数は、2番目のパラメーターとして非UIオブジェクトの存在を確認します。(最初のパラメーターは常にイベント自体です。)パラメーターが存在し、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);
    });

JSFiddleバージョン(http://jsfiddle.net/BrownieBoy/h5mDZ/)

私はChrome、Firefox、IE 8でテストしました。


2
<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");
}
});

いくつかのコメントはいいでしょう
Danil Gaponov



0

さて、最初のシナリオに合わせるために、これは私が思いついたものです。

http://jsbin.com/uwupa/edit

基本的に、「クリック」イベントをバインドする代わりに、「変更」イベントをアラートにバインドします。

次に、イベントをトリガーするとき、最初にクリックをトリガーし、次に変更をトリガーします。


0

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いません。


0
$( "#checkbox" ).change(function() {
    if($(this).is(":checked")){
        alert('hi');
    }

});

1
親切にいくつかの詳細に言及してください
CodeWarrior

これはchange、OPの代わりにを使用して繰り返される回答のようであり、をテストする別の方法としてステートメントをclick使用するだけのifようです:checked
vapcguy 2015年

-1

最も速くて簡単な方法

$('#myCheckbox').change(function(){
    alert(this.checked);
});

$el[0].checked;

$ el-選択のjquery要素です。

楽しい!


-2
if ($.browser.msie) {
    $("#myCheckbox").click(function() { $(this).trigger('change'); });
}

$("#myCheckbox").change(function() {
        alert($(this).is(":checked"));
    });
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.