読者です 読者をやめる 読者になる 読者になる

jQueryMobileを使ったチェックボックスの値をJavaScriptで操作するときの覚え書き

Mobile Safari上でjQueryMobileを使って

<fieldset data-role="controlgroup">
  <input type="checkbox" id="chk1" name="chk1" value="" class="custom" />
  <label for="chk1">checkbox1</label>
  <input type="checkbox" id="chk2" name="chk2" value="" class="custom" />
  <label for="chk2">checkbox2</label>
</fieldset>

のようなhtmlがあるとき、片方のチェックボックスがチェックされたら、もう片方のチェックボックスを未チェック状態にしたいとします。
普通だと、

$("input:checkbox").change(function() {
    var radio_name = $(this).attr('name');
    //どっちかにチェック入れると,どっちかのチェックを外す
    if( radio_name === "chk1" ) {
        $('#chk2').attr('checked', false);
    } else if ( radio_name == "chk2" ) {
        $('#chk1').attr('checked', false);
    }
});

のようなコードでOKなのですが、jQueryMobileの場合、タッチパネルに最適化するために、input要素の上にlabel要素を重ねた状態にしています。
そのため、上記のようなコードでは、チェックボックスのchecked属性の値は変わっても、見た目が変わりません。
よくよくマニュアル( http://jquerymobile.com/demos/1.0a4.1/#docs/forms/forms-checkboxes.html )を読むと以下のようにrefreshメソッドを呼んであげないといけないことが分かりました。

$("input:checkbox").change(function() {
    var radio_name = $(this).attr('name');
    //どっちかにチェック入れると,どっちかのチェックを外す
    if( radio_name === "calendar_check" ) {
        $('#chk2').attr('checked', false).checkboxradio('refresh');
    } else if ( radio_name == "map_check" ) {
        $('#chk1').attr('checked', false).checkboxradio('refresh');
    }
});

jQueryMobileのrefreshメソッドを眺めてみると、

refresh: function( ){
		var input = this.element,
			label = this.label,
			icon = label.find( ".ui-icon" );

		if ( input[0].checked ) {
			label.addClass( $.mobile.activeBtnClass );
			icon.addClass( this.checkedicon ).removeClass( this.uncheckedicon );

		} else {
			label.removeClass( $.mobile.activeBtnClass );
			icon.removeClass( this.checkedicon ).addClass( this.uncheckedicon );
		}

		if( input.is( ":disabled" ) ){
			this.disable();
		}
		else {
			this.enable();
		}
	}

のような感じになっていて、label要素やicon含みでスタイルの変更を行っていました。
なるほど〜。