【JavaScript】ページ間でデータの保持・受け渡し

手法持続期間ページ
遷移後
ブラウザ
再起動後
スコープ容量目安データ形式サーバー送信特徴
sessionStorageタブを閉じるまで同一タブ内約5MB程度文字列送信されない一時的なデータ保持
localStorage削除されるまで
(永続的)
同一オリジン内
すべてのタブ
約5MB程度文字列送信されない長期的なデータ保存
URLパラメータURLに含まれる間
(アクセス時のみ)
該当URL
リンク先
URL長に依存
(短い)
文字列送信:URLに含まれるページ間の簡易な受け渡し
window.nameタブを閉じるまで同一タブ内
ページ遷移間
比較的自由
(文字列)
文字列送信されないページ遷移時の一時保持
Cookie設定次第
(短期~永続)
同一ドメイン・パス内約4KB
(1つにつき)
文字列送信:HTTPリクエスト時セッション管理、認証、
トラッキング
IndexedDB削除されるまで
(永続的)
同一オリジン内数百MB~
数GB程度
JSON形式送信されない大量・複雑なデータの保存
Service Workerキャッシュの管理次第
(更新・削除されるまで)
同一オリジン内キャッシュ容量に依存レスポンス
(Blob等)
送信されないオフライン対応、
バックグラウンド処理、PWA

1. sessionStorage(セッションストレージ)

  • 同じタブ内のページ移動ではデータを保持 できる
  • ブラウザを閉じるとデータが消える
// データを保存
sessionStorage.setItem("key", "セッションデータ");

// データを取得
let value = sessionStorage.getItem("key");

// データを削除
sessionStorage.removeItem('key');

// すべてのデータを削除
sessionStorage.clear();
sessionStorage.setItem('username', 'Taro');

username というキーに Taro を保存する

let user = sessionStorage.getItem('username');

sessionStorage から username の値を取得

sessionStorage.removeItem('username');

username のデータを削除

let user = { name: "Taro", age: 25 };
sessionStorage.setItem('user', JSON.stringify(user));

オブジェクトを保存

let storedUser = JSON.parse(sessionStorage.getItem('user'));
console.log(storedUser.name); // "Taro"
console.log(storedUser.age);  // 25

オブジェクトを取得

  • JSON.stringify() でオブジェクトを文字列に変換して保存
  • JSON.parse() で文字列をオブジェクトに戻して取得
  • スコープ(有効範囲):同じタブ内でのみ有効(別のタブを開くとデータは共有されない)
  • 持続時間:タブを閉じるまで有効(ページをリロードしてもデータは保持)
  • 保存可能なデータ:文字列(String)のみ(オブジェクトは JSON.stringify() で保存)
  • サイズ制限:約5MB(ブラウザによる)
項目内容
ページ移動後〇(保持される)
ブラウザを閉じた後✖(消える)
使いやすさ◎(簡単)

2. localStorage(ローカルストレージ)

  • ページ移動してもデータを保持
  • ブラウザを閉じてもデータが残る
// データを保存
localStorage.setItem("key", "ローカルデータ");

// データを取得
let value = localStorage.getItem("key");

// データを削除
localStorage.removeItem('key');

// すべてのデータを削除
localStorage.clear();
localStorage.setItem('username', 'Taro');

username というキーに Taro を保存する

let user = localStorage.getItem('username');

localStorage から username の値を取得

localStorage.removeItem('username');

username のデータを削除

let user = { name: "Taro", age: 25 };
localStorage.setItem('user', JSON.stringify(user));

オブジェクトを保存

let storedUser = JSON.parse(localStorage.getItem('user'));
console.log(storedUser.name); // "Taro"
console.log(storedUser.age);  // 25

オブジェクトを取得

  • JSON.stringify() でオブジェクトを文字列に変換して保存
  • JSON.parse() で文字列をオブジェクトに戻して取得
  • スコープ(有効範囲):同じオリジン(ドメイン)内のすべてのページで共有
  • 持続時間:明示的に削除するまで(ブラウザを閉じても消えない)
  • 保存可能なデータ:文字列(String)のみ(オブジェクトは JSON.stringify() で保存)
  • サイズ制限:約5MB(ブラウザによる)
項目内容
ページ移動後〇(保持される)
ブラウザを閉じた後〇(残る)
使いやすさ◎(簡単)

3. クエリパラメータ (URL?key=value) を使う

  • URL にデータを含めて次のページに渡す方法
  • リロードやタブを変えてもデータを保持できる
  • URLをコピーするとデータも一緒に渡せる
