Web Storage API

Store data in the browser with localStorage and sessionStorage

💾 What is Web Storage?

Web Storage API allows you to store data in the user's browser. It provides two storage mechanisms: localStorage (persistent) and sessionStorage (temporary). Data is stored as key-value pairs.


// Store data in localStorage (persists after browser closes)
localStorage.setItem('username', 'John');
localStorage.setItem('theme', 'dark');

// Store data in sessionStorage (cleared when tab closes)
sessionStorage.setItem('currentPage', 'home');

// Retrieve data
console.log('Username:', localStorage.getItem('username'));
                                    

Output:

Username: John

Data stored successfully in browser!

Storage Types

🏠

localStorage

Persistent storage across sessions

localStorage.setItem('key', 'value')
📑

sessionStorage

Temporary storage for current tab

sessionStorage.setItem('key', 'value')
🔍

getItem()

Retrieve stored data

localStorage.getItem('key')
🗑️

removeItem()

Delete specific data

localStorage.removeItem('key')

🔹 Basic Storage Operations

Here are the fundamental operations for web storage:

// STORING DATA
localStorage.setItem('name', 'Alice');
localStorage.setItem('age', '25');
localStorage.setItem('city', 'New York');

// RETRIEVING DATA
const name = localStorage.getItem('name');
const age = localStorage.getItem('age');
console.log(`${name} is ${age} years old`);

// CHECKING IF DATA EXISTS
if (localStorage.getItem('name') !== null) {
    console.log('Name is stored');
} else {
    console.log('Name not found');
}

// REMOVING SPECIFIC ITEM
localStorage.removeItem('age');

// CLEARING ALL DATA
localStorage.clear();

// GET NUMBER OF ITEMS
console.log('Items stored:', localStorage.length);

Storage Demo:

Alice is 25 years old

Name is stored

Items stored: 2

All operations completed successfully!

🔹 Storing Complex Data

Web Storage only stores strings, but you can store objects using JSON:

// Storing an object
const user = {
    name: 'Bob',
    age: 30,
    hobbies: ['reading', 'gaming', 'cooking'],
    preferences: {
        theme: 'dark',
        language: 'en'
    }
};

// Convert object to JSON string
localStorage.setItem('user', JSON.stringify(user));

// Retrieving and parsing object
const storedUser = localStorage.getItem('user');
if (storedUser) {
    const userObject = JSON.parse(storedUser);
    console.log('User name:', userObject.name);
    console.log('Hobbies:', userObject.hobbies.join(', '));
    console.log('Theme:', userObject.preferences.theme);
}

// Storing an array
const todoList = ['Buy groceries', 'Walk the dog', 'Study JavaScript'];
localStorage.setItem('todos', JSON.stringify(todoList));

// Retrieving array
const todos = JSON.parse(localStorage.getItem('todos') || '[]');
console.log('Todo items:', todos.length);

Complex Data Example:

User name: Bob

Hobbies: reading, gaming, cooking

Theme: dark

Todo items: 3

🔹 localStorage vs sessionStorage

Understanding the differences between storage types:

<button onclick="testLocalStorage()">Test localStorage</button>
<button onclick="testSessionStorage()">Test sessionStorage</button>
<button onclick="showStoredData()">Show All Data</button>
<div id="results"></div>

<script>
function testLocalStorage() {
    // Persists even after browser closes
    localStorage.setItem('persistent_data', 'This survives browser restart');
    localStorage.setItem('user_preference', 'dark_theme');
    alert('localStorage data saved!');
}

function testSessionStorage() {
    // Only lasts for current tab session
    sessionStorage.setItem('temp_data', 'This disappears when tab closes');
    sessionStorage.setItem('current_session', new Date().toISOString());
    alert('sessionStorage data saved!');
}

