Ajaxページで[前へ][次へ]ボタンの制御ができるようにする - PushState PopState の利用例 - JavaScript

Ajaxページで[前へ][次へ]ボタンの制御ができるようにするコードを紹介します。PushState PopState のページでの利用例となります。

概要

PopStateの動作をこちらの記事で紹介しました。また、PushStateの動作をこちらの記事で紹介しました。この記事では、PushState PopState を利用してAjaxページで、[前へ][次へ]ボタンの制御ができるコードを紹介します。

ページ制御のできない例

最初にPushStateやPopStateを使わずに、[前へ][次へ]ボタンの制御ができないページを作成してみます。

コード

下記のコードを記述します。
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <title></title>
  <script type="text/javascript">
    var pageid = 0;

    window.onload = function () {
      SetDisplay();
    }

    function NextClick() {
      pageid++;
      SetDisplay();
    }

    function SetDisplay() {
      switch (pageid) {
        case 0:
          target = document.getElementById("title");
          target.innerHTML = "Step 1";
          target = document.getElementById("text");
          target.innerHTML = "ステップ1の説明です。";
           
          target = document.getElementById("NextLink");
          target.style.display = "block";
          break;
        case 1:
          target = document.getElementById("title");
          target.innerHTML = "Step 2";
          target = document.getElementById("text");
          target.innerHTML = "ステップ2の説明です。";

          target = document.getElementById("NextLink");
          target.style.display = "block";
          break;
        case 2:
          target = document.getElementById("title");
          target.innerHTML = "Step 3";
          target = document.getElementById("text");
          target.innerHTML = "ステップ3の説明です。";

          target = document.getElementById("NextLink");
          target.style.display = "block";
          break;
        case 3:
          target = document.getElementById("title");
          target.innerHTML = "Step 4";
          target = document.getElementById("text");
          target.innerHTML = "ステップ4の説明です。";

          target = document.getElementById("NextLink");
          target.style.display = "block";
          break;
        case 4:
          target = document.getElementById("title");
          target.innerHTML = "Step 5";
          target = document.getElementById("text");
          target.innerHTML = "ステップ5の説明です。";

          target = document.getElementById("NextLink");
          target.style.display = "none";
          break;

      }
    }
  </script>
</head>

<body>
      <div id="title"></div>
      <div id="text"></div>
      <div id="NextLink"><a href="javascript:void(0);" onclick="NextClick();">次へ</a></div>
</body>
</html>

解説

ページを表示すると、pageidが0に初期化された状態となり、SetDisplay() 関数を呼び出します。
  var pageid = 0;

  window.onload = function () {
    SetDisplay();
  }

SetDisplay() 関数では、pageid の値に応じてページの内容を表示します。pageidの値が0の場合は、"ステップ1の説明です。"の文言が表示されます。

また、ページ下部の[次へ]リンクがクリックされた際には、NextClick() 関数を呼び出します。NextClick 関数では、pageidの値を1インクリメントし、SetDisplay関数を呼び出します。pageidが0の場合は pageidが1になり、SetDisplay関数により、ページの表示が、、"ステップ2の説明です。"に切り替わります。同様の処理を繰り返すことで、Step5まで表示を切り替えられる動作にしています。Step5に切り替わった際には、[次へ]のリンクを非表示にして、さらに先には進めないようにしています。

実行結果

Webブラウザでページを表示します。下図の画面が表示されます。[次へ]リンクをクリックします。


画面の表示が"Step2"の表示に変わります。戻るボタンは有効にならないため、前の画面には戻れません。


画面の下部の[次へ]リンクをクリックします。画面の表示が"Step3"に変わります。


同様に[次へ]リンクをクリックすると、"Step4","Step5"に表示が変わります。


PushState PopStateを利用してページ制御を実装する例

コード

