今回はjQueryオブジェクトに定義されたメソッドの説明が中心となります。前回のようなjQueryの特徴的な部分と違ってアクロバティックな感じではないので、あまり面白くないかもしれません。しかし、jQueryの挙動を深く理解するためには必要な部分ですので淡々と進めて行きたいと思います。
また、説明に入る前に少々捕捉ですが、前回から今回までの間にバージョン1.2.3がリリースされました。Adobe AIRに対応したり、namespace周りの挙動が若干変わったりしていますが、根本的に大きくは変わってはいないようです。本連載では、引き続き1.2.2を前提に説明を進めていきます。
attr()
attrメソッドは、要素の属性を操作します。jQueryのメソッドは、パラメータによって動作が変わるものが多いのですが、このattrメソッドもその一つです。
第1引数nameのみが渡されてそれが文字列の場合(178行目)、別のjQueryメソッドを実行します。どのメソッドを実行するかというと引数typeが指定されていればそのメソッドを実行し、指定されていなければ1020行目のjQuery.attrメソッドを実行します。name,valueのペアで第2引数も指定されていれば、属性値をセットするという動作になります。182行目がその処理でローカル変数optionsに値を格納します。また、attrメソッドにはハッシュを渡すことも可能で、その場合は173行目において格納しておいたoptionsが使用されます。
実際に属性をセットするのは186行目からで、各要素に対してjQuery.attrメソッドを実行します。jQuery.attrメソッドは1020行目で定義されており、詳しくは次回以降に説明します。193行目のjQuer.prop()は、数値が渡された時に単位pxを付加する処理です。
また、引数typeは内部的に使用するもので、CSSの属性値を直接扱うメソッド等で利用されます。
css()
CSSのプロパティを設定するメソッドです。 内部的には先ほどのattrメソッドを呼び出しています。widthまたはheightで負の値を設定しようとした場合は、valueをundefinedとし無視します。
また、202行目にあるように、3番目の引数"curCSS"を指定することによって、css属性を扱う処理になります。
text()
206行目がパラメータが渡された時の処理で、いったん中身を空にしてからテキストノードを設定して返します。
211行目からはパラメータがない場合の処理で、すべての要素からテキストノードを結合して返します。nodeTypeが1(つまりElement)ならば、再帰的にtextメソッドを呼び出してテキストノードを取得します。また、コメント(nodeType=8)は取り除かれます。
wrapAll()
wrapAllメソッドは、1.2から追加された機能で、選択された要素を一纏めに囲って返します。
このメソッドを実行するにはすくなくとも1つ以上の要素が必要なので、224行目にてチェックします。次に囲う方のDOM要素を生成し、これを選択されている要素の直前に挿入し、その一番子要素を探してそこに追加(移動)します。
ここは少し分かりにくいかもしれませんが、何がthisで、jQueryオブジェクトは何を表しているのかが分かれば理解できるかと思います。
wrapInner()
wrapInnerメソッドは、選択された各要素が持つ各子要素をパラメータで指定された要素で囲みます。243行目のeachによって、各々の子要素に対して先ほど説明したwrapAllメソッドを実行します。
wrap()
wrapメソッドは、選択された各要素を引数の要素で囲って返します。249行目のeachメソッドによって、各要素に対して先ほど紹介したwrapAllメソッドを実行しています。
append()
appendメソッドは、選択された各要素の内部にコンテンツを追加します。ここでは、domManipという484行目で定義されているメソッドを使っています。domManipについては後ほど説明しますが、table要素を扱い易くしたり、定義されているscriptを退避したりするための内部処理用の関数です。
257行目の要素のnodeTypeがElementであれば、appendChildメソッドを適用しています。
prepend()
prependメソッドは、選択された各要素の先頭にコンテンツを挿入します。
appendメソッドと同様にdomManipメソッドを使っています。違いは、264行目のinsertBeforeメソッドで、argumentsを最初の子要素の前に挿入します。また、argumentsは複数指定することが可能なので、domManipの第3引数をtrueとすることで、逆順に追加していきます。
before()
beforeメソッドは、選択された要素の前にコンテンツを追加します。
こちらもappendメソッドやprependメソッドと同様です。違いは270行目で、parentNodeに対してinsertBeforeメソッドを適用します。
after()
afterメソッドは、選択された要素の後にコンテンツを追加します。
こちらもappendメソッドやprependメソッドと同様で、違いは276行目のnextSibling(次の兄弟ノード)の前に挿入する点です。
end()
endメソッドは、第1回で説明したようにスタックに格納しておいたprevObjectを返します。なければ空のjQueryオブジェクトを返します。
find()
findメソッドは、選択された要素から条件に合う要素を選択するメソッドです。
実際の処理は、1445行目で定義されているjQuery.findメソッドで行い、スタックに格納しておきます。289行目の条件式は、一部のセレクタ式を指定した場合に重複を取り除くための処理です。
clone()
cloneメソッドは、その名の通り、オブジェクトを複製するメソッドです。
298行目からのコメントにある通り、Internet Explorer(以下、IE)では複製した要素に関連付けられたイベントの扱いが異なります。具体的には、クローン側でイベントの解除を行うと、オリジナル側でもイベントが解除されてしまいます。このため、IEの場合は、containerおよびcontainer2のローカル変数を介してinnerHTMLによってコピーします。
また、319行目ではexpandoの値をNullにセットします。expandoはユニークなIDして使われるため、重複しては問題があるためです。
325行目からは、引数eventがtrueだった場合にイベントを複製するための処理です。nodeTypeが3、つまりTextノードだった場合には何もしません。それ以外の場合に、329行にあるjQuery.dataメソッドによって割り当てられているイベントを取得し、複製したオブジェクトに対してひとつずつイベントを割り当て直します(333行目)。
filter()
filterメソッドは選択要素から、条件にマッチしない要素を削除して返すものです。実際の処理は、他で定義されているgrep(1158行目)とmultiFilter(1432行目)が行っていますので、ここでは動作のみを説明します。
まず、341行目でpushStackメソッドを呼び出して、後で再利用できるようにスタックに格納しています。そして、引数に関数が渡された場合はgrepメソッドによって要素を評価し、trueとなったものだけが返されます。引数にセレクタ式が渡された場合は、multiFilterメソッドを実行した結果を返します。
not()
notメソッドは、要素集合から条件にマッチする要素を取り除きます。
353行目の条件式により、isSimpleつまり単純なセレクタ式(34行目参照)の場合は、自身をスタックに格納してmultiFilterメソッドの結果を返します。
358行目の式により、DOM要素でないArrayとして扱えるオブジェクトの場合には、自身がそのArray内に存在するかどうか、それ以外の場合にはセレクタと一致するかどうかによって削除対象を判定します。
add()
addメソッドは、選択されている要素集合にさらに条件に合う要素集合を追加します。
365行目で、セレクタ式が指定されていなければ、自分自身をそのまま返します。そうでなければ、this.get()した自分自身と新たなセレクタ式をマージして返します。367行目で引数selectorが文字列かどうかを判定しているのは、内部処理用でオブジェクトがそのまま渡される可能性があるためです。
is()
375行目でmultiFilterメソッドを呼び出し、セレクタ式に一致する要素が1つ以上返ってくればtrueとなります。それ以外の場合は、falseを返します。
hasClass()
hasClassメソッドは、選択要素に指定したクラスがひとつでもあればtrueとなります。380行目を見ると分かる通り、is("."+class)と同義です。
val()
valメソッドは、選択された要素のvalue属性を操作します。
まず384行目~426行目の引数が指定されていない場合の処理を見ていきます。要素がselectではない場合は、421行目にあるように最初の要素のvalue値を改行を取り除いて返すだけです。一方、selectの場合は少々複雑です。まず何も選択されていない場合(397行目)は、nullを返します。そして、selectボックスのtypeが単一選択可能(select-one)かどうかで処理が変わってきます。401行目にあるようにselect-oneの場合は、無駄なループ処理が実行されないようになっています。そして、選択されている値をArrayで返します。
次に428行目以降の引数が指定された場合は、要素にvalue属性を設定します。nodeTypeが1以外の場合、つまりElement以外の時は何もしません(429行目)。また、要素がradio,checkbox,select以外の場合はそのままセットします(450行目)。それ以外の場合は、checkedおよびselectedの値を設定します。また、引数のvalueには配列を渡せるようになっていて、複数の値を一度に選択することが可能です。
html()
455行目の条件式により、パラメータが渡されなかった場合はinnerHTMLを返します。渡された場合は459行目にあるように一度内部を空にしてからパラメータを追加して返します。
replaceWith()
replaceWithメソッドは、選択された要素を引数で置き換えます。463行目で直後にvalueを挿入してから元のオブジェクトを削除しています。
eq()
eqメソッドは、選択された要素のi番目を取得して返します。467行目で、スタックに格納するために自身のsliceメソッドを呼び出しています。