JavaScriptおれおれAdvent Calendar 2013 – 02日目
チェック状態は$checkbox.attr('checked')
ではなく$checkbox.prop('checked')
で得る必要があります。
検証
初期状態で確認すると
c1: attr=undefined prop=false c2: attr=checked prop=true
チェックを入れ替えて確認すると
c1: attr=undefined prop=true c2: attr=checked prop=false
というわけで
.attr()
… 変わらない.prop()
… 変わる(こっちを使う)
仕組み
.attr()
はattribute、つまり(HTMLの)属性を得るメソッドです。HTMLにのタグにchecked
属性を記載したらその値checked
が得られます。していなければ、存在しない属性の値も存在しないのでundefined
になります。
一方.prop()
はproperty、つまり(JavaScriptの)プロパティを得るメソッドです。こちらは状態を正確に反映します。
この違い、こなれてくると感覚的に分かって来ますが。属性は「HTMLに書いた値」、プロパティは「状態を示す値」という事で覚えておいてください。
他にも
checked
がそうなのだからselected
もそうなるのはお分かりでしょうか。
また、やはりフォームですが、value
属性の値を操作するのも$elem.attr('value')
ではなく$elem.val()
を使うようにしてください。HTMLに書いた属性が欲しいのか、現在の画面での状態を操作したいのか、考えてみてください。
あとは、disabled
とかreadonly
とかもね。
詳しくは別記事を
昔詳しく書いたんだけど、まだときどき質問されるので。
- CSSは分かるけどjQueryは苦手……という人が .attr()と .prop()に親しんでくれるといいなーと思って書きました。
- jQuery1.6のattr()で困ったら、1.6.1にすればいいみたい。 (
.attr()
と.prop()
のどちらを使うべきか一覧表があります)
……同じネタで引っ張りすぎですか?