第1回ではJSONPによるAjax実装を取り上げましたが、
JSONってなに?
JSONとは、
JSONは、
オブジェクト(名前と値のペアの集まり)
JSONでオブジェクトを表現するには、
{"color": "green"}
試しに、
// オブジェクトの生成
var obj = {"color": "green"};
// "color" プロパティにアクセス
alert(obj.color); // "green"
alert(obj["color"]); // "green"
配列(順序付きの値の集まり)
JSONで配列を表現するには、
["red", "green", "blue"]
試しに、
// 配列の生成
var array = ["red", "green", "blue"];
// 配列の各要素にアクセス
alert(array[0]); // "red"
alert(array[1]); // "green"
alert(array[2]); // "blue"
構造化
オブジェクト、
// オブジェクトの生成
var obj = {
"title" : "reunion",
"users": [
{
"name": "aoki",
"code": "0001",
"age": 34
},
{
"name": "ueno",
"code": "0002",
"age": 33
}
]
};
// 各メンバにアクセス
alert(obj.title); // "reunion"
alert(obj.users[0].name); // "aoki"
alert(obj.users[0].code); // "0001"
alert(obj.users[0].age); // "34"
alert(obj.users[1].name); // "ueno"
alert(obj.users[1].code); // "0002"
alert(obj.users[1].age); // "33"
表記の制約
名前は文字列でなければなりません。かならず
値は、
基本的にこの表記法がJSONです。とてもシンプルですね。詳細は以下を参照してください。
Youtube APIのデータフォーマットにjson-in-script
なぜJSONを使うのか
Ajaxの
最大の理由はJavascriptで扱いやすいことです。JSONはJavascriptオブジェクトの表記法のサブセットなので、
現在、
JSONPってなに?
JSONPとは、
たとえば、
method({"color": "green"});
よって、
{"color": "green"}
を引数としてmethod関数が実行されます。
このようにして、
Youtube APIでは、
http://gdata.youtube.com/feeds/api/videos?callback=view&vq=test&max-results=10&alt=json-in-script
Webブラウザに次のようなレスポンスが表示されます。
view({"version":"1.0","encoding":"UTF-8",...});
*詳細は省略しています。
callbackパラメータに指定したviewという関数を呼び出す形でデータが返ってくることが確認できます。
そして、
<script type="text/javascript" src="http://gdata.youtube.com/feeds/api/videos?vq=..." />
なぜJSONPを使うのか
JSONPのほかにAjaxを実装する方法としてXMLHttpRequestオブジェクトを使った実装方法もあります。なぜ、
それは、
これでは、
scriptタグを利用したJSONPでは、
jQueryによるAjax実装
Ajaxに関する基礎的な説明を終えたところで、
jQueryってなに?
jQueryとは、
2008年1月現在の最新バージョンは、
jQueryを使う準備
まず、
あとは、
<html>
<head>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
// jQueryを利用してコードを書く
</script>
</head>
<body>
<script type="text/javascript">
// jQueryを利用してコードを書く
</script>
</body>
</html>
基本的な使い方
$()でjQueryオブジェクトを生成し、
jQueryオブジェクトの生成例をいくつか挙げてみます。
<p>Hello world!</p> というDOM要素のjQueryオブジェクトを生成します。
$("<p>Hello world!</p>")
id=frmSearchで定義されるDOM要素のjQueryオブジェクトを生成します。idの値を指定してjQueryオブジェクトを生成するには、
$("#frmSearch")
p要素の子要素であるstrong要素のjQueryオブジェクトを生成します。
$("p > strong")
p要素の子孫要素のうち、
$("p strong:contains('jQuery')")
jQueryオブジェクトを生成すれば、
$("p > strong").hide();
jQueryの詳細については、
実装してみよう(1)
それでは、
機能としては、
- テキストボックスに文字列を入力して
「検索」 ボタンを押すと、 検索結果のサムネイル画像を10件表示する - サムネイル画像をクリックすると、
ビデオの再生ページに遷移する
jQueryの読み込み
まずは、
<script type="text/javascript" src="jquery-1.2.1.js"></script>
キーワード入力、検索結果表示部分
検索キーワードを入力するためのテキストボックスを作ります。また、
<form id="frmSearch">
<input type="text" id="keyword">
<input type="submit" value="検索">
</form>
<div id="videos"></div>
id=frmSearchとしてform要素を生成します。検索を実行する
第1回では、
初期化処理
jQueryでページ読み込み時に初期化処理を行うには次のように定義します。
$(function(){
// 初期化処理...
})
このメソッドはページが読み込まれ、
$(function(){
// submitイベントハンドラ
$("#frmSearch").submit(function(){
search($("#keyword").val());
return false;
});
});
submitイベントハンドラ
id=frmSearchで定義される検索フォームのjQueryオブジェクトを生成します。
$("#frmSearch")
そのフォームオブジェクトに対してjQueryのsubmit(fn)メソッドを呼び出すと、
$("#frmSearch").submit(function(){
// イベント処理
});
ここでは、
$("#keyword").val()
この値を引数としてsearchメソッドを呼び出します。
search($("#keyword").val());
また、
return false;
実装してみよう(2)
検索
キーワードを引数として検索を実行する関数を実装します。データを解析し、
function search(keyword) {
// (1) 表示領域を初期化します。
$("#videos").text("Loading...");
// (2) ajax通信を行います
$.ajax({
dataType: "jsonp", // (3) データ形式はJSONPを指定します。
data: { // (4) リクエストパラメータを定義します。
"vq": keyword,
"max-results":"10",
"alt":"json-in-script"
},
cache: true, // (5) キャッシュを使用します。
url: "http://gdata.youtube.com/feeds/api/videos",
success: function (data) { // (6) データ取得に成功した場合の処理を定義します。
$("#videos").empty();
$.each(data.feed.entry, function(i,item){ // (7) entryの各要素へアクセスします。
var group = item.media$group;
$("<a/>") // (8) a要素を生成
.attr("href", group.media$player[0].url) // (9) a要素のhref属性を設定
.append("<img src='" + group.media$thumbnail[0].url + "'/>") // (10) a要素の子要素にimg要素を追加
.appendTo("#videos"); // (11) a要素を表示領域の子要素に追加
});
}
});
}
まず、
ビデオを検索するajax通信を定義します
$.ajax({オプションパラメータ});
今回定義するオプションパラメータは次の通りです。
dataTypeは、
dataは、
cacheにfalseを指定すると、
urlは、
successはデータ取得に成功した場合に、
まず、
$("#videos").empty();
empty()は、
次に、
$.each(data.feed.entry, function(i,item){
// 各要素への処理...
});
とするることで、
2番目の引数fnには、
よって、
var group = item.media$group
ここではループの中で処理しやすいように、
次にプレーヤのページへリンクを張ったサムネイル画像を生成します。
まず、
DOMプログラミングでは、
そのリンク要素のjQueryオブジェクトに対して、
.attr("href", group.media$player[0].url)
そのリンク要素のjQueryオブジェクトに対して、
.append("<img src='" + group.media$thumbnail[0].url + "'/>")
appendメソッドの処理イメージは次のようになります。
そして、
.appendTo("#videos")
ここで、
jQueryオブジェクトのメソッドの殆どは、
以上で、
まとめ
今回は、
また、
script要素を生成しなくてもよい
script要素の生成は、
コールバック関数を指定しなくてもよい
コールバック関数を指定しなくても、
Youtube APIのコールバック関数のパラメータはcallbackなので、
もし、
HTMLとイベントハンドラが分離されている
フォームのsubmitイベントハンドラを、
<form onsubmit="search(); return false;">
しかし、
<form id="frmSearch">
submitイベントハンドラは、
送信クエリを組み立ててくれる
送信クエリの文字列を組み立てる時には、
DOMプログラミングが簡潔に記述できる
jQueryには強力なセレクタがあるため、
今回のサンプルくらいの簡単な実装ですと、
次回は、