最初に
-
attr
とprop
の使い分けがわからないと言われたので、誰でも使い分けができるようになる一覧を作りました。 -
基本的にはpropで取得できるものは
prop
で、そうじゃないものはattr
で、と思っていたのですが、data-*
やvalue
までそれで取得していたので、思ったよりもが根が深いなと思った次第です。
#(追記)data属性に対する扱いについて
data-*
属性には、用途が2種類あります。
- HTML5としてのカスタム属性(とそれを利用した関連技術)
- jQueryの
data()
メソッドのための初期値
前者はそれを利用した有名どころではBootstrap(TwitterBootstrap)がなどがありますが、
CSSの属性セレクタとしても使えるので、別にBootstrapに限った話ではなく、普通に使用している人もいるかと思います。
問題は後者の方で、ここで「初期値」と書いたり、追記前の記事で「取得しようとしているのは」と前置きしたことの理由にもなるのですが、data()
ではgetでattribute
から読みだすことはできても、setでattribute
に対して変更することはできません。また、attribute
から読みだすのも最初の1回のみです。
そのため、data-*
だからと言って何でもかんでもdata()
で読みだしていると、動的な変更に追従できず、また、getができるんだからsetもdata()
でいいんだな、と思うと、HTML5としてのカスタム属性の動作に期待している場合は、期待通りの動作になりません。
判断一覧
取得しようとしているのはdata-*
ではありませんか?
それはHTMLのカスタム属性として使用している属性ですか?
-
attr()
を使用してください。getもsetもです。 - 参照専用であればgetだけ
data()
を使うこともできますが、止めた方が良いです。なぜなら必要なのはattributeだからです。
それはHTMLのカスタム属性として使用してない属性ですか?
-
data()
を使用してください。
取得しようとしているのはclass
ではありませんか?
-
hasClass()
で事足りませんか? - その後やりたいことによっては
add/removeClass()
の方が適しているかもしれません。
特定クラス名がセットされているか、ではなく、クラス名そのものが欲しい場合は?
- そんな文字列を
class
で賄おうとするその思考を考え直してください。 -
data-xxx
で別属性として定義してください。
取得しようとしているのはvalueではありませんか?
-
val()
を使用してください。
textareaに入力された値が必要ですか?
- その場合も
val()
を使用してください。 - タグの中だからって
text()
やhtml()
を使う必要はありません。
checkboxやradiobuttonがチェックされているかどうかを知りたいですか?
-
prop('checked')
を使ってください。attr()
で"checked"
と比較するのはギルティーです。
checkboxやradiobuttonをチェックしたいor外したいですか?
-
prop('checked', true|false)
を使ってください。attr()
や、ましてやremoveAttr()
などは論外です。
disabledかどうかを知りたいですか?
-
prop('disabled')
を使ってください。attr()
で"disabled"
と比較するのはギルティーです。
disabledにしたいor外したいですか?
-
prop('disabled', true|false)
を使ってください。attr()
や、ましてやremoveAttr()
などは論外です。
aタグにおけるhrefや、imgにおけるsrc等のアドレスのパスについて、
絶対パスが必要ですか?
-
prop()
を使ってください。
相対パスが必要ですか?
-
attr()
を使ってください。 - ただし、htmlに絶対パスとして記述されている場合は絶対パスになります。
上記以外の属性を取得したい
それはHTML標準の属性ですか?
-
prop()
を使ってください。
それはHTML標準ではない、勝手に命名した属性ですか?
attr()
を使ってください。-
data-xxxx
とした上で、data()
を使ってください。
そもそも
なんで、attr
でproperties
を操作するサンプルコードが巷にあふれているかというと、昔はできたというか、昔はattr
しか無かった(propメソッド
が存在しなかった)んじゃよ、と思うjqueryおじさんであった。
昔々...
prop
が実装されたのは1.6
からで、それまではattribute
とproperties
はjquery上で明確に分かれてはいませんでした。
そのため、当時は皆properties
を操作するためにもattr
を使っていたのですが、やはり分けないとまずかろうということで、1.6.0
リリースによって、prop
が実装され、attribute
とproperties
は明確に区別されるようになりました。ところが、attr
でproperties
をどうのこうのしていた(するしかなかった)巷にあふれる大半のソースは最新のjqueryでは正しく動作しなくなり大きな混乱を招いた結果、後方互換を持った1.6.1
がリリースされ、それからしばらくはattr
でdisabled
等の設定を変更できました。
完全にできなくなったのは1.9
からでした。
そのため、1.9より以前に書かれた説明ではattr
でproperties
を操作しているコードがあります。
それは当時では間違いではなかった、という話です。
乱暴な話、view(html)を自前で用意するのであれば、今ではattr
を使わなければいけない個所は1つもないはずです。