その2

実際動いているサイトはこちら

index.php の解説

まずはヘッダ部分。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" lang="ja">
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<title>インタラクティヴ・プラザ βver. Presented by SirMiles</title>
<script type="text/javascript" src="ajax.js"></script>
<script type="text/javascript" src="plaza.js"></script>
</head>
<body>

 とりあえず、「XHTML 1.0 Transitional」準拠とし、メタ情報に、文字セットがUTF-8であることを明言しておきます。なお、HTMLを一通り作成したら、LINTサイトなどを使用し、Validかどうかはくらいは確認するようにしましょう。
 scriptタグには、後ほど登場する「ajax.js」と「plaza.js」を外部ソースとして指定しておきます。

続いてコンテンツ部分の冒頭。
<h1 id="top">Ajaxを利用して、Amazon・楽天・ビッダーズ・ストアミックスから、インタラクティヴに商品を検索します。</h1>

<div id="msg" style="font-weight : bold; background-color : #CCFFFF; border : solid 1px #00CCCC; height : 1.5em;"></div> 

 「id="top"」となっているdivタグは、「このページのトップへ」のリンク先として使用します。

<a href="#top">このページのトップへ</a>

のように使います。
 「id="msg"」となっているdivタグは、「検索中…」などのメッセージ、あるいはエラーメッセージを流すのに使います。

続いてフォーム部分。選択項目等は長いので途中を省略します。
<form id="searchbox" action="index.php" method="get" target="_top" accept-charset="utf-8">
<p>検索ワード:<input id="Keywords" name="Keywords" type="text" size="50" value="" /><input id="submitbutton" type="submit" value="検索" /></p>

<script type="text/javascript">
<!--
if(objValid()) {
    document.getElementById("submitbutton").disabled = true;
}
else {
    document.write('<p><strong>インタラクティヴ検索はご利用になれません。検索ボタンをご利用ください。</strong></p>');
}
//-->
</script>

<noscript>
<p><strong>インタラクティヴ検索はご利用になれません。検索ボタンをご利用ください。</strong></p>
</noscript>

<p><input type="radio" name="Sort" value="Bestselling" id="SortBestselling" checked="checked" /><label for="SortBestselling">指定なし</label>
....(省略)....
<input type="radio" name="Sort" value="HighPrice" id="SortHighPrice"  /><label for="SortHighPrice">高い順</label></p>

<p class="indent">※ アマゾンの場合、カテゴリー指定がないと、新着順や価格順が無効になります。</p>
<p class="indent">※ ストアミックスの場合、カテゴリーや並び順はすべて無効になります。</p>

<hr/>

<table summary="CATEGORY" border="0" cellspacing="0" cellpadding="0">
  <tbody>
    <tr>
      <td>
      <p><input id="Amazon" name="Amazon" type="checkbox" checked="checked" value="true"/>アマゾン:</p>
      </td>
      <td>
      <p>
      <select id="SearchIndex" name="SearchIndex" style="width : 20em;">
        <option value="Blended" selected="selected">カテゴリー指定なし</option>
        ....(省略)....
        <option value="Toys" >トイ</option>
      </select>
      </p>
      </td>
      <td>
      <p>&nbsp;</p>
      </td>
    </tr>
    <tr>
      <td>
      <p><input id="Rakuten" name="Rakuten" type="checkbox" checked="checked" value="true"/>楽天:</p>
      </td>
      <td>
      <p>
      <select id="Genre" name="Genre" style="width : 20em;">
        <option value="" selected="selected">カテゴリー指定なし</option>
        <option value="100371" >ファッション</option>
        ....(省略)....
        <option value="101438" >サービス</option>
      </select>
      </p>
      </td>
      <td>
      <p>&nbsp;</p>
      </td>
    </tr>
    <tr>
      <td>
      <p><input id="Bidders" name="Bidders" type="checkbox" checked="checked" value="true"/>ビッダーズ:</p>
      </td>
      <td>
      <p>
      <select id="Categ" name="Categ" style="width : 20em;">
        <option value="" selected="selected">カテゴリー指定なし</option>
        ....(省略)....
        <option value="11" >ビジネス・事務・店舗用品・文房具</option>
      </select>
      </p>
      </td>
      <td>
      <p>&nbsp;</p>
      </td>
    </tr>
    <tr>
      <td>
      <p><input id="Storemix" name="Storemix" type="checkbox" checked="checked" value="true"/>ストアミックス:</p>
      </td>
      <td>
      <p>
      <select id="SCateg" name="SCateg" style="width : 20em;" disabled="disabled">
        <option value="" selected="selected">カテゴリー指定なし</option>
      </select>
      </p>
      </td>
    </tr>
  </tbody>
