アンケートご協力のお願いgihyo.jpでは,2010年度に向けて豪華プレゼントが当たる読者属性アンケートを実施しております。ご協力ください。

gihyo.jp » DEVELOPER STAGE » 特集 » prototype.jsを読み解く » 第9回 Prototypeライブラリ(2621~2845行目)

prototype.jsを読み解く

第9回 Prototypeライブラリ(2621~2845行目)

Prototype 1.6.0とscript.aculo.us 1.8.0

script.aculo.us 1.8.0がアナウンスされ,Prototypeも1.6.0のタグが打たれたようです。

新機能の部分が枯れるまではまだしばらくは1.5.1.1でいいとは思いますが,Prototypeに依存するライブラリも徐々に1.6.0に移行していくと思われるので,早いうちから慣れておいたほうがよいかもしれません。

では,今回は少なめですが,主にForm関係のクラスたちを見ていきます。

$$() 関数

2621: function $$() {
2622:   return Selector.findChildElements(document, $A(arguments));
2623: }

2621行目からは$$()関数です。

先ほどのSelector.findChildElements()をdocumentトップから検索するようにしたショートカット関数となっています。

Form オブジェクト

2624: var Form = {
2625:   reset: function(form) {
2626:     $(form).reset();
2627:     return form;
2628:   },
2629: 

2624行目からはFormオブジェクトです。reset(), serializeElements()しか定義されていませんが,Element.addMethods()でObject.extend(Form, Form.Methods)されているので,最終的にはForm.Methodsのメソッドも持つことになります。

2625行目からのreset()は,ブラウザ側のHTMLFormElementインターフェイスのreset()を呼んでいるだけです。

2630:   serializeElements: function(elements, getHash) {
2631:     var data = elements.inject({}, function(result, element) {
2632:       if (!element.disabled && element.name) {
2633:         var key = element.name, value = $(element).getValue();
2634:         if (value != null) {
2635:                 if (key in result) {
2636:             if (result[key].constructor != Array) result[key] = [result[key]];
2637:             result[key].push(value);
2638:           }
2639:           else result[key] = value;
2640:         }
2641:       }
2642:       return result;
2643:     });
2644: 
2645:     return getHash ? data : Hash.toQueryString(data);
2646:   }
2647: };
2648: 

2630行目からはserializeElements() です。

渡された要素の配列を,Array.inject({})を使ってループ処理します。そのイテレータ関数内では,disabledプロパティが偽で,nameプロパティがセットされているものだけが対象になっています。また,同じnameを持つ要素が複数出てきた場合は,値を配列として格納するようになっています。

各フォーム要素の値を得るにはgetValue() (定義は Form.Element.Methods.getValue())を用いています。

最後に,getHashフラグが真ならハッシュのまま,そうでなければtoQueryString()して文字列形式で返しています。

Form.Methods オブジェクト

2649: Form.Methods = {
2650:   serialize: function(form, getHash) {
2651:     return Form.serializeElements(Form.getElements(form), getHash);
2652:   },
2653: 

2649行目からはForm.Methodsオブジェクトです。結局FormにObject.extend()するので,なぜわざわざ分割しているのかは不明です。

2650行目からはserialize()です。これは次のgetElements()を使って指定されたフォーム以下の入力要素の一覧を取得し,それを先ほどのForm.serializeElements()に渡しています。

2654:   getElements: function(form) {
2655:     return $A($(form).getElementsByTagName('*')).inject([],
2656:       function(elements, child) {
2657:         if (Form.Element.Serializers[child.tagName.toLowerCase()])
2658:           elements.push(Element.extend(child));
2659:         return elements;
2660:       }
2661:     );
2662:   },
2663: 

2654行目からはgetElements()です。

フォーム要素を渡すと,それ以下でgetElementsByTagName('*')で全タグを取得し,Form.Element.Serializersにシリアライズ用ハンドラが存在するなら対応している要素とみなして返り値用の配列にpush()します。具体的には<input>, <textarea>, <select>に対応しています。

2664:   getInputs: function(form, typeName, name) {
2665:     form = $(form);
2666:     var inputs = form.getElementsByTagName('input');
2667: 
2668:     if (!typeName && !name) return $A(inputs).map(Element.extend);
2669: 
2670:     for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) {
2671:       var input = inputs[i];
2672:       if ((typeName && input.type != typeName) || (name && input.name != name))
2673:         continue;
2674:       matchingInputs.push(Element.extend(input));
2675:     }
2676: 
2677:     return matchingInputs;
2678:   },
2679: 

