← HTML5 表单控件与属性详解 HTML5 Messaging API 跨域通信 →

HTML5 本地存储

原创 2025-09-13 HTML5 已有人查阅

HTML5 本地存储与Cookie对比详解

概述

HTML5 本地存储(Web Storage)是现代Web开发中重要的客户端数据存储方案。与传统的Cookie相比,本地存储在容量、性能和易用性方面都有显著优势。本章课程将深入解析本地存储的工作原理、使用方法以及与Cookie的区别。

本地存储与Cookie对比

存储容量对比

特性 Cookie 本地存储
存储容量 4KB左右 5-10MB
数据传递 每次HTTP请求自动携带 仅限客户端,不自动发送
生命周期 可设置过期时间 长久或会话期间
访问权限 同源页面 同源页面

安全性对比

本地存储数据遵循同源策略(Same-origin policy),只有来自同一域名、协议和端口的页面才能访问相应的存储数据,这提供了基本的安全保障。

本地存储基础

两种存储类型

HTML5提供了两种存储机制:

  1. sessionStorage - 会话存储

    • 数据仅在当前浏览器会话期间有效

    • 关闭浏览器标签页后数据自动清除

    • 同一窗口内的iframe和弹出窗口可共享

  2. localStorage - 本地存储

    • 数据长久存储,除非手动删除

    • 同一域名下的所有页面可共享

    • 浏览器重启后数据仍然存在

基本操作示例

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>代码号编程 - 本地存储示例</title>
</head>
<body>
    <h1>本地存储操作演示</h1>
    
    <script>
        // 设置存储项
        localStorage.setItem("userName", "代码号学员");
        localStorage.setItem("learningProgress", "75%");
        
        sessionStorage.setItem("sessionToken", "abc123xyz");
        
        // 读取存储项
        const userName = localStorage.getItem("userName");
        const progress = localStorage.getItem("learningProgress");
        console.log(`欢迎 ${userName},您的学习进度是: ${progress}`);
        
        // 删除单个存储项
        localStorage.removeItem("learningProgress");
        
        // 清空所有存储项
        // localStorage.clear();
        
        // 获取存储数量
        const storageSize = localStorage.length;
        console.log(`当前存储了 ${storageSize} 个数据项`);
        
        // 遍历所有存储项
        for(let i = 0; i < localStorage.length; i++) {
            const key = localStorage.key(i);
            const value = localStorage.getItem(key);
            console.log(`${key}: ${value}`);
        }
    </script>
</body>
</html>

实战应用示例

示例1:用户偏好设置存储

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>代码号学习平台 - 偏好设置</title>
</head>
<body>
    <h1>学习偏好设置</h1>
    
    <form id="preferenceForm">
        <label>
            主题模式:
            <select id="themeSelect">
                <option value="light">浅色模式</option>
                <option value="dark">深色模式</option>
            </select>
        </label>
        <br><br>
        
        <label>
            字体大小:
            <input type="range" id="fontSize" min="12" max="24" value="16">
        </label>
        <br><br>
        
        <button type="submit">保存设置</button>
    </form>
    
    <script>
        // 页面加载时读取保存的设置
        document.addEventListener('DOMContentLoaded', function() {
            const savedTheme = localStorage.getItem('themePreference');
            const savedFontSize = localStorage.getItem('fontSizePreference');
            
            if(savedTheme) {
                document.getElementById('themeSelect').value = savedTheme;
                applyTheme(savedTheme);
            }
            
            if(savedFontSize) {
                document.getElementById('fontSize').value = savedFontSize;
                document.body.style.fontSize = savedFontSize + 'px';
            }
        });
        
        // 保存用户设置
        document.getElementById('preferenceForm').addEventListener('submit', function(e) {
            e.preventDefault();
            
            const theme = document.getElementById('themeSelect').value;
            const fontSize = document.getElementById('fontSize').value;
            
            localStorage.setItem('themePreference', theme);
            localStorage.setItem('fontSizePreference', fontSize);
            
            applyTheme(theme);
            document.body.style.fontSize = fontSize + 'px';
            
            alert('设置已保存!');
        });
        
        function applyTheme(theme) {
            if(theme === 'dark') {
                document.body.style.backgroundColor = '#333';
                document.body.style.color = '#fff';
            } else {
                document.body.style.backgroundColor = '#fff';
                document.body.style.color = '#000';
            }
        }
    </script>
</body>
</html>

