jQueryを使うには$(セレクタ)
のような書き方がよく出てきますが、このセレクタにもいくつか注意しないといけない点があります。
jQuery独自セレクタ
jQueryはquerySelectorAll
どころかgetElementsByClassName
すらない時代から続いてきたこともあって、Sizzleという独自ライブラリをセレクタの処理に使っています。そして、独自ライブラリということもあって、本来のCSSにないセレクタを拡張しています。
独自セレクタはjQueryのサイトから一覧を確認できますが、以下のようなものがあります。なお、独自セレクタを使うと、
-
querySelectorAll
に任せられないためJavaScriptで処理する必要があり、遅い - jQueryにロックインされる
などデメリットが多いので、ふつうのセレクタで書けるものはそちら優先で書いたほうがいいですし、書けないものでもできるだけ絞り込んでから.filter
を使うなどしたほうがいい、とのことです。
input
の種類
:checkbox
、:radio
など、<input>
の種類ごとにセレクタが用意してありますが、これは標準の属性セレクタでinput[type="radio"]
のように書けます1。
逆向きのセレクタ
:parent
には逆の意味の:empty
が、[attr!=value]
には[attr=value]
が標準でありますので、:not(:empty)
とすれば標準のセレクタで書けます。
数を数える系のセレクタ
:even
、:odd
、:eq
など、jQuery要素を数えてフィルタリングするセレクタがありますが、これらは状況によっては標準セレクタの:nth-child
に置き換え可能です。大きな違いとして、
- 複数の親要素に散らばっている場合、jQueryでは親要素を問わずに順番を数えるのに対して、
:nth-child
は親要素ごとに数える - 数の基準が、jQueryは0オリジンなのに対して、
:nth-child
は1オリジン(なので、偶奇も逆転します)
セレクタで書けないもの
標準セレクタに:checked
がある割に:selected
がないのですが、jQuery拡張としては存在します(<option>
のselected
プロパティを見ていく、という手段しかありません)。あと、:visible
や逆の:hidden
も存在しません(内部実装は、「エレメントのoffsetWidth
、offsetHeight
、getClientRects()
のどれかが値を持つ」という条件で:visible
を判定していました)。
[checked]
と:checked
の違い
これはCSSのセレクタなのでjQueryに限らない話ですが、:checked
、:disabled
、:required
のようなセレクタがあります。[checked]
などでも書け…そうに思えるかもしれませんが、これは意味が違います。[checked]
はHTMLに書かれたchecked
attributeを参照するのに対して、:checked
はエレメントの状態(プロパティ)を参照します。「ページ表示時点でchecked
だった要素」を取りたいという、確固とした意志のある状況でなければ、大半の場合に:checked
のほうが適切かと思います。
jQueryで使えないセレクタ
:invalid
など最近CSSに加わったセレクタは、jQueryに投げ込むとうまく認識されないことがあります。どうしてもjQueryで処理したい場合、$(document.querySelectorAll(':invalid'))
のような形にすれば、とりあえずは通せます。
-
等価なのは
[type="radio"]
ですが、<p type="radio">
のような変な要素を探したいのでなければ、input
を付けておいたほうがわかりやすいのでおすすめです。 ↩