【連載】

いまからはじめるPrototype.js

6 Ajaxによる送受信とWebページの更新

    沖林正紀  [2008/03/07]

    Ajaxの普及とJavaScriptライブラリの出現や発展は車の両輪のように進んできた。Prototype.jsの出現はその先駆けだったといってよいだろう。今回は、そのAjax関連機能を取り上げる。バージョン1.6.0.2、Windows環境の場合で説明する。

    サーバとの送受信

    サーバとWebブラウザとの間でデータを送受信する際に、もっとも多く用いられるのはAjax.Requestだ。これはPrototype.jsのClassによって構築されているので、ここではクラスの1つとして紹介する。基本的な構成は以下のとおりだ。最初にnewを記述してインスタンスを生成させるようにすることが必要だ。

    new Ajax.Request( 'アクセスするURL', {
      method : 'get'もしくは'post',
      // ..... その他オプション .....
      onSuccess : function( transport )  {
        // ..... サーバから正常にデータを受信したとき .....
        // (ステータスコード2xxのとき)
        // 引数transportはサーバから受信したデータなど、以下同じ
      },
      onFailure : function( transport )  {
        // ..... サーバからデータを受信できなかったとき .....
        // (ステータスコード2xx以外のとき)
      },
      onException : function( transport, ex )  {
        // ..... 送受信時に何らかのエラーが発生したとき .....
      }
    } )
    

    サーバにアクセスするときのHTTPメソッドはgetかpostを記述する。そしてリクエスト送信前後に行う処理をコールバック関数で記述する。引数transportは、サーバから受信したデータなどが収められたオブジェクトだ。オプションの詳細はAjax Optionsで参照できる。

    受信したXMLデータでWebページを更新

    では例として、リスト1のようなXML形式のデータを受信して、リスト2のようにHTMLの<ul><li>に変換してリンクを表示させる方法を紹介したい。

    【リスト1】 XML形式のブックマークデータ(独自形式、文字コードUTF-8)

    <?xml version="1.0"?>
    <bookmark>
      <item>
        <title>いまからはじめるPrototype.js</title>
        <link>http://journal.mycom.co.jp/series/prototypejs/001/menu.html</link>
      </item>
      <item>
        <title>いまからはじめるScript.aculo.us</title>
        <link>http://journal.mycom.co.jp/series/scriptaculous/001/menu.html</link>
      </item>
    </bookmark>
    

    【リスト2】 HTMLに変換後のブックマーク(<div id="panel"></div>内に表示)

    <ul>
      <li><a href=".....">いまからはじめるPrototype.js</a></li>
      <li><a href=".....">いまからはじめるScript.aculo.us</a></li>
    </ul>
    

    図1 リスト2の画面表示

    例1 IE7, Opera9.2, Safari3の場合


    1.Ajax.Requestのインスタンスを生成する処理を記述する(リスト3)。正常にデータを受信できたときは上記の変換処理を行い、その他の場合は簡単なメッセージを表示させるようにする。

    【リスト3】 Ajax.Requestのインスタンスを生成

    new Ajax.Request( 'サーバのURL', {
      method : 'get',
      onSuccess : function( transport )  {
        // ..... XMLからHTMLへの変換処理 .....
      },
      onFailure : function( transport )  {
        $( 'panel' ).update( 'データを受信できませんでした' );
      },
      onException : function( transport, ex )  {
        $( 'panel' ).update( 'エラーが発生しました<pre>' + ex.message + '</pre>' );
      }
    } );
    

    2.初期設定として、新たに生成した<ul>と、リスト1のルートタグにあたるDOMオブジェクト(documentElement)の参照を変数に代入しておく。

    var ul  = new Element( 'ul' );
    var doc = transport.responseXML.documentElement;
    

    3.リンク情報を持つ<item>を逐次参照し、HTMLに変換する

    $A( doc.getElementsByTagName( 'item' ) ).each( function( tag )  {
      if ( !Prototype.Browser.IE )  tag = Element.cleanWhitespace( tag );
      var children = tag.childNodes;
      // <a>の生成(children[ 0 ] : <title>, children[ 1 ] : <link>)
      var a = new Element( 'a', { href : children[ 1 ].firstChild.nodeValue } )
                    .update( children[ 0 ].firstChild.nodeValue );
      // ..... <a>を<li>の子要素とする .....
      var li = a.wrap( 'li' );
      // ..... <ul>に<li>を追加 .....
      Element.insert( ul, li );
    } );
    

    4.すべての<item>から<li>を作成したら、<ul>を画面表示の要素として追加する

    $( 'panel' ).insert( ul );
    

    例2 Firefox2の場合

    Firefoxでは、上記の3.について、セレクタを含むElementのメソッドをより多く実行可能だ。以下にその例を示す。

    // CSSセレクタで<item>を逐次参照
    Element.select( doc, 'item' ).each( function( tag )  {
      // <title>と<link>のDOMオブジェクトを参照
      var title = Element.firstDescendant( tag );
      var link  = Element.next( title );
      // <a>および<li>を生成
      var li = new Element( 'a', { href : link.firstChild.nodeValue } )
                      .update( title.firstChild.nodeValue )
                      .wrap( 'li' );
      // <li>を<ul>に追加
      ul.insert( li );
    } );
    

    例1と例2を合わせると以下のようになる。ここではPrototype.Browser.Geckoを用いてWebブラウザの種類に応じて処理を変えられるようにしている。できればどのWebブラウザでも同じ方法で処理したいのだが、どうしてもできないときは、こうした処理の振り分けが必要になる。

    new Ajax.Request( 'サーバのURL', {
      method : 'get',
      onSuccess : function( transport )  {
        var ul  = new Element( 'ul' );
        var doc = transport.responseXML.documentElement;
        if ( !Prototype.Browser.Gecko )  {
          // Firefox以外の処理
        }  else  {
          // Firefoxでの処理
        }
        $( 'panel' ).insert( ul );
      },
      onFailure : function( transport )  {
        $( 'panel' ).update( 'データを受信できませんでした' );
      },
      onException : function( transport, ex )  {
        $( 'panel' ).update( 'エラーが発生しました<pre>' + ex.message + '</pre>' );
      }
    } );
    

    その他のAjax関連機能


    Ajax.Updater クラス
    サーバから受信したHTMLデータでWebページを更新する。JavaScriptを実行するオプションもある。

    Ajax.PeriodicalUpdater クラス
    定期的にサーバからHTMLデータ受信してWebページを更新する。

    Ajax.Responders オブジェクト
    どのAjax処理でも共通するコールバック関数を設定しておく。

    Webメールクライアントのように多くのユーザーがアクセスするページでもAjaxを導入する例が増えてきた。連載は今回で最後となるが、Prototype.jsをはじめとするJavaScriptライブラリはまだまだ発展を続けている。数年経ってから振り返ったときに、2008年はAjax普及元年と呼ばれるようになっているかもしれない。

    関連したタグ

    新着記事

    特設サイトの情報

      求人情報

      人気記事

      一覧

      イチオシ記事

      新着記事

      特別企画

      転職ノウハウ

      あなたの仕事適性診断

      4つの診断で、自分の適性を見つめなおそう!

      Heroes File ~挑戦者たち~

      働くこと・挑戦し続けることへの思いを綴ったインタビュー

      はじめての転職診断

      あなたにピッタリのアドバイスを読むことができます。

      転職Q&A

      転職に必要な情報が収集できます

      スカウト転職する

      企業からアプローチのメッセージが届きます。

      マイナビニュースマガジン