次のサンプルは、画像共有サイトFlickrの「Public photos」フィードサービスを利用して、こちらから指定したタグに関連するデータを受け取り、渡されたデータから「media」で指定された画像を表示する例である。「鉄は熱いうちに打て」ということで、jQueryをもう少し突っ込んで利用してみる。
使い方は、カテゴリを選択してから「読込む」ボタンを押せば、「次へ」で次の画像を読み込んで表示する。何が出るか分からないので、心の準備はしておいて下さい。責任は一切持ちません(^_^;)。
この例の元ネタは、jQueryのAPIリファレンスでAjaxのgetJSONの項である。FlickrのAPIは、Flicker ServicesのFeedsページでPublic photosに説明がある。フィードデータのJSONフォーマットは、「NEW」の印が付いているので最近サポートされるようになったのかな?
以下が、この例のソースプログラムである。表現を短くするために、if文などカッコで囲まないで1行で書いたり、利用しない引数を書いたりするのは自分はあまり好きではないが、ソースが読み易くなるならそれもいいか…。
<script type="text/javascript"> var flcd = new Array(); var cno = -1; function dispImage() { $("#flcs").empty(); for (var j = 0; j < 2; j++) { $("#flcs").append("<img src=\"" + flcd[cno + j].media.m + "\" />"); } } $(document).ready(function() { $("select").change(function() { $("#seltag").attr("value", $(this).attr("value")); }); $("#getimg").click(function() { $.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?tags=" + $("#seltag").attr("value") + "&tagmode=and&format=json&jsoncallback=?", function(data) { flcd = data.items; dispImage(cno=0); $("#next").removeAttr("disabled"); $("#prev").removeAttr("disabled"); }); }); $("#next").click(function() { if (cno < flcd.length - 2) dispImage(++cno); }); $("#prev").click(function() { if (0 < cno) dispImage(--cno); }); }); </script>
JavaScriptでは、セキュリティ上読み出されたサイト以外のサイト(クロスドメイン)には、接続できないようになっている。そのため、 WebAPIサービスを利用する場合、自サイトに他サイトのWebAPIサービスからデータを取ってくるCGIを用意し、JavaScriptでその CGIを利用して読み込んだりする。
一方この例はJSONPと呼ばれる方法で、JavaScriptのソースはクロスドメインでもアクセスできることから、WebAPIサービスのデータを受け取るJavaScriptのコールバック関数を用意して呼び出すことで、コールバック関数とそれに配列データを加えて戻す方法を利用したものである。どこの説明にも、悪意あるコードを含めることが可能なので、利用する際は注意するように、と書かれているので念のため。
理屈はよく分からないけど、これならサーバーサイドのCGIを利用しなくても、Web2.0プログラムができるかも知れないですね(自分には無理っぽいですが orz)。