SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

AJAXアプリケーションで標準的なブラウザナビゲーションを再現する

Dojoを利用した直感的なブラウザナビゲーションのサポート

  • X ポスト
  • このエントリーをはてなブックマークに追加

ダウンロード サンプルソース (1.2 MB)

検索アプリケーション

 以下では、前述した検索アプリケーションの問題にDojoの履歴機能を適用する方法を実例で示します。図1は、検索アプリケーションのディレクトリ構造を示しています。

図1 検索アプリケーションのディレクトリ構造。サンプルの検索アプリケーションはこれらのフォルダを使用
図1 検索アプリケーションのディレクトリ構造。サンプルの検索アプリケーションはこれらのフォルダを使用
図2 単純な検索フォーム。ユーザーは検索テキストを入力してから[Search]ボタンをクリックする。これにより、サーバーにバックグラウンドリクエストが送られる
図2 単純な検索フォーム。ユーザーは検索テキストを入力してから[Search]ボタンをクリックする。これにより、サーバーにバックグラウンドリクエストが送られる

 ユーザーが検索をトリガするメインページ(searchMain.jsp、図2を参照)は、アプリケーションのルートフォルダに置かれています。「dojo」フォルダには、「dojo.js」などの標準Dojoファイルが含まれています。「script」フォルダには、検索アプリケーション用の特別なJavaScriptファイルとして、アプリケーション状態実装を定義する「HistoryTracker.js」と、body onloadハンドラ関数や検索を開始する関数など、さまざまなJavaScriptユーティリティ関数を定義する「dojoUtility.js」が含まれています。

著者注
 このサンプルアプリケーションではJSPを使用していますが、この例はどんなサーバーサイドテクノロジ(PHPやASPなど)を使用したとしても同様にうまく働きます。

 図2のフォームを表すHTMLの<form>タグは次のように記述されています。

<form name="searchForm" action="#">
   <input type="text" name="searchTextElement"></input>
   <input type="button" name="Search" value="Search" 
      onclick="performSearch(
      this.form.searchTextElement.value);"></input>
</form>

 ここで、ボタンを表す<input>タグのtype属性に"submit"ではなく"button"を使用していることに注意してください。これは自動フォーム送信を避けるためです。今回のサンプルでは、非同期のバックグラウンドリクエストを送信して、検索結果を取得します。したがって、ボタンのonclickイベントでperformSearch()メソッドを呼び出し、このメソッドから検索操作をトリガします。

 以下のperformSearch()関数コードは独立した「dojoUtility.js」ファイルに入っています。

function performSearch(searchTxt, pageNumber) {
   var bindUrl = "/dojoapp/doSearch.jsp";
   if(searchTxt) {
      bindUrl += "?searchTxt=" + searchTxt ;
      if(pageNumber) {
         bindUrl += "&pageNumber=" + pageNumber;
      }
      dojo.io.bind({
         url: bindUrl,
         load: function(type, data, evt){
            dojo.undo.browser.addToHistory(
               new HistoryTracker(data, searchTxt, 
               pageNumber, "searchContent"));
            dojo.byId("searchContent").innerHTML = data;
         }
      });
   }
}

 performSearch()メソッドは、searchTxtpageNumberという2つのパラメータをとります。前者はテキストボックスに入力された検索テキストを表し、後者は移動先となる検索ページを表します。performSearch()は非同期のリクエストを「doSearch.jsp」に送り、「doSearch.jsp」は検索結果を取得します。検索結果のダミーを図3に示します。

図3 検索結果のダミー。ページの下部に検索結果が表示される。
図3 検索結果のダミー。ページの下部に検索結果が表示される。

 以下は検索結果を生成するコードです(doSearch.js)。

You have searched for: 
   <%= request.getParameter("searchTxt") %>
<br/>

Showing page number: 
   <%= (request.getParameter(
   "pageNumber") == null)  ? 
   "1" : request.getParameter(
   "pageNumber") %>
<br/>