2664行目からはgetInputs()です。

typeNameに'radio'などと指定して限定したり,さらにnameを指定して絞り込んだりできます。

typeName, nameの両方とも指定されていなければ,指定されているフォーム要素以下の<input>タグすべてを返します。

そうでなければ,取得した<input>タグをループして,typeName, nameの指定に沿ったものを集めてそれだけを返しています。

著者プロフィール

栗山淳(くりやまじゅん)

S2ファクトリー株式会社株式会社イメージソース所属。
本業はWeb制作会社の裏方。得意分野はFreeBSDやPerlのはずだが,必要に迫られるとHTML/CSSやJavaScriptも書く。

コメント

コメントの記入

パスサポ

多数の情報処理技術者試験対策書籍の発行実績を誇る技術評論社がお届けする,資格試験合格サイト「めざせ! 情報処理試験 パスサポ」が開設されました。

ピックアップ

サクセスストーリーに続く,快適サーバー運用管理のヒント!

データの増大,煩雑な管理,システムダウン,セキュリティなど,迫りくる課題からシステム管理者の負担を軽くするポイントを解説します。

gihyo.jp インフラエンジニア情報局

ネットワークやITにかかわるあらゆる業種で必要とされるインフラエンジニアに向けた技術情報や心構え,その魅力について多角的に紹介。

テストエンジニア ステーション

いま,ITに関わるあらゆる開発業務で注目されつつあるテスト系エンジニアをターゲットにしたコンテンツサイトを展開します。

一行クイックアンケート

gihyo.jpで取り上げてほしいネタは?

※検索はページ右上の検索ボックスをご利用ください。

その他の連載

キーパーソンが見るWeb業界

本連載はWeb Site Expert/gihyo.jpとの連動企画です。阿部淳也, 長谷川敦士, 森田雄のお三方による,Web業界をテーマにした座談会です。

きたみりゅうじの聞かせて珍プレー

ソフトウェア開発の現場で体験したトホホな失敗,思わずうなる珍プレーをきたみりゅうじ氏が四コママンガで紹介。みなさんからの投稿もお待ちしてます!

ActionScript 3.0で始めるオブジェクト指向スクリプティング

野中文雄氏が,簡単なスクリプトは書いたことがあるという初級者を対象に,ActionScript 3.0の基本からクラス定義までを解説します。

まだ間に合う「ITパスポート」受験対策 原山先生の短期合格塾

この連載では,4月18日のITパスポート試験の受験に向けて,短い期間で効率良く受験対策を行う方法や,確実に得点するための裏ワザなどを伝授していきます。

Ubuntu Weekly Recipe

Ubuntuの強力なデスクトップ機能を活用するための,いろいろなレシピをお届けします。

C/C++プログラマのためのDTrace入門

よくカーネルのチューニングや解析で活用されるDTraceですが,実はユーザプログラムの開発においても非常に有用です。連載ではC/C++プログラマやテストに関わる方向けにDTraceの使い方を解説します。

Blogopolisから学ぶ計算幾何

計算幾何学は,図形に関するアルゴリズムを研究するコンピュータサイエンスの一分野です。本連載では,ビジュアルブログ検索エンジン「Blogopolis」で採用されている計算幾何のアプローチを例に取り上げながら,計算幾何の初歩を実践的に学習します。

検索エンジンはいかにして動くのか?

本連載では, 今や誰もが利用している検索エンジンの中身を,全体の仕組みやデータ構造,アルゴリズムから分散インデックスまで,最近の研究事例も交えて紹介します。

連載一覧

gihyo.jp

  • DEVELOPER STAGE
  • ADMINISTRATOR STAGE
  • WEB+DESIGN STAGE
  • LIFESTYLE STAGE
  • SCIENCE STAGE
  • NEWS & REPORT

書籍案内

  • 新刊書籍
  • 書籍ジャンル一覧
  • 書籍シリーズ一覧
  • 新刊ピックアップ
  • ロングセラー
  • 電脳会議

定期刊行物一覧

  • Software Design
  • WEB+DB PRESS
  • Web Site Expert
  • 組込みプレス