// 現在のURLにデータを追加
window.location.href = "next_page.html?name=John&age=30";

// URLのクエリパラメータを取得
const params = new URLSearchParams(window.location.search);
let name = params.get("name");
let age = params.get("age");

console.log(name, age);  // "John", "30"
項目内容
ページ移動後〇(URLに含まれている限り保持)
ブラウザを閉じた後〇(URLを開けば保持)
使いやすさ△(URLが長くなる)

4. window.name を使う

  • ページ間でデータを保持できる
  • タブやウィンドウを閉じるとデータは消える
  • リロードしてもデータは維持される
// データを保存
window.name = "このデータはページ移動しても消えない";

// データを取得
console.log(window.name);
項目内容
ページ移動後〇(保持される)
ブラウザを閉じた後✖(消える)
使いやすさ△(あまり使われない)

5. Cookie(クッキー)

  • ページをまたいでデータを保持
  • 有効期限を設定すれば長期間保持可能
  • サーバーとの通信時にもデータを送信
// クッキーを保存(1日有効)
document.cookie = "user=John; max-age=86400; path=/";

// クッキーを取得
console.log(document.cookie);
  • path=/:指定したパス以下のページで有効(デフォルトは現在のページのみ)
  • domain=example.com:指定したドメインとそのサブドメインで有効
  • max-age=秒数:有効期限を秒単位で指定(例:3600 = 1時間)
  • expires=日付:有効期限を特定の日付に指定(Wed, 21 Mar 2025 12:00:00 GMT)
  • Secure:HTTPS のみで送信
  • HttpOnly:JavaScript からアクセス不可(サーバーのみ使用可)
  • SameSite=Strict:他サイトへのリクエスト時に Cookie を送らない(セキュリティ強化)
function getCookie(name) {
    let cookies = document.cookie.split("; ");
    for (let cookie of cookies) {
        let [key, value] = cookie.split("=");
        if (key === name) {
            return value;
        }
    }
    return null;
}
console.log(getCookie("username"));

特定の Cookie を取得

function deleteCookie(name) {
    document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/";
}
deleteCookie("username");

簡単な削除関数

  • 保存場所:ブラウザ に保存され、サーバーにも送信 される
  • スコープ(有効範囲):同じドメイン内のすべてのページで利用可能
  • 持続時間:明示的に削除するまで または 有効期限が切れるまで
  • サイズ制限:1つのCookieにつき 4KB(約4096バイト)まで
  • データの型:文字列のみ(オブジェクトは JSON.stringify() で保存)
項目内容
ページ移動後〇(保持される)
ブラウザを閉じた後〇(期限内なら残る)
使いやすさ△(書式が面倒)

6. IndexedDB

  • 大容量データ(数MB~GB単位)を保持可能
  • オブジェクトデータを扱いやすい
  • PWA(Progressive Web App)などで使われる

IndexedDB の基本構造

IndexedDB は、RDB(リレーショナルデータベース)のようにデータベース → オブジェクトストア(テーブルのようなもの) → レコード(データ) という階層構造を持ちます。

データベースDB
 ├─ オブジェクトストアテーブルのようなもの
 │    ├─ キー主キー
 │    ├─ JSONデータ

データの読み書きには「トランザクション」が必要です。トランザクションとは、一連の処理をまとめて実行し、途中でエラーが発生したら巻き戻せる仕組みです。

// データベースを作成する

const request = indexedDB.open("MyDatabase", 1); // DB名「MyDatabase」、バージョン「1」

request.onupgradeneeded = function (event) {
    let db = event.target.result;
    if (!db.objectStoreNames.contains("users")) {
        db.createObjectStore("users", { keyPath: "id" }); // "users"テーブルを作成(idをキーに)
    }
};

request.onsuccess = function (event) {
    console.log("DB接続成功");
};

request.onerror = function (event) {
    console.error("DB接続エラー", event);
};

open() は バージョン番号が異なるとonupgradeneeded が実行される(スキーマ変更時)

// データを追加(登録・更新)する

function addUser(id, name, age) {
    let db = request.result;
    let transaction = db.transaction(["users"], "readwrite"); // 書き込みモード
    let store = transaction.objectStore("users"); // "users" テーブル

    let user = { id: id, name: name, age: age };
    let addRequest = store.put(user); // put()は既存データがあれば上書きする

    addRequest.onsuccess = function () {
        console.log("データ追加成功", user);
    };

    addRequest.onerror = function (event) {
        console.error("データ追加失敗", event);
    };
}

