jQuery でラジオボタンのチェック判定に attr を使用すべきではない

動かしてみるのが一番わかり易いのでサンプルを作ってみた。

このサンプルでは、ラジオボタンの状態を jQuery

  • $("input[name='lang']:checked").val()
  • $("input[name='lang']").filter(":checked").val()
  • $("#ruby").attr("checked")
  • $("#ruby").is(":checked")

の 4 つの方法で取得しているが、attr のみラジオボタンの状態を変更しても取得内容が変わらないことがわかる。

ラジオボタンはしばしばデフォルト選択として checked という属性をタグ内に直接書くことがあるが、attr はまさにこれの有無を取得する。

どうやら checked 属性があるからと言って、そのラジオボタンが選択されているとは限らない、ということのようだ。

また attr("checked", "checked") という方法でラジオボタンのチェックを変更するイディオムもあるが、この方法は他のラジオボタンすべてに対して removeAttr("checked") を行わなければ期待通りに機能しないため、あまりよい方法とは言えない。

設定は $("input[name='lang']").val(["perl"]) のように行うのが確実。