下記のコードを記述します。
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <title></title>
  <script type="text/javascript">
    var pageid = 0;

    window.onload = function () {
      SetDisplay(true);
    }

    function NextClick() {
      pageid++;
      SetDisplay(true);
    }

    function SetDisplay(history_flag) {
      switch (pageid) {
        case 0:
          target = document.getElementById("title");
          target.innerHTML = "Step 1";
          target = document.getElementById("text");
          target.innerHTML = "ステップ1の説明です。";

          target = document.getElementById("NextLink");
          target.style.display = "block";
          break;
        case 1:
          target = document.getElementById("title");
          target.innerHTML = "Step 2";
          target = document.getElementById("text");
          target.innerHTML = "ステップ2の説明です。";

          if (history_flag == true) {
            history.pushState("STEP2", null, "/step2.html");
          }

          target = document.getElementById("NextLink");
          target.style.display = "block";break;
        case 2:
          target = document.getElementById("title");
          target.innerHTML = "Step 3";
          target = document.getElementById("text");
          target.innerHTML = "ステップ3の説明です。";

          if (history_flag == true) {
            history.pushState("STEP3", null, "/step3.html");
          }

          target = document.getElementById("NextLink");
          target.style.display = "block";
          break;
        case 3:
          target = document.getElementById("title");
          target.innerHTML = "Step 4";
          target = document.getElementById("text");
          target.innerHTML = "ステップ4の説明です。";

          if (history_flag == true) {
            history.pushState("STEP4", null, "/step4.html");
          }

          target = document.getElementById("NextLink");
          target.style.display = "block";
          break;
        case 4:
          target = document.getElementById("title");
          target.innerHTML = "Step 5";
          target = document.getElementById("text");
          target.innerHTML = "ステップ5の説明です。";

          if (history_flag == true) {
            history.pushState("STEP5", null, "/step5.html");
          }

          target = document.getElementById("NextLink");
          target.style.display = "none";
          break;

      }
    }

    window.addEventListener('popstate', function (e) {
      target = document.getElementById("output");
      switch (e.state) {
        case "STEP1":
          pageid = 0;
          break;
        case "STEP2":
          pageid = 1;
          break;
        case "STEP3":
          pageid = 2;
          break;
        case "STEP4":
          pageid = 3;
          break;
        case "STEP5":
          pageid = 4;
          break;
        default:
          pageid = 0;
      }
      SetDisplay(false);
    });
  </script>
</head>

<body>
      <div id="title"></div>
      <div id="text"></div>
      <div id="NextLink"><a href="javascript:void(0);" onclick="NextClick();">次へ</a></div>
</body>
</html>

解説

先のページ制御のできないコードから下記が追加されています。リンクをクリックしてページ遷移した場合に history.pushState() メソッドを呼び出しページ履歴を追加します。
  if (history_flag == true) {
    history.pushState("STEP2", null, "/step2.html");
  }

addEventListener() メソッドを呼び出し、popstateイベントを実装します。popstateイベントでは、stateの値を確認し、値に応じたpageidを設定し、SetDisplay() 関数を呼び出して画面表示内容を変更します。popstateでページを切り替えた場合は、SetDisplay()関数の引数にfalseを与え、pushStateメソッドを呼び出さないようにします。~
  window.addEventListener('popstate', function (e) {
    target = document.getElementById("output");
    switch (e.state) {
      case "STEP1":
        pageid = 0;
        break;
      case "STEP2":
        pageid = 1;
        break;
      case "STEP3":
        pageid = 2;
        break;
      case "STEP4":
        pageid = 3;
        break;
      case "STEP5":
        pageid = 4;
        break;
      default:
        pageid = 0;
    }
    SetDisplay(false);
  });

実行結果

Webブラウザでページを表示します。下図の画面が表示されます。[次へ]リンクをクリックします。


"Step 2"の画面が表示されます。 Webブラウザの[戻る]ボタンがクリックできる状態になっていることが確認できます。画面下部の[次へ]リンクをクリックします。


"Step 3"の画面が表示されます。


[次へ]リンクをクリックするごとに、"Step 4", "Step 5" の画面に切り替わります。



Webブラウザの[戻る]ボタンをクリックするとひとつ前のステップの"Step 4"の表示に戻れます。


続けてバックボタンをクリックすることで、"Step 1"の画面にまで戻れます。"Step 1"の画面が表示されると、[戻る]ボタンがクリックできない状態になります。


[次へ]ボタンをクリックすると、"Step 2" "Step 3"と画面を進めることができます。


著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2017-07-15
iPentec all rights reserverd.