addUser(1, "太郎", 25);

put() id が重複していた場合は上書きadd() はエラーになる。

// データを取得する

function getUser(id) {
    let db = request.result;
    let transaction = db.transaction(["users"], "readonly");
    let store = transaction.objectStore("users");

    let getRequest = store.get(id);

    getRequest.onsuccess = function () {
        if (getRequest.result) {
            console.log("データ取得成功", getRequest.result);
        } else {
            console.log("データが見つかりません");
        }
    };

    getRequest.onerror = function (event) {
        console.error("データ取得失敗", event);
    };
}

getUser(1);

キーを指定してデータを取得できる(検索処理)

// データを削除する

function deleteUser(id) {
    let db = request.result;
    let transaction = db.transaction(["users"], "readwrite");
    let store = transaction.objectStore("users");

    let deleteRequest = store.delete(id);

    deleteRequest.onsuccess = function () {
        console.log(`ID:${id} のデータを削除しました`);
    };

    deleteRequest.onerror = function (event) {
        console.error("データ削除失敗", event);
    };
}

deleteUser(1);

delete(id) を使って特定のデータを削除できる

// 全データを取得する

function getAllUsers() {
    let db = request.result;
    let transaction = db.transaction(["users"], "readonly");
    let store = transaction.objectStore("users");

    let getAllRequest = store.getAll();

    getAllRequest.onsuccess = function () {
        console.log("全データ取得成功", getAllRequest.result);
    };

    getAllRequest.onerror = function (event) {
        console.error("全データ取得失敗", event);
    };
}

getAllUsers();

getAll() を使うと全データを一括取得できる

  • 保存場所:ブラウザ(クライアント側)
  • データ形式:オブジェクト(JSON 形式)
  • 容量制限:数百MB〜数GB(ブラウザによる)
  • 非同期処理:IndexedDBPromise または async/await で扱う
  • トランザクション:データを安全に管理できる(ACID特性あり)
項目内容
ページ移動後〇(保持される)
ブラウザを閉じた後〇(消えない)
使いやすさ✖(難しい)

7. Service Worker(高度な方法)

  • キャッシュを利用してデータを保持
  • オフライン時でもデータを提供可能
  • プッシュ通知やバックグラウンド処理もできる
  • PWA でよく使われる

index.html(Service Worker を登録するページ)

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Service Worker のテスト</title>
</head>
<body>
    <h1>Service Worker のデモ</h1>
    <p>このページでは Service Worker の動作を確認できます。</p>
    
    <script src="index.js"></script>  <!-- JavaScript を読み込む -->
</body>
</html>

index.js(Service Worker を登録するスクリプト)

// ブラウザが Service Worker をサポートしているか確認
if ('serviceWorker' in navigator) {
    navigator.serviceWorker.register('/sw.js')  // sw.js を登録
        .then(registration => {
            console.log("Service Worker 登録成功!", registration);
        })
        .catch(error => {
            console.log("Service Worker 登録失敗:", error);
        });
}

sw.js(Service Worker のコード)

const CACHE_NAME = 'my-cache-v1';
const CACHE_URLS = [
  '/',            // index.html
  '/index.js',    // メインの JavaScript
  '/style.css',   // CSS
  '/offline.html' // オフライン用ページ
];

// インストールイベント(キャッシュを保存)
self.addEventListener('install', event => {
  event.waitUntil(
    caches.open(CACHE_NAME).then(cache => {
      console.log("キャッシュ保存中...");
      return cache.addAll(CACHE_URLS);
    })
  );
});

// フェッチイベント(リクエストをキャッシュから返す)
self.addEventListener('fetch', event => {
  event.respondWith(
    caches.match(event.request).then(response => {
      return response || fetch(event.request).catch(() => caches.match('/offline.html'));
    })
  );
});

// アクティベートイベント(古いキャッシュを削除)
self.addEventListener('activate', event => {
  event.waitUntil(
    caches.keys().then(keys => {
      return Promise.all(
        keys.filter(key => key !== CACHE_NAME).map(key => caches.delete(key))
      );
    })
  );
});
Warning
  • HTTPS 環境でのみ動作(ローカルでは localhost ならOK)
  • Service Worker はバックグラウンドで動くため、DOMを直接操作できない
  • 仕様が複雑なので、簡単なデータ保存には localStorage や sessionStorage の方が適している