第5回は、内部的に利用するメソッドやjQueryオブジェクト直下に定義されたプロパティ、TraversingやManipultation用のメソッドについての部分になります。
trim()
trimメソッドは、文字列の先頭および末尾にある空白を取り除いて返します。
makeArray()
makeArrayメソッドは、クリーンなarrayオブジェクトに変換します。引数がarrayオブジェクトでなければ、forループで配列にpushしていきます。arrayオブジェクトであれば、sliceした結果を返します。
inArray()
inArrayメソッドは、引数arrayの中に引数elemが見つかればその位置を返します。みつからなければ-1を返します。
merge()
mergeメソッドは、引数で指定されたfirst配列にsecond配列を追加して返します。Internet Explorerの場合は、コメントノード(nodeType=8)も返してしまうため、それを除外しています。
また、わざわざforループでpushしているのは、後で値を変更したときに実態を上書きしてしまうのを防ぐためです。
unique()
uniqueメソッドは、配列から重複した要素を取り除いて返します。1143行目のjQuery.data()は、642行目で説明した要素のユニークなIDを返すメソッドで、要素の重複チェックに利用されます。done配列のキーにそのIDがみつからなければ、ret配列にその値をプッシュします。
もし、何かしらのエラーが発生したら、引数arrayをそのまま返します。
grep()
grepメソッドは、引数elemsに対してcallback関数を実行して、フィルタリングした結果を返します。1161行目では、もしcallback関数にstring型が渡された場合は、その名前の関数を実行するようにcallbackを定義し直しています。
1168行目からは、各要素に対してcallback関数を適用し、trueが返ってきた要素のみをret配列にpushして返します。ただし、第3引数のinvがtrueの場合には判定条件が逆になり、falseが返ってきた要素で構成された配列を返すことになります。
map()
mapメソッドは、引数elemの各要素にcallback関数を適用した配列を返します。1181行目で関数を適用し、結果がnullまたはundefinedでなければ、配列を結合して返します。また、1187行目にあるようにarray.concat()を用いているので、callback関数の結果が配列であっても配列オブジェクトではなく、それぞれの値が戻り値の配列に追加されます。
jQuery.browser
jQuery.browserには、ブラウザーの種類およびバージョンが設定されます。navigator.userAgent文字列に"webkit"が含まれていれば「Safari」、"opera"が含まれていれば「Opera」、"msie"が含まれていれば「Internet Explorer」、"mozilla"が含まれていて"compatible","webkit"という文字列がなければ「mozilla」になります。また同時にバージョンの値もjQuery.browser.versionに設定されます。
1206行目は、float値へのアクセスがIEで異なるための対応です。
jQuery.boxModel, jQuery.props
1212行目のjQuery.boxModelには、現在のページがW3CのCSSボックスモデルを使用してレンダリングされているかどうかが設定されます。IE以外かもしくは標準モードの場合にTrueになります。
1214行目からのpropsは、HTML属性/CSSプロパティにJavaScriptからDOMでアクセスをするための設定です。
Traversing用メソッド
1235行目からは、Traversingのためのメソッドを定義しています。使い勝手を向上するためにTraversing用メソッドのバリエーションを最小限の手間で増やしています。jQuery.each()の第1引数として、新メソッド名と実際に行われる関数のペアを定義して、それぞれの要素に対してjQuery.map()を使って内部的に別の関数を実行しています。
Manipulation用メソッド
1258行目からも、先ほどのTraversing用メソッドの定義と同様にManipulationのためのメソッドを定義しています。これは、jQueryの特徴のひとつでもありますが、appendとappendToのように対象となる要素が異なるだけで内部処理的には変わらないメソッドを再定義しています。ライブラリを使う側からすると、処理が短いコード記述できるようになるため使い勝手が向上します。
appendToを例にとって説明すると、引数argsのそれぞれの要素に対してoriginalのappendメソッドを自身を引数として実行するようなメソッドを定義しています。
Attributes用メソッド
1275行目からは、HTML/CSS属性を操作するためのメソッドです。こちらもjQuery.fnに対してremoveAttrやaddClassといったメソッドを定義しています。
height(), width()
1320行目からは、選択された要素のWidthおよびHeightを取得または設定するためのクラスです。こちらも["Height", "Width"]の配列に対してjQuery.each()を使って同様の関数定義を行うことで、同じような関数を二度定義する無駄をなくしています。
1326~1341行目は、対象がwindowオブジェクトの場合の処理で、windowの高さまたは幅を取得します。ブラウザの種類や標準モードか互換モードかによって返される値が異なるので、その違いを吸収しています。
1344行目からは、対象がwindowオブジェクト以外の場合の処理で、引数sizeが指定されていればcss()を使って大きさを設定します。
セレクタ定義
1353行目から1355行目は、Safariの少し古いバージョン(1.3)を使っていると、Safariが異常終了する問題があって、その対策を行っています。
1356行目からは、セレクタ式の正規表現です。後で利用するために"> foo"と"foo#id"と"#id"または".class"形式の正規表現オブジェクトを生成しておきます。