WEB制作、マーケティングに関する情報をお届けします。ホームページ制作会社、テラのブログ

セッションストレージを使用して1ページずつ質問を回答させるフォームの作成方法

タグ:

1ページずつ質問をさせて最後に結果を発表、もしくは確認画面を表示してフォーム送信させる。
主にアンケートページや診断ページなどで出会う場面が多い気がします。
今回はJavascriptで実装する『セッションストレージを使用して1ページずつ質問を回答させるフォームの作成方法』を紹介します。

コードの紹介

ページ1

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>名前の入力</title>
</head>
<body>
    <h1>Question 1/3</h1>
    <form id="nameForm">
        <label for="name">あなたの名前は?</label>
        <input type="text" id="name" name="name" required>
        <input type="submit" value="次に進む">
    </form>

    <script>
        // セッションストレージから名前を取得して、あればフォームに表示
        window.onload = function() {
            const storedName = sessionStorage.getItem('name');
            if (storedName) {
                document.getElementById('name').value = storedName;
            }
        };

        document.getElementById('nameForm').addEventListener('submit', function(event) {
            event.preventDefault();
            const name = document.getElementById('name').value;
            if (name === '') {
                alert('名前が入力されていません');
            } else {
                sessionStorage.setItem('name', name);
                window.location.href = 'question_2.html'; // 2ページ目に移動
            }
        });
    </script>
</body>
</html>

ページ2

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>年齢の入力</title>
</head>
<body>
    <h1>Question 2/3</h1>
    <form id="ageForm">
        <label for="age">あなたの年齢は?</label>
        <select id="age" name="age" required>
            <option value="">選択してください</option>
        </select>
        <input type="button" value="前に戻る" onclick="window.location.href='question_1.html'">
        <input type="submit" value="次に進む">
    </form>

    <script>
        // 年齢の選択肢を追加
        const ageSelect = document.getElementById('age');
        for (let i = 10; i <= 100; i++) {
            const option = document.createElement('option');
            option.value = i;
            option.text = i;
            ageSelect.appendChild(option);
        }

        // セッションストレージから年齢を取得して、あれば選択
        window.onload = function() {
            const storedAge = sessionStorage.getItem('age');
            if (storedAge) {
                ageSelect.value = storedAge;
            }
        };

        document.getElementById('ageForm').addEventListener('submit', function(event) {
            event.preventDefault();
            const age = document.getElementById('age').value;
            if (age === '') {
                alert('年齢が選択されていません');
            } else {
                sessionStorage.setItem('age', age);
                window.location.href = 'question_3.html'; // 3ページ目に移動
            }
        });
    </script>
</body>
</html>

ページ3

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>性別の選択</title>
</head>
<body>
    <h1>Question 3/3</h1>
    <form id="genderForm">
        <label>あなたの性別は?</label><br>
        <input type="radio" id="male" name="gender" value="男性">
        <label for="male">男性</label><br>
        <input type="radio" id="female" name="gender" value="女性">
        <label for="female">女性</label><br>
        <input type="button" value="前に戻る" onclick="window.location.href='question_2.html'">
        <input type="submit" value="結果を見る">
    </form>

    <script>
        // セッションストレージから性別を取得して、あれば選択
        window.onload = function() {
            const storedGender = sessionStorage.getItem('gender');
            if (storedGender) {
                document.querySelector(`input[name="gender"][value="${storedGender}"]`).checked = true;
            }
        };

        document.getElementById('genderForm').addEventListener('submit', function(event) {
            event.preventDefault();
            const gender = document.querySelector('input[name="gender"]:checked').value;
            sessionStorage.setItem('gender', gender);
            window.location.href = 'result.html'; // 結果表示ページに移動
        });
    </script>
</body>
</html>

結果を表示するページ

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>結果の確認</title>
</head>
<body>
    <h2>入力結果の確認</h2>
    <table>
        <tr>
            <th>あなたの名前は?</th>
            <td id="resultName"></td>
        </tr>
        <tr>
            <th>あなたの年齢は?</th>
            <td id="resultAge"></td>
        </tr>
        <tr>
            <th>あなたの性別は?</th>
            <td id="resultGender"></td>
        </tr>
    </table>

    <script>
        // セッションストレージからデータを取得して表示
        document.getElementById('resultName').textContent = sessionStorage.getItem('name');
        document.getElementById('resultAge').textContent = sessionStorage.getItem('age');
        document.getElementById('resultGender').textContent = sessionStorage.getItem('gender');
    </script>
</body>
</html>

コードを解説

入力フォームについて

HTMLのフォームのパーツにはIDが振ってあります。
このID名でセッションストレージに値を格納していきます。
まず、ページのロードが完了したタイミングで該当ページの入力フォームに値があるかどうかをチェックして、値がある場合は入力フォームにセットします。
これはフォームを進めていく中でページを戻ったときに値が空にならないようにするためです。
セッションストレージからのデータの取得は『sessionStorage.getItem(‘name’);』を使用します。
値があるかどうかをチェックして値がある場合は『document.getElementById(‘name’).value』で入力フォームに値をセットします。
例えば名前の入力ページでは以下のようになります。

window.onload = function() {
    const storedName = sessionStorage.getItem('name');
    if (storedName) {
        document.getElementById('name').value = storedName;
    }
};

ラジオボタンの際は『document.querySelector(`input[name=”gender”][value=”${storedGender}”]`).checked』を使用ます。この辺りはコードの紹介を参考にしてください。

入力画面を進む際には『submit』ボタンをトリガーにして実行します。

document.getElementById('nameForm').addEventListener('submit', function(event) {});

この中に処理を書いていきます。
submitした際に値があるかどうかをチェックするため以下でフォーム送信のイベントをキャンセルします。

event.preventDefault();

IDから入力フォームに値があるかどうかをチェックします。
値が無ければアラートなどの処理、値があれば『sessionStorage.setItem(‘name’, name);』でセッションストレージに保存します。
その後、『window.location.href』で次のページに移動させます。

event.preventDefault();
const name = document.getElementById('name').value;
if (name === '') {
    alert('名前が入力されていません');
} else {
    sessionStorage.setItem('name', name);
    window.location.href = 'question_2.html'; // 2ページ目に移動
}

入力フォームの移動はこれの繰り返しになります。

結果を表示するページ

結果の表示は簡単でセッションストレージからID名を指定して取り出し、値をセットするだけです。

// セッションストレージからデータを取得して表示
document.getElementById('resultName').textContent = sessionStorage.getItem('name');
document.getElementById('resultAge').textContent = sessionStorage.getItem('age');
document.getElementById('resultGender').textContent = sessionStorage.getItem('gender');

デモでは結果の表示のみですが入力フォームに『document.getElementById(‘○○○’).value』でセットして送信させればメールフォームとしても使用できます。

まとめ

以上、『セッションストレージを使用して1ページずつ質問を回答させるフォームの作成方法』でした。
導入はとても簡単ですのでアンケートや診断フォームなどの制作の際はぜひ、参考にしてください。

テラ合同会社(東京都)

テラは2014年に東京都でスタートアップしたホームページ制作会社です。ホームページ制作以外にも広告運用、マーケティング、ブランディング、印刷物など幅広い領域をサポートしています。
コーポレートサイトはこちらをご覧ください。