
連載:Ajaxで作るインタラクティブWebアプリケーション
(1)
Ajaxフォトアルバムのフェードイン画像フレームを作ろう
田中 孝太郎
dotimpac.to
2005/11/11
| 目次 ページ内の項目をクリックするとスクロールします。 ページ内リンクでスムーススクロール@ZEROBASE CASTを使用しています |
| Ajaxで作るインタラクティブWebアプリケーション JavaScriptライブラリによるAjaxフレームワーク Hello Ajax! フェードイン表示される画像フレームをつくる |
| Hello Ajax! フェードイン表示される画像フレームを作る |
- - PR -
さてここから、実際にAjaxアプリケーションの制作に入っていきたい。まず今回は、フォトアルバムで画像を表示する際のフレームとなる部品を作る。サンプルを見てみよう。
リンクをクリックすると、まず写真風のフレームがフェードインで表示され、画像自体はロードが完了してからフェードインする。このサンプルではXMLHTTPRequestを使っていないが、イベントやローディングをJavaScriptで制御しながら、ユーザーにはそれを感じさせないなめらかなインターフェイスを与えるこのようなアプローチは、まさにAjaxの発想だ。
| 画面3 サンプル(WindowsIE6、Firefox1.0、Safari1.3.1で動作確認済) |
| ライブラリをダウンロードする |
今回のサンプルを試してみるために、まずはPrototypeとscript.aculo.usのソースをダウンロードする必要がある。現在Prototypeは1.3.1、script.aculo.usは1.0が正式リリースされているが、本連載では開発バージョンであるPrototype 1.4.0、script.aculo.us 1.5を使用したい。script.aculo.us 1.5で、より実用的な機能がサポートされているためだ。これらをダウンロードしてみよう(2005年11月7日現在、script.aculo.us 1.5はRC版がリリースされている)。
・Prototypeをダウンロード
(※scriptaculous-js-1.5_rc4.tar.gzに同梱されるものを使用してもよい)
- Prototypeサイトhttp://prototype.conio.net/に移動
- darcs repositoryから pkg/prototype-1.4.0_pre11.tar.gzをダウンロードして保存
- アーカイブを展開し、distディレクトリの「prototype.js」を使用する
- script.aculo.usサイトhttp://script.aculo.us/に移動
- downloadsページからscriptaculous-js-1.5_rc4.tar.gzをダウンロード
- アーカイブを展開し、srcディレクトリのjsファイルを使用する
script.aculo.usのソースは機能別に分割されており、「scriptaculous.js」をスクリプトタグで指定することですべてのソースが読み込まれるようになっている。使う機能のソースのみを個別に指定してもかまわない。
| Prototypeのクラススタイル文法 |
ではソースを解説していこう。なおポイントを絞るためJavaScriptの基本的な書式やDHTMLについての解説は省略している。
このサンプルのソースは、以下のようなファイル構成となっている。
・photoframe.html
ベースのWebページ、スクリプトのインクルード、フレームのテンプレートを記述
・jsディレクトリ
prototype.js
scriptaculous.jsおよびscript.aculo.usソース
photoframe.js
フォトフレームのスクリプト
・imagesディレクトリ
spinner.gif
処理中状態を示すスピナーのanimeted-gifファイル
PhotoFrame = Class.create(); |
これは、Prototypeのフレームワークに従った「クラススタイル」の記述である。JavaScriptはプロトタイプベースの言語と呼ばれ、C++やJavaのような厳密なクラスの概念がないが、PrototypeではJavaScriptでクラス風のコーディングができるような機能を用意している。上記部分はJavaScript独特の文法ではあるものの、PhotoFrameというクラスに、コンストラクタである“initialize”と、“showImage”“setSize”というメソッドをそれぞれ定義していることが分かるだろう。このクラスをphotoframe.htmlのリンクタグのonclickにあるように、
new Photoframe(...); |
と呼び出すことができる。疑似的にクラスベースOO言語的なコーディングができるわけだ。JavaScriptでの開発に慣れない読者でも、クラスベースの文法を参考にすれば、さほど違和感なくプログラミングできるのではないだろうか。
| DOM操作とフェードインエフェクト |
photoframe.jsの15〜19行目を見ていく。
var template = $('PhotoFrameTemplate').innerHTML |
この部分では、写真のフレームと影、画像タグからなるHTMLをページに追加して表示を行っている。フレームのHTMLはphotoframe.htmlにテンプレートとして非表示で埋め込んであるものをコピーしている。createElementでDOM要素を生成していくような方法もあるが、記述が冗長で分かりにくくなり、後から変更する場合も煩雑になるため、構造が動的に変化しない要素はこのような方法でテンプレートをページに埋め込んでおく手法が有効だ。
ところどころで見られる「$('...')」というコードは、Prototypeが提供する関数("$"という名前の関数が定義されている)で、ここではdocument.getElementById('...')を意味する。つまり上記のコードは、id「PhotoFrameTmplate」要素の中身からコピーしたHTMLを、識別子を置換して名前を設定する処理を行い、Prototypeの関数「Insertion.After」でid 「framePointer」要素の後ろに追加していることになる。
「new Effect.Appear(...)」はscript.aculo.usによる要素のフェードインエフェクトの指定だ。ここではid「this.id」の要素(直前に追加した写真フレーム部分)を、不透明度0の状態から0.5秒でフェードインする、という指定になっている。このようにscript.aculo.usのエフェクトの多くは、対象要素のidと、エフェクトに指定するオプションをキーワードと数値や関数を関連付けたオブジェクトで渡す仕様になっている。ここでは使用していないが、オプション「afterFinish」にコールバック関数を渡すことで、フェードイン完了後に後処理を行うようなことも可能だ。詳しくはscript.aculo.usのリファレンスを参照してほしい。
・Effect.Appearリファレンス
http://wiki.script.aculo.us/scriptaculous/show/Effect.Appear
| イベントの登録 |
photoframe.jsの39行目では、画像ロード時のイベントリスナを登録している。
Event.observe(this.loadimg, 'load',
this.showImage.bind(this), false); |
JavaScriptのイベントモデルはWebブラウザごとに実装が異なり、JavaScriptで記述する際に厄介な部分の1つだが、Prototypeで定義されたEventオブジェクトを使用することで、クロスブラウザ性を保持しながらイベント登録が行える。ここではimageオブジェクト(this.loadimg)の「onload(画像ロード完了イベント)」にthis.showImageというメソッドを実行するよう設定しているわけだが、メソッド名を「this.showImage.bind(this)」という形で与えているのに注意したい。これもPrototypeの機能だ。
JavaScriptでは、メソッド内の「this」のスコープはメソッドを呼び出したオブジェクトに設定される仕様になっている。したがって、イベントコールバックにクラスメソッドを渡した場合、メソッドの中の「this」はイベントが発生したオブジェクトに(今回のサンプルならばPhotoFrameオブジェクトではなく、onloadイベントの発生したImageオブジェクトに)設定されてしまうのだ。Prototypeでは、これを避けるために「bind」というメソッドを用意している。イベント登録時に「this.showImage.bind(this)」のように「クラス定義時に使用しているthis(ここではPhotoFrameオブジェクト)」を指定しておくことで、コールバック時のthisが想定どおりの値になる。この機能を使うことで、クラスに定義したメソッドをクラス内からイベントに割り付けるような記述が容易になっている。
このように、Prototypeのフレームワークを使えばオブジェクトの動作に関する記述をクラス定義にまとめることができる。従来JavaScriptのコーディングというと、値はグローバル変数に保持しイベントはタグ内に書き、さらにそれらとは別の場所に関数を書くといった煩雑なスタイルになりがちだったが、クラススタイルの文法で記述することで、部品として再利用が容易になることが分かるだろう。
| ユーザーの操作に対するリアクション |
前述したように、Ajaxアプリケーションではユーザーの行った操作に対して、JavaScriptエンジンが即座にリアクションを返すことが重要である。それがなければ、Ajaxのメリットと呼ばれている点は、むしろユーザーのストレスの原因になってしまう。具体的にはロード中を示すスピナーやプログレスバー、更新されたオブジェクトを示すハイライトなどでユーザーに状態を告知したり、注意を促すようなアクションを盛り込む必要がある。
フォトフレームサンプルでのインタラクションの手法を解説しておく。まずフレームのテンプレートにはあらかじめgifアニメーションで動くスピナーが表示されるようになっていて、ロード中であることを示している。画像がロードされたら画像を表示する際にこのスピナーは非表示にしている。スピナーを非表示に設定するElement.hideもPrototypeの機能だ。
またPhotoFrameが呼び出された際、その画像ファイルがすでに表示されている場合はそのフレームがフラッシュするようにハイライトエフェクトを使っている(いわゆるYellow Fade Technique)。9〜13行目の部分だ。
if($(this.id)) { |
「new Effect.Highlight(...)」はscript.aculo.usのエフェクトである。オプションを指定すればフラッシュする色や持続時間を変更できる。
・Effect.Highlightリファレンス
http://wiki.script.aculo.us/scriptaculous/show/Effect.Highlight
| 3/3 | 次回もお楽しみに |
|
INDEX |
||
| Ajaxフォトアルバムのフェードイン画像フレームを作ろう | ||
| Page1<Ajaxを実感しよう> 最も手軽なインタラクティブアプリ開発環境としてのAjax |
||
| Page2<JavaScriptライブラリによるAjaxフレームワーク>
Piccy: Ajax Photo Album |
||
| Page3<Hello
Ajax! フェードイン表示される画像フレームを作る> ライブラリをダウンロードする/Prototypeのクラススタイル文法/DOM操作とフェードインエフェクト/イベントの管理/ユーザーの操作に対するリアクション |
||
AjaxでつくるインタラクティブWebアプリケーション バックナンバー
- 第1回 Ajaxフォトアルバムのフェードイン画像フレームを作ろう
- 第2回 ズーミングできるWebフォトアルバムウィンドウを作ろう
- 最終回 JSONによるデータ通信でAjaxアルバムを完成させる
AjaxとPHPでリッチクライアント
Ajaxを扱うためのサーバーサイドのPHPライブラリを紹介する。リリースされたライブラリ、AjaxACを活用して好みの検索窓に改造してみよう
Ajax うきうき Watch
Ajaxという流行技術の定義を明確にしながら、Ajaxの動向からうきうきするような面白いもの、確実に押さえておきたいものを厳選してお届けしていく
- 第1回 Webアプリのユーザビリティを改善しまくるAjax
- 第2回 Ajax、それはWeb 2.0へと続く道
- 第3回 どんなに無茶をやっても「それもありかな」なAjax
- 第4回 自動車業界のAjaxを活用したキャンペーンを目撃せよ
- 第5回 “どのブラウザでも動くAjax”を共有財産として育てよう
- 第6回 プロプライエタリ2.0から考えるAjaxの公開/非公開部
- 第7回 メモリリークが小さくなったGoogle Maps APIの新版
- 第8回 “CGUI” 消費者が作り出すUIの時代突入
- 第9回 巨大化するAjaxライブラリをシンプルにする新たな流れ
- 第10回 地図のように年代を移動できるMITのAjax歴史年表
- 第11回 JSONがRFCになり、どんどんこなれるAjaxサービス
- 第12回 サーバが通信を開始できるComet活用Webチャット
- 第13回 オンラインゲームで検索精度を上げるGoogleの巧みさ
- 第14回 IE7とFirefox 2への利用者の大移動は起こるか?
- 第15回 グーグル検索エンジンを特定ジャンル専用に、Co-op
- 第16回 帯域やデバイス領域をフル活用させる“モバイルAjax”
- 第17回 新しい技術を模索するYahoo!、Google、MS
- 第18回 Ajaxの高度な使用例、Yahoo! pipes
- 第19回 Apollo参戦でウィジェット開発者の争奪戦が激化
- 第20回 Twitter登場で注目されるRTコミュニケーションツール
- 第21回 過熱するTwitterブームとMicrosoftのマッシュアップ
- 第22回 iPhoneのAjax戦略、そして今日もWeb APIは増加する
- 第23回 Ajax開発者がヒーローになるとき、それはいま!
- 第24回 携帯電話への拡張を進めるGoogleとWeb隠しコマンド
- 第25回 Ajaxで加速!? エンタープライズ2.0とWebOSの普及
- 第26回 「言葉」を超えた説得力を持つAjaxの存在感と広がり
- 第27回 ゲームから読み解く、俺スクリプト時代の知的な挑戦
- 第28回 マッシュアップ元年が終わり、2008年はどうなる?
- 第29回 Twitterやクラウドへも分岐するAjax/Web APIの道
- 第30回 Ajaxはじめて物語、そしてサーバでも動くJavaScript
- 第31回 新ブラウザ戦争はon fireだがJavaScriptはoffのナゾ
- 第32回 Google App EngineはAjaxへのハードルを下げるか?
- 最終回 Pure JavaScriptの動画再生やRPGも好きでした
| 古くて新しいAjaxの真実を見極める 「Webインターフェイスの新しい手法」「画期的なWebアプリケーションの仕組み」であるとして開発者たちの人気を集めるAjaxとは何なのか、その真実を見極めてみよう 最終更新 2005/8/2
|
||
TechTargetジャパン
- NFCやLTE対応予定のiPhoneと、先行するAndroid (2012/2/9)
iPhoneとAndroid、そしてWindows Phoneという3つのOSの今後を占う。それぞれの通信規格とコンセプトは? - 家電のUIになるブラウザ (2012/2/3)
未来の家電はインターネットに接続でき、ブラウザが内蔵されてくる。家電にブラウザが載ったらどうなるか? 未来のホームネットワークを想像しよう - 「汎用のUI技術」として広がるHTML5 (2012/2/2)
すさまじい勢いで成長しているHTML5を中心としたオープンなWebプラットフォーム。HTML5やAPI、Webブラウザのアップデート情報をお伝えする - ビヨンド・クールジャパン!? (2012/1/27)
コンテンツという文化力と、ものづくりという技術力を掛け合わせる。両方を国内に持ち合わせている国は多くない。チャンスなのだ
|
|
