第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-scriptWebブラウザに次のようなレスポンスが表示されます。
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には強力なセレクタがあるため、
今回のサンプルくらいの簡単な実装ですと、
次回は、