</table>
</form>

 AJAXを使って動的にページを変化させるのに、何故送信フォームが作られているのか。それは、AJAXに対応していない(この言い方には語弊がありますが、平易な言い方として使います)ブラウザへの対策です。
 AJAXが使えないブラウザのユーザは、検索ボタンを使うことにより、昔ながらのリクエスト&レスポンスでこのページを使用することが出来ます。ただし、index.phpに、このリクエストを受け取って結果ページを返す機能を付加しなければなりません。当面はそれを省略します。
 各項目には、サーバー側がGETリクエストにおける各パラメータの名前識別をするためのname属性と、JavaScriptからグリグリ内容をいじるためのid属性を、必ず入れておきます。つまり、昔ながらのリクエスト&レスポンスをサーバーが処理する場合はname属性が、AJAX的に処理する場合はid属性が重要になるのです。
 ちなみに、「selected="selected"」や「checked="checked"」という記述が見られますが、XHTMLでは、属性値を単独で書くことを許可していません。その為「属性="属性値"」の形式を遵守すべく、このような記述にしてあります。
 ここでの注目箇所は、

<script type="text/javascript">
<!--
if(objValid()) {
    document.getElementById("submitbutton").disabled = true;
}
else {
    document.write('<p><strong>インタラクティヴ検索はご利用になれません。検索ボタンをご利用ください。</strong></p>');
}
//-->
</script>

<noscript>
<p><strong>インタラクティヴ検索はご利用になれません。検索ボタンをご利用ください。</strong></p>
</noscript>

の部分でしょう。
 「objValid()」ファンクションは、「ajax.js」内に定義されており、AJAXが使えるかどうかの判定を行います。objValid()がtrueを返したならば、AJAXに対応しているということで、検索ボタンをつぶしておきます。これは、不用意にEnterキーを押下されてしまうのを防止するためです。一方、objValid()がfalseを返したならば、AJAXに対応していないということで、その旨を伝える文字列を書き込んでおきます。
 また、noscriptタグに、JavaScriptが使用できないブラウザ対策を講じて起きます。

最後にコンテンツ後半。
<hr />

<div id="amazonbookmarks"></div>
<div id="rakutenbookmarks"></div>
<div id="biddersbookmarks"></div>
<div id="storemixbookmarks"></div>

<div id="amazoninfo"></div>
<div id="amazonresults"></div>
<div id="amazonerror"></div>

<div id="rakuteninfo"></div>
<div id="rakutenresults"></div>
<div id="rakutenerror"></div>

<div id="biddersinfo"></div>
<div id="biddersresults"></div>
<div id="bidderserror"></div>

<div id="storemixinfo"></div>
<div id="storemixresults"></div>
<div id="storemixerror"></div>

</body>
</html>

 divタグの嵐です。
 これらが何のためにあるかと言うと、JavaScriptからそれぞれのdivタグ内に、結果などを書き込むためです。
 idが「〜bookmarks」となっているものには、「Amazonの検索結果へ」などが書き込まれます。ここに書き込まれるリンク(aタグ)には、idが「〜info」になっているdivタグへのリンクが張られます。例えば、「Amazonの検索結果へ」というリンクをクリックすると、id="amazoninfo"へとページ内ジャンプをするわけです。
 idが「〜info」となっているものには、「Amazonの検索結果 100 件中 10 件」などが書き込まれます。検索結果が多い場合、すべての商品が網羅できるように各種ショッピングモールのWebサービスにアクセスし続けると、大変な時間を要するため、当ページでは各Webサービスに対し1〜2回のアクセスに限定します。
 idが「〜results」となっているものには、商品の検索結果が羅列されます。サムネイル、商品名、価格などが一覧表示される場所です。
 idが「〜error」となっているものには、エラーメッセージが書き込まれます。それぞれのショッピングモールにアクセスした結果、エラーが発生した場合に使用されます。
 ちなみに、XHTMLの場合、hrタグのように開始と終了がないエレメントは、スラッシュをつけて自己完結させなければなりません。

 さて、次回はいよいよ「ajax.js」スクリプトの解説に移ります。