<a href="javascript:performSearch(
   '<%= request.getParameter("searchTxt") %>', 
   '<%= (request.getParameter("pageNumber") == null)  ?  "2" : 
   (Integer.parseInt(request.getParameter(
   "pageNumber") ) + 1) %>');">View next set of results</a>

 これはページ番号と検索テキストのみを表示するダミーページです。このページには、次の検索結果セットを取得するためのアンカータグが含まれており、このタグのhref属性の値としてjavascript:performSearch()関数を指定しています。この関数はパラメータとして検索テキストと次のページ番号をとります。

 performSearch()関数はHistoryTrackerオブジェクトを使用します。アプリケーション状態変化の登録はdojo.undo.browser.addToHistory()を呼び出すことによって行います。ただし、そのためにはアプリケーションの初期状態を登録しておく必要があります。通常、これはbody onloadイベントの中で行われます。

dojo.addOnLoad(handleBodyLoad);

 handleBodyLoad()関数の定義は次のようになっています。

function handleBodyLoad() {
   var state = new HistoryTracker(null, null, null, "searchContent");
   dojo.undo.browser.setInitialState(state);
   handleUrlHash();
}

 handleBodyLoad()関数は、searchTxtpageNumberの両方がnull値となる状態オブジェクトを作成します。その後、この状態オブジェクトをdojo.undo.browser.setInitialState()に渡すことで、アプリケーションの初期状態を登録します。そして最後にhandleUrlHash()を呼び出します。handleUrlHash()はURLハッシュを解析し、ハッシュの値に応じてアプリケーションの状態を復元します。

function  handleUrlHash() {
   var urlHash = location.hash.substring(1);
   var searchText, pageNumber;

   if(urlHash && urlHash != '') {
      var hashParams = urlHash.split(";");

      for (i = 0; i < hashParams.length; i++) {
         var temp = hashParams[i].split("=");
         if(temp && temp.length > 0) {
            switch(temp[0]) {
               case 'searchTxt': 
                  searchText = temp[1];
                  break;
               case 'pageNumber': 
                  pageNumber = temp[1];
                  break;
            }
         }
      }
   }
   if(searchText) {
      if(pageNumber) {
         performSearch(searchText, pageNumber);
      } 
      else {
         performSearch(searchText, 1);
      }
   }
}

 handleUrlHash()メソッドはURLハッシュを解析して検索テキストとページ番号を取得し、解釈した検索テキストとページ番号を使ってperformSearch()を呼び出します。前記のperformSearch()メソッドには、検索を開始するという役目があります。このメソッドはパラメータとして受け取ったsearchTextpageNmuberを使用して「doSearch.jsp」を呼び出し、検索結果を表示します。

 これで検索アプリケーションが完成しました。http://yourdomain/searchMain.jspというURLをブラウズすれば、検索ページを表示することができます。

 メインフォームが表示されたところで検索テキスト(「What is Dojo」など)を入力すると、同じページに検索結果が表示されます(図4を参照)。

図4 検索結果。検索結果は検索フォームと同じページに表示される
図4 検索結果。検索結果は検索フォームと同じページに表示される

 ページは変化しませんが、次のように、元のURLの末尾にURLハッシュが追加されていることがわかるでしょう。

http://localhost:8080/dojoapp/searchMain.jsp
#searchTxt=What%20is%20Dojo;pageNumber=1

 このURLハッシュには、searchTxtとpageNumberの値がセミコロンで区切られて含まれています。検索結果の「View next set of results」リンクをクリックすると、2番目の検索結果ページが表示されます。

 ご覧のように、DojoはAJAXアプリケーションにブックマークおよび[戻る]ボタンと[進む]ボタンを考慮させることができます。サンプルアプリケーションで示したように、各ページに明確なURLハッシュを割り当てることにより、ブラウザの履歴が更新されます。このテクニックを使用すると[戻る]ボタンと[進む]ボタンが正しく機能するので、ユーザーは任意のページに簡単にブックマークを付けることができます。本稿のダウンロードサンプルにはサンプルアプリケーションのコードが収録されており、すぐに使用できる状態になっています。ここで紹介したアイデアを、読者自身のナビゲーション対応AJAXアプリケーションの基礎として利用してください。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Gautam Kumar Singh(Gautam Kumar Singh)

大企業のWebアプリケーション開発に携わって4年以上の経験を持つソフトウェアエンジニア。現在はHCL Technologies, Indiaの主任エンジニアとして勤務。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/1879 2007/11/27 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング