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() などを呼んだあとにも使える。ややこしくなるので使わないんだけど…。