jQuery の配列系のメソッドをメモしとこ
jQuery は機能が豊富なので、しばらく使わないと忘れてしまう。
ここでは、jQuery と配列の関係に絞って目的別に逆引きできるようにしておく。
配列から jQuery オブジェクトを作成
$ 関数に渡せばOK
$([1,2,3])
NodeList のような配列っぽいものを渡しても解釈してくれる。
$(document.getElementsByTagName("div"))
// $("div") と同じ
※内部的には setArray メソッドが呼ばれてるが、外から使うことは稀。
jQuery オブジェクトを配列のように扱う
要素数を取得する
length プロパティを使えばOK。
$("div").length
// document.getElementsByTagName("div").length と同じ
jQuery のメソッドを使って操作する限りは、適切に length が更新されていく。
特定のインデックスの要素を取得
[] か get(index) を使えば、特定のインデックスの DOM 要素を取得できる。
$("div")[0]
$("div").get(0)
// document.getElementsByTagName("div")[0] と同じ
eq を使うと、特定のインデックスの要素のみを含む jQuery オブジェクトが返ってくる。
$("div").eq(0)
// $(document.getElementsByTagName("div")[0]) または
// $("div:first") と同じ
jQuery オブジェクトから配列を作成
jQuery オブジェクトは配列のように扱えるんだけど、Array の全てのメソッドが使えるわけではない。
生の配列を取得するには get() を使う。
$("div").get().reverse()
// div 配列の一覧を逆順にした配列
reverse したあとにさらに jQuery オブジェクトにするには、冒頭に紹介したように、$() に入れる。
$($("div").get().reverse())
get() の内部では $.makeArray(this) が実行されている。
$.makeArray() は配列のようなもの(NodeList や arguments, jQuery オブジェクトなど)を配列に変換するとき便利だ。Array.prototype.slice.call( array_like ) という技もあるんだけど、IE7 でエラーになることがある。
each! map! filter!
中身について処理を行うには each を使う。第一引数がインデックス、第二引数が要素。
$("div").each(function(i, elem){elem.className="foo"+i;})
// 以下のコードと同じ
// var elems = document.getElementsByTagName("div");
// for(var i = 0; i < elems.length; i++)
// elems[i].className = "foo" + i;
this が第二引数にバインドされているので引数なしで this を使って要素にアクセスするとスマート。
$("div").each(function(){this.className = "foo";})
// $("div").attr("className", "foo") と同じ
配列の要素を置き換えるには map が使える。
$("div").map(function(){return this.className;})
// ["", "class1", "class2", ...]
// (クラス名一覧を含む jQuery オブジェクト)
要素を絞り込むには filter が使える。関数を呼び出した結果が true のものだけに絞り込む。select みたいなもん。
$("div").filter(function(){
return this.className == "foo";
})
// $("div.foo") と同じ
第一引数にはインデックス番号が渡る。
$("div").filter(function(i){
return i % 2 == 0;
})
// $("div:even") と同じ
filter には CSS セレクタも使える。
$("div").filter(".foo")
map と filter をした後に end() を呼ぶと、元の jQuery オブジェクトに戻る。
$("div")
.filter(".foo")
.style("display", "none")
.end()
.filter(".bar")
.style("display", "block")
.end()
// 以下の処理と同じ
// $("div.foo").style("display", "none");
// $("div.bar").style("display", "none");
end() は find(), add(), children() などを呼んだあとにも使える。ややこしくなるので使わないんだけど…。