SHOEISHA iD

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

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

CoffeeScriptによるモダンなWebアプリケーション開発

CoffeeScriptベストプラクティス集
ブラウザ向けJavaScript編(2)

CoffeeScriptによるモダンなWebアプリケーション開発 第8回

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

ブラウザの履歴を操作する

 HTML5のHistory APIを使うと、ページ遷移を行わずにJavaScriptでブラウザの履歴を操作できます。この仕組みを利用すると、Ajaxでコンテンツを変更しつつ、通常のページ遷移と同じように履歴を追加することができます。ブラウザの戻るボタンも問題なく使用できます。URLの#を使う方法と比べてURLがすっきりするのでユーザーにとって馴染みやすく、またAjaxコンテンツにおける_escaped_fragment_のような特別なURLを用意する必要がないという利点があります。History APIはIE6から9までのブラウザではサポートされていません。

 実際に使われている例として、GitHubのプロジェクトのファイル一覧ビューはHistory APIが利用されており、部分的にコンテンツを読み込んで表示し、ページ全体は読み込まずにURLを変えています(図1)。

図1 GitHubのファイル一覧ビュー
図1 GitHubのファイル一覧ビュー

 History APIはサポートされているブラウザ間でも多少挙動に違いがありますが、History.js(BSDライセンス)というライブラリを使うことでブラウザごとの違いを吸収できます。

History.jsの使い方

 History.jsは、History APIがサポートされていないブラウザではURLの#以降を使って代替する機能を持っており、任意で有効にすることもできますが、URLにIDが自動的に付加されるなど多少見苦しいものとなってしまいます。ここで紹介する使い方は、History APIが使える場合はそれを活用し、History APIが使えない場合は通常のリンクでページ遷移するという手法です。

 まずjQuery用のHistory.jsライブラリをここからダウンロードします。このファイルをjs/libs/jquery.history.jsに設置したものと仮定します。JSONの節で紹介したjson2.jsもjs/libs/json2.jsに置いておきます。そして、リスト3のHTMLを作成し、リスト4のスクリプトをjs/main.jsとして読み込みます。

[リスト3]History.jsの使用例
<!doctype html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>test</title>
</head>
<body>
  <div id="main">
    <a href="1.html" id="link1">link1</a>
    <a href="back.html" id="back">back</a>
  </div>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
  <script src="js/libs/json2.js"></script>
  <script src="js/libs/jquery.history.js"></script>
  <script src="js/main.js"></script>
</body>
</html>
[リスト4]main.coffee(js/main.jsにコンパイルされる)
if History.enabled  # History APIが有効な場合
  # History.jsによって状態が遷移した時に呼ばれるコールバック
  History.Adapter.bind window, 'statechange', ->
    state = History.getState()
    console.log "statechange"
    console.log state
    # 元となるpushStateに関する情報がstateに入っている
    #   state.data   pushStateの第1引数
    #   state.title  pushStateの第2引数
    #   state.url    遷移先のURL

    # ここでstate.urlに該当するURLのコンテンツをAjaxで取得して表示する

# id="link1" の要素をクリックした時に呼ばれる
$('#link1').click (event) ->
  # History.jsが有効になっていない時は通常通りページ遷移させる
  if not History.enabled
    # trueを返すとクリックイベントが通常通り処理される
    return true
  # 状態を遷移させ、ページの履歴に追加する
  History.pushState { abc: 123 }, 'Page 1', '1.html'
  # falseを返すとクリックイベントがキャンセルされる
  false

# id="back" の要素をクリックした時に呼ばれる
$('#back').click (event) ->
  history.back()  # 履歴を1つ戻る
  false

 このページをブラウザで開き「link1」をクリックすると、1.htmlというファイルが存在していなくてもブラウザのURLを1.htmlに変えることができます。

 History.pushState(data, title, url)を実行するとブラウザのURLが変わり、履歴が追加されます。引数は次の通りです。

  • History.pushState(data, title, url)
    • data:遷移先に渡すオブジェクト(nullまたはオブジェクト)
    • title:遷移先のタイトル(nullまたは文字列)
    • url:遷移先のURL(文字列)

 履歴を1つ戻るにはhistory.back()を呼びます。この場合はすべて小文字のhistoryを使うことに注意してください。このhistoryオブジェクトの正体はwindow.historyで、history.back()はHTML5以前からブラウザに標準でサポートされている機能です。履歴を2つ前まで一気に戻る場合はhistory.go(-2)を呼びます。

history.back()  # 1つ前に戻る
history.go -2   # 2つ前に戻る
history.go -3   # 3つ前に戻る

次のページ
DOMの準備完了を待つ

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

  • X ポスト
  • このエントリーをはてなブックマークに追加
CoffeeScriptによるモダンなWebアプリケーション開発連載記事一覧

もっと読む

この記事の著者

飯塚 直(イイヅカ ナオ)

1984年東京都生まれ。 高校時代に趣味でPerlやJavaを使ってプログラミングを始める。 慶応大学湘南藤沢キャンパス卒業後、共同通信社にてニュースサイトの開発などを担当。 その後、面白法人カヤックにてソーシャルゲームの開発などを手がける。 2012年現在、カヤックを退社し個人として活動し...

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

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

この記事をシェア

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

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング