上一篇
html5购物车源代码本地存储
- 行业动态
- 2025-05-11
- 4
基于HTML5 localStorage实现购物车功能,通过JS操作键值对存储商品数据,支持页面刷新后自动恢复购物车内商品及数量,需结合JSON序列化与解析
功能需求分析
购物车需实现以下核心功能:
- 添加商品(自动识别重复商品)
- 删除商品
- 修改商品数量
- 实时计算总价
- 数据持久化存储(关闭页面后数据不丢失)
技术选型说明
技术要素 | 选择原因 |
---|---|
HTML5 | 提供结构化商品展示框架 |
CSS3 | 实现基础样式与交互反馈 |
JavaScript | 处理核心逻辑与本地存储操作 |
localStorage | 实现数据持久化存储 |
代码结构设计
<!-商品展示区 --> <div id="product-list"> <div class="product" data-id="001"> <h3>商品名称</h3> <p>¥99.00</p> <button class="add-btn">加入购物车</button> </div> <!-更多商品... --> </div> <!-购物车区域 --> <div id="cart"> <table> <thead> <tr> <th>商品</th> <th>单价</th> <th>数量</th> <th>小计</th> <th>操作</th> </tr> </thead> <tbody id="cart-items"></tbody> </table> <div id="cart-summary"> 总计:<span id="total-price">¥0.00</span> </div> </div>
核心功能实现
本地存储管理
// 读取购物车数据 function getCart() { const data = localStorage.getItem('shoppingCart'); return data ? JSON.parse(data) : []; } // 保存购物车数据 function saveCart(cart) { localStorage.setItem('shoppingCart', JSON.stringify(cart)); }
添加商品逻辑
document.querySelectorAll('.add-btn').forEach(btn => { btn.addEventListener('click', function() { const productId = this.closest('.product').dataset.id; const cart = getCart(); // 检查商品是否已存在 const existing = cart.find(item => item.id === productId); if (existing) { existing.quantity += 1; // 增量更新 } else { const newItem = { id: productId, name: this.closest('.product').querySelector('h3').textContent, price: parseFloat(this.closest('.product').querySelector('p').textContent), quantity: 1 }; cart.push(newItem); } saveCart(cart); renderCart(cart); }); });
渲染购物车
function renderCart(cart) { const tbody = document.getElementById('cart-items'); tbody.innerHTML = ''; // 清空现有内容 let total = 0; cart.forEach(item => { const row = document.createElement('tr'); row.innerHTML = ` <td>${item.name}</td> <td>${item.price.toFixed(2)}</td> <td> <input type="number" value="${item.quantity}" min="1" class="quantity" data-id="${item.id}"> </td> <td>${(item.price item.quantity).toFixed(2)}</td> <td><button class="delete-btn" data-id="${item.id}">删除</button></td> `; tbody.appendChild(row); total += item.price item.quantity; }); document.getElementById('total-price').textContent = total.toFixed(2); }
数量修改与删除
// 数量输入处理 document.getElementById('cart-items').addEventListener('input', function(e) { if (e.target.classList.contains('quantity')) { const cart = getCart(); const item = cart.find(i => i.id === e.target.dataset.id); item.quantity = parseInt(e.target.value) || 1; // 防止输入0或负数 saveCart(cart); renderCart(cart); } }); // 删除商品处理 document.getElementById('cart-items').addEventListener('click', function(e) { if (e.target.classList.contains('delete-btn')) { const cart = getCart(); const index = cart.findIndex(i => i.id === e.target.dataset.id); if (index > -1) cart.splice(index, 1); saveCart(cart); renderCart(cart); } });
测试与优化建议
测试场景 | 验证要点 |
---|---|
首次添加商品 | 购物车显示正确商品信息,localStorage有数据 |
重复添加同一商品 | 商品数量递增而非新增条目 |
修改商品数量 | 总价实时更新,输入非数字时自动修正为1 |
删除商品 | 对应条目消失,总价重新计算 |
页面刷新 | 购物车数据完整保留 |
优化方向:
- 增加商品图片展示(需扩展数据结构)
- 添加全选/取消全选功能
- 实现持久化存储容量检测(localStorage约5MB限制)
- 增加过期时间设置(sessionStorage适用临时数据)
相关问题与解答
Q1:如何扩展支持商品多规格选择?
A1:需改造数据结构,在商品对象中增加规格属性。
{ id: '001', name: '运动鞋', price: 99.00, spec: { color: '红色', size: '42' }, // 新增规格属性 quantity: 1 }
同时在渲染时展示规格信息,并在添加商品时记录用户选择的规格组合。
Q2:如何处理多设备同步购物车数据?
A2:本地存储仅能在当前设备生效,如需多设备同步,需:
- 将购物车数据上传至服务器
- 使用用户认证系统关联数据
- 在其他设备登录时从服务器获取数据
可结合Web API与后端服务(如Node.js+