GAE/JでYUI2.7.0+Struts1.3をつかって画像を表示する。
前回のログでは、imgタグのsrc属性に「画像を吐き出すAction」を貼って、画像を表示した。
今回は、久しぶりにYUIを使って、画像表示をしてみる。GAE/JにはGWTが用意されているのだが、それを使わないのは勉強不足のため。
やりたいことは、
前回のログのやり方だと、たくさん画像があったときに(レンダリングに時間がかかって)見栄えが悪いので、適当なタイミングをはかって画像を表示する。
ということ。YUIには、このためのImageLoaderというライブラリーがある。
公式サンプルにある、「Basic Features of the ImageLoader Utility」というサンプルをもとに試してみた。
(考えてみれば、GoogleとYahooの「おかしな」組み合わせになってる。)
サンプル
サンプルは、至って簡単。
ImageLoaderの公式サンプル「Basic Features of the ImageLoader Utility」のコードを参考にして、先のログの2つの画像を表示してみる。
初期画面は以下。
この2つの画像をロードするために、YUIのImageLoaderで以下ような仕掛けを設定する。
- 左の囲いにマウスオーバー
- 右の囲いをクリック
- 囲いのレンダリングから10秒経過
のいずれかのイベントで、画像を表示する。
ImageLoaderには、面白い機能として「スクロールしたら表示する」というイベントハンドラも用意されている。画像の多い画面に有効なハンドラーだ。
以下が、画像をロードしたときの画面である。
以下は、GAE/JのプラグインがインストールされたEclipse3.4(Ganymede)で行った。(Galileoに移行したいんだけど、タイミングを逸している)
プロジェクトの作成
前回のログで作成したサンプルをコピーして、新規のweb applicationプロジェクトを作成する。
YUI2.7を使うので、YUIのサイトからダウンロードし、解凍した中にあるbuildディレクトリ配下をコピーする。
以下のような、ディレクトリー構成とした。
index.htmlの変更
index.htmlにYUIを使ったscriptを書き込む。
以下がその全文。スタイルシートで、「囲み(ドット枠)」の高さと幅を、画像の大きさに合わせているので、適宜変更。
<html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <title>Displaying Image by YUI imageLoader</title> <link rel="shortcut icon" href="../images/egp-favicon.ico" > <style type="text/css"> /*margin and padding on body element can introduce errors in determining element position and are not recommended; we turn them off as a foundation for YUI CSS treatments. */ body { margin:0; padding:0; } .duo1 { position:absolute; top:100px; left:20px; height:87px; width:80px; border:dotted; } .duo2 { position:absolute; top:100px; left:170px; height:100px; width:100px; border:dotted; } </style> <link rel ="stylesheet" type="text/css" href="./scripts/lib/yui/build/fonts/fonts-min.css" /> <script type="text/javascript" src="./scripts/lib/yui/build/yahoo-dom-event/yahoo-dom-event.js"></script> <script type="text/javascript" src="./scripts/lib/yui/build/imageloader/imageloader-min.js"></script> <script> ImageLoaderSample = function() { var ImageLoader = YAHOO.util.ImageLoader; return{ init:function() { var duoGroup = new ImageLoader.group('duo1', 'mouseover', 10); duoGroup.registerBgImage('duo1', '/downloadPicture.do?id=1'); duoGroup.registerBgImage('duo2', '/downloadPicture.do?id=2'); duoGroup.addTrigger('duo2', 'click'); duoGroup.name = 'group1'; } }; }(); //DOMが完全にloadされたら、サンプルを初期化する。 YAHOO.util.Event.onDOMReady( //DomReadyイベントで発火するハンドラ ImageLoaderSample.init, //ハンドラに渡すオブジェクト(関数) ImageLoaderSample, //ハンドラは、上記のオブジェクトのスコープをもつ。 true ); </script> </head> <body class=" yui-skin-sam"> <h2>Displaying Image by YUI imageLoader</h2> 左の囲いにマウスオーバーするか、右の囲いをクリックするか、<br> 10秒経過するとイメージが現れます。 <div class='duo1' id='duo1' title='左の囲みにマウスオーバーするか、右の囲みをクリックするか、4秒経過するとイメージが現れます'></div> <div class='duo2' id='duo2' title='左の囲みにマウスオーバーするか、右の囲みをクリックするか、4秒経過するとイメージが現れます'></div> </body> </html>
デプロイ
画像ファイルをアップロードしたのち、GAE/Jにデプロイする。