function showStoredData() {
    const results = document.getElementById('results');
    results.innerHTML = `
        <h3>localStorage:</h3>
        <p>Persistent: ${localStorage.getItem('persistent_data') || 'Not found'}</p>
        <p>Preference: ${localStorage.getItem('user_preference') || 'Not found'}</p>
        
        <h3>sessionStorage:</h3>
        <p>Temp: ${sessionStorage.getItem('temp_data') || 'Not found'}</p>
        <p>Session: ${sessionStorage.getItem('current_session') || 'Not found'}</p>
    `;
}
</script>

Storage Comparison:

Feature localStorage sessionStorage
Persistence Until manually cleared Until tab closes
Scope All tabs/windows Current tab only

🔹 Practical Example: User Preferences

A real-world example of storing user preferences:

<div class="settings-panel">
    <h3>User Settings</h3>
    <label>
        Theme: 
        <select id="theme-select" onchange="saveTheme()">
            <option value="light">Light</option>
            <option value="dark">Dark</option>
        </select>
    </label>
    
    <label>
        Font Size: 
        <input type="range" id="font-size" min="12" max="24" onchange="saveFontSize()">
        <span id="font-display">16px</span>
    </label>
    
    <button onclick="resetSettings()">Reset to Default</button>
</div>

<script>
// Load saved preferences on page load
window.addEventListener('load', function() {
    loadUserPreferences();
});

function saveTheme() {
    const theme = document.getElementById('theme-select').value;
    localStorage.setItem('user-theme', theme);
    applyTheme(theme);
}

function saveFontSize() {
    const fontSize = document.getElementById('font-size').value;
    localStorage.setItem('user-font-size', fontSize);
    document.getElementById('font-display').textContent = fontSize + 'px';
    document.body.style.fontSize = fontSize + 'px';
}

function loadUserPreferences() {
    // Load theme
    const savedTheme = localStorage.getItem('user-theme') || 'light';
    document.getElementById('theme-select').value = savedTheme;
    applyTheme(savedTheme);
    
    // Load font size
    const savedFontSize = localStorage.getItem('user-font-size') || '16';
    document.getElementById('font-size').value = savedFontSize;
    document.getElementById('font-display').textContent = savedFontSize + 'px';
    document.body.style.fontSize = savedFontSize + 'px';
}

function applyTheme(theme) {
    document.body.className = theme + '-theme';
}

function resetSettings() {
    localStorage.removeItem('user-theme');
    localStorage.removeItem('user-font-size');
    loadUserPreferences();
    alert('Settings reset to default!');
}
</script>

Settings Panel Demo:

User Settings

Theme:

Font Size: 16px

🔹 Storage Events and Limits

Handle storage events and understand limitations:

// Listen for storage changes (works across tabs)
window.addEventListener('storage', function(e) {
    console.log('Storage changed!');
    console.log('Key:', e.key);
    console.log('Old value:', e.oldValue);
    console.log('New value:', e.newValue);
    console.log('URL:', e.url);
});

// Check storage quota (approximate)
function checkStorageQuota() {
    let total = 0;
    for (let key in localStorage) {
        if (localStorage.hasOwnProperty(key)) {
            total += localStorage[key].length + key.length;
        }
    }
    console.log('Approximate storage used:', total, 'characters');
    
    // Most browsers allow 5-10MB per origin
    const estimatedMB = (total / 1024 / 1024).toFixed(2);
    console.log('Estimated size:', estimatedMB, 'MB');
}

// Safe storage with error handling
function safeSetItem(key, value) {
    try {
        localStorage.setItem(key, value);
        return true;
    } catch (e) {
        if (e.name === 'QuotaExceededError') {
            console.error('Storage quota exceeded!');
            // Handle quota exceeded (maybe clear old data)
        } else {
            console.error('Storage error:', e);
        }
        return false;
    }
}

Storage Management:

✅ Listen for storage changes across tabs

✅ Monitor storage usage

✅ Handle quota exceeded errors

✅ Typical limit: 5-10MB per domain

🧠 Test Your Knowledge

Which storage persists after the browser is closed?