示例2:购物车数据持久化

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>代码号编程商城 - 购物车</title>
</head>
<body>
    <h1>编程教程购物车</h1>
    
    <div id="courseList">
        <div class="course">
            <h3>HTML5与CSS3实战</h3>
            <button onclick="addToCart('HTML5与CSS3实战', 299)">加入购物车 - ¥299</button>
        </div>
        
        <div class="course">
            <h3>JavaScript高级编程</h3>
            <button onclick="addToCart('JavaScript高级编程', 399)">加入购物车 - ¥399</button>
        </div>
        
        <div class="course">
            <h3>前端框架综合教程</h3>
            <button onclick="addToCart('前端框架综合教程', 499)">加入购物车 - ¥499</button>
        </div>
    </div>
    
    <hr>
    
    <h2>购物车内容</h2>
    <ul id="cartItems"></ul>
    <p>总价: ¥<span id="totalPrice">0</span></p>
    
    <button onclick="clearCart()">清空购物车</button>
    
    <script>
        // 初始化购物车
        let cart = JSON.parse(localStorage.getItem('shoppingCart')) || [];
        updateCartDisplay();
        
        // 添加商品到购物车
        function addToCart(name, price) {
            cart.push({name, price});
            localStorage.setItem('shoppingCart', JSON.stringify(cart));
            updateCartDisplay();
        }
        
        // 更新购物车显示
        function updateCartDisplay() {
            const cartList = document.getElementById('cartItems');
            const totalElement = document.getElementById('totalPrice');
            
            cartList.innerHTML = '';
            let total = 0;
            
            cart.forEach((item, index) => {
                total += item.price;
                
                const li = document.createElement('li');
                li.textContent = `${item.name} - ¥${item.price}`;
                
                const removeBtn = document.createElement('button');
                removeBtn.textContent = '删除';
                removeBtn.onclick = () => removeFromCart(index);
                
                li.appendChild(removeBtn);
                cartList.appendChild(li);
            });
            
            totalElement.textContent = total;
        }
        
        // 从购物车移除商品
        function removeFromCart(index) {
            cart.splice(index, 1);
            localStorage.setItem('shoppingCart', JSON.stringify(cart));
            updateCartDisplay();
        }
        
        // 清空购物车
        function clearCart() {
            cart = [];
            localStorage.removeItem('shoppingCart');
            updateCartDisplay();
        }
    </script>
</body>
</html>

存储事件监听

本地存储支持事件监听机制,可以在数据发生变化时通知其他窗口或标签页。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>代码号编程 - 存储事件示例</title>
</head>
<body>
    <h1>多窗口数据同步演示</h1>
    
    <input type="text" id="messageInput" placeholder="输入消息">
    <button onclick="saveMessage()">保存消息</button>
    
    <h2>接收到的消息:</h2>
    <div id="messageDisplay"></div>
    
    <script>
        // 监听存储事件
        window.addEventListener('storage', function(e) {
            if(e.key === 'userMessage') {
                document.getElementById('messageDisplay').textContent = 
                    `收到新消息: ${e.newValue} (来自: ${e.url})`;
            }
        });
        
        // 保存消息到本地存储
        function saveMessage() {
            const message = document.getElementById('messageInput').value;
            localStorage.setItem('userMessage', message);
            document.getElementById('messageInput').value = '';
            
            // 显示自己发送的消息
            document.getElementById('messageDisplay').textContent = 
                `消息已发送: ${message}`;
        }
    </script>
</body>
</html>

本节课程知识要点

  1. 存储机制选择:根据数据持久性需求选择sessionStorage或localStorage

  2. 容量优势:本地存储相比Cookie有更大的存储空间

  3. 安全性:遵循同源策略,保障数据安全

  4. 数据格式:存储复杂数据时使用JSON序列化和反序列化

  5. 事件通信:利用storage事件实现多窗口数据同步

  6. 适用场景:用户偏好设置、表单数据暂存、购物车等场景

注意事项

  1. 敏感信息:避免在本地存储中保存敏感信息如密码、令牌等

  2. 存储限制:注意浏览器对存储空间的限制,通常为5-10MB

  3. 数据类型:存储的值总是字符串,复杂对象需JSON转换

  4. 兼容性:大多数现代浏览器支持本地存储,但需考虑兼容性处理

总结

HTML5本地存储提供了强大而灵活的客户端数据存储方案,相比传统Cookie在容量和易用性方面有明显优势。通过合理运用sessionStorage和localStorage,开发者可以创建更丰富、响应更快的Web应用,提升用户体验。

在实际开发中,建议根据具体需求选择合适的存储方案,并遵循数据安全实践,确保应用程序的可靠性和安全性。


文档更新日期:2025年9月13日
更多编程教程请访问:HTML CSS 教程

← HTML5 表单控件与属性详解 HTML5 Messaging API 跨域通信 →
分享笔记 (共有 篇笔记)
验证码:
微信公众号