今回は、jQuery関連で気づいた、ちょっとしたことをいくつか書き連ねてみます。
空のjQueryオブジェクト
意図的に
$()
なんて書くことはないと思いますが、セレクタで検索してみたら実はなかったとか、セレクタのスペルミスとかで、容易に空のjQueryオブジェクトが発生してしまいます。とはいえ、中身が空でもjQueryオブジェクトではあるので、メソッドは普通に呼び出せます。そして内部では、$.each
を使うなど、要素のlengthだけ回すようになっていますので、空であれば何も実行されないだけでエラーも起こさずに動きます。一方、DOMを直接使った場合、例えば
document.getElementById()
で存在しないIDを指定した場合にはnull
を返しますので、メソッドを呼ぼうとすればエラーになります。jQuery関数の引数
jQuery()
、あるいは略して$()
の引数としては、いろいろなものを与えられます(公式ドキュメント)。- null、undefined(省略した場合も含む)、空文字列、false、0、NaN
- 空のjQueryオブジェクトを作成します。
- 文字列
- 先頭が
<
ならHTMLとしてパースしたものをjQueryオブジェクトに変換し、それ以外ならセレクタとして検索した結果をjQueryオブジェクトとします。 - DOMオブジェクト、またはその配列
- 引数をjQueryオブジェクトに変換します。
- jQueryオブジェクト
- 同じ要素を指すjQueryオブジェクトを作成します。
- 関数
- その関数をreadyイベントに登録します。なお、返り値は
$(document)
なので、(実用性はともかく)さらにメソッドチェーンにすることもできます。 - その他の引数
- jQueryで引数をラップします。dataやイベント系の関数を使えるようですが、使い道がピンときません。
class属性を操作
jQueryには、クラス操作のために
addClass
、removeClass
、toggle
などの関数が備わっていますが、状況によってはこれらの関数を使わずに、直接class属性を変更するように動かすこともできます。例えば、「ある要素を、以前の状態にかかわらず特定のクラスにしたい」ということであれば、
$(要素).attr('class','指定したいクラス')
とできますし、クラスを全て削除したいのであればremoveAttrを使えます(実は、removeClass
を引数なしで呼ぶと全クラスが削除されるのですが)。これが本当のメソッドチェーン
JavaScriptでは、
foo.bar
とfoo['bar']
は同じものです。これを利用すれば、よりチェーンに見えるようなメソッドチェーンを行うことができます。もっとも、(動的にメソッドを切り替えられる点を除けば)そう役には立たないと思いますが。
//普通の書き方
$("#foo").attr('bar','baz').addClass('hoge').appendTo('body');
//よりチェーンっぽく
$("#foo")['attr']('bar','baz')['addClass']('hoge')['appendTo']('body');