09 | 2008/10 |  11

  1. 無料サーバー

search phpbb-phpbb-FC2BLOG-Info-Edit Template-Post-Edit-Upload-LogOut

CSSやJavascript自習の苦闘史を綴っていきたい。恐縮ですがJavascriptを有効にしてご覧ください。
2005年12月から社会問題も掲載!

jQuery() の挙動を解読する(9) jQuery().find()メソッド解読のためのjQuery.map()メソッド解読──jQuery解読(13)

このエントリイでは、jQuery.init()メソッド内の53行で呼び出されるjQuery().find(selector)メソッドを解読する手始めとして、jQuery().find()メソッドの最初に登場するjQuery.map()クラスメソッドの解読を行います。

このエントリイのjQuery.js 1.2.1における対象箇所
225: find: function(t) {
226:  var data = jQuery.map(this, function(a){ return jQuery.find(t,a); });
227:  return this.pushStack( /[^+>] [^+>]/.test( t ) || t.indexOf("..") > -1 ?
228:   jQuery.unique( data ) : data );
229: },
   ・・・・・
987: map: function(elems, fn) { 988:  // If a string is passed in for the function, make a function 989:  // for it (a handy shortcut) 990:  if ( typeof fn == "string" ) 991:   fn = eval("false||function(a){return " + fn + "}"); 992: 993:  var result = []; 994: 995:  // Go through the array, translating each of the items to their 996:  // new value (or values). 997:  for ( var i = 0, el = elems.length; i < el; i++ ) { 998:   var val = fn(elems[i],i); 999: 1000:   if ( val !== null && val != undefined ) { 1001:   if ( val.constructor != Array ) val = [val]; 1002:   result = result.concat( val ); 1003:  } 1004: } 1005: 1006: return result; 1007: }

全く知りませんでしたが、「map」とはプログラミング界では一般的な専門用語のようです。ある関数の引数として別の関数を受け取る関数を「高階関数(higher-order function)」と呼ぶらしい。その結果、ある配列の各要素を対象として順番にそれを操作した結果を返す関数を作ることが出来る、ということらしい。

C言語やPerlなどでは一般的なようですが、Javascriptの場合実装されてないため、each()メソッドと同様に、フレームワークで色々と工夫されている模様です。

cf. こちらに数少ないJavascriptの高階関数の説明があります。
第2回 JavaScriptの関数をマスターしよう − @IT

さてその map 関数ですが、要所は998行の val = fn(elems[i],i); にあると思います。元の関数の第二引数である関数の、その第一引数に、元の関数の第一引数である配列の各要素を渡しています。後はこのvalを元の配列回数分だけ集めて新たな配列としてまとめればよい訳で、まとめ上げられたその配列は、呼出し元の関数の返値となって目的が達せられています。

$.map()の例

まずjQuery.js 1.1.4の解説にあった例題を掲載します。

  • $.map( [0,1,2], function(i){ return i + 4; }); //result [4, 5, 6]
  • $.map( [0,1,2], function(i){ return i > 0 ? i + 1 : null; }); // result [2, 3]
  • $.map( [0,1,2], function(i){ return [ i, i + 1 ]; }); //result [0, 1, 1, 2, 2, 3]

これらの例によって、$.map()を使って、単純に配列要素に加算したり、条件づけて配列要素数さえ増減させたり、自在に加工出来ることがよく分かります。

そこで$.map()の定義を踏まえて独自のサンプルを作ってみます。

$.mapの定義から、引数となる関数には2つの引数(元の配列の各要素とインクリメント値)を渡していますので、jQuery.js1.1.4のサンプルではなかった2つの引数を取る場合を作成してみました。

$().find()において$.map()はどの様に使われているのか

以上を踏まえて本題に戻ります。IEやOperaにおける id 値による DOM 操作時に、同一のname値をもつ要素を拾ってしまった場合の対処として、jQuery().find(a)が起動され、その結果$.map()メソッドがよびだされたのでした。

呼び出されたmapメソッドは具体的には次のようになっています。

つまり、配列 this の各要素に対して、jQuery.find(t,thisの要素) を適用し、その結果の配列を data に代入しています。ここに this は $.map()が jQuery().find()から呼び出されたのですから jQuery() インスタンスの返値である配列になっているはずです。

ところで上の内容を知るためには、次に進まなければなりません。 jQuery.find() メソッドを解明しなければなりません。

--------------------------------------------------------

ということで、次は愈々長大な $.find()メソッドの解読です。

 

■ コメントの投稿 ■

管理者にだけ表示を許可する

●トラックバック●

■トラックバックURLはこちら■
http://hkom.blog1.fc2.com/tb.php/581-68248d8a

●参照元一覧●

<provided Fc2>
<provided i2i>

▲ToTop

 90%近いシェアを握っているインターネットエクスプローラの描画エンジンを利用したタブbrowser。沢山のタブbrowserがあるが、多機能、カスタマイズフリー、スクリプト利用等で一日の長がある。Gekkoエンジンへの対応も行われ、IEからの自立独立の方向に向かっている。2005年7月にはIE7が登場する見通しの中で、今後の発展が望まれる。

 多様なCSS作成支援機能を備えた、タグ入力式 HTML&CSS作成支援エディタ。スキンデザインもすっきりしている。テキストエディター上で作成するよりも確実で安全にタグ打ちが出来る。
文字コードを選べないのが欠点。

 StyleNote同様のタグ入力式 HTML&CSS 作成支援エディタ。長年使用してきたが現在StyleNoteに乗り換えつつある。

 クリップボード履歴情報を活用する為のソフト。画像まで履歴を取ってくれるのが嬉しい。このソフトを使わない日は絶対ない程に重宝し、愛用している。

 起動中のウィンドウの「コピーできない」説明文などの文字列を取得し、コピー可能な文字データにするツール。何かと便利。

 ストリーミングデータを保存することが出来るソフト。動画利用には不可欠なソフトだ。

 無料ながらレイヤー機能を有し、スクリプトによる拡張も可能な、sleipnir作者が提供している優れもの画像編集ソフト。

 画面キャプチャソフトと言えばこれに勝るものなし、ではないだろうか? 様々な取得方法を有しており、ブログ作成にもHomepage作成に不可欠だ。Jtrimと並んでWoodyBellsの作品。

 複数ファイルの同時編集は出来ないが、透過pngも作れる画像編集ソフト。
(以下当該サイトから抜粋)初心者にも簡単に操作が出来るフォトレタッチソフトです。多くの加工機能で画像に様々な効果を与えることができます。非常に軽快に動作するため、ストレスなく操作できます。

 Animation Gifファイルを作れる無料ソフト。

 キャプチャソフト。画面内にサイト全体が表示しきれない場合でも、これを使えば全体をキャプチャすることが出来る。

 画像処理。画像のフォーマット変換のみならず、色数やサイズ、圧縮率の変更まで一括処理できてしまう『BatchGOO!』は、大量の画像をまとめて処理したいときに大変便利なソフト。BMP, TIFF, JPEG, PCX, PNG の相互変換をはじめ、色数・サイズ・解像度の統一、JPEG圧縮率の調節など、ホームページ用の画像や携帯電話用の壁紙を揃えるのに抜群の相性を見せる。(Vectorの当該ソフト紹介頁より抜粋引用)

 名前から直ぐに想像が付くように画像のサイズを測るためのソフトだ。Homepage作成には欠かせない。2カラム、3カラムのレイアウトを行う場合に大変重宝する。

 ランチャーソフトは沢山あるが、中でもこれが一押しだ。2年以上使ってきたがその操作性には毎日満足している。これを使い始めてからデスクトップには一切のアイコンを表示することをやめてしまった。

 AdobeReader7によって、起動時間が長すぎるという長年のユーザーの不満はある程度解消した。そのためこの高速化ソフトは存在価値が低下してしまったかもしれない。AdobeReader6迄はこのソフトによる起動高速化で恩恵を受けてきた。

 IE専用が難点だが、様々なサイト内でIDやパスワードを入力するのに重宝するソフト。コンテキストメニューから簡単に起動できるのがGood! sleipnir等のIEの描画エンジンを利用しているブラウザでも使える。

 利用しているパソコンの諸元値を取得するには、このソフトがベストだ。インストール済みソフトの一覧が取得できるのも嬉しい。

 WMPは機能が豊富なだけ重い。RealPlayerも同様だ。そこでMedia Player Classicを使いたい。動作が軽快なだけではなく、対応しているファイル形式もすこぶる多く、これひとつで、wmvもrmも表示できてしまうのだから凄い! 数多あるMedia Playerの王様と言えるだろう。

 自宅でPCを起動しているときには必ず起動しているメディアプレーヤー。何かと過剰なWinampよりも、起動も速くスキンはシンプルだ。

 DivX, Xvid, Mov, Vob, Mpeg, Mpeg4, avi, wmv, dv, などの動画をDVD-Video形式に変換できるフリーソフト。クリックするとDVD関連ソフト紹介サイト=「DVDなToolたち」なるHomepageが開きます。

200711141758