上一篇
html购物网站购物车怎么写
- 行业动态
- 2025-04-26
- 3
, , , 商品A加入购物车 , , , function addCart(name,price){ , let cart=JSON.parse(localStorage.getItem(‘cart’)||'[]’); , cart.push({name,price,num:1}); , localStorage.setItem(‘cart’,JSON.stringify(cart)); , renderCart(); , } , function renderCart(){ , let cart=JSON.parse(localStorage.getItem(‘cart’)||'[]’); , let total=cart.reduce((sum,item)=>sum+item.priceitem.num,0); , document.getElementById(‘cart’).innerHTML=
总计${total}元
; , } , , ,
购物车结构设计
购物车页面通常由以下元素组成:
- 商品列表:展示已选商品的信息(名称、单价、数量、小计)
- 操作按钮:修改数量、删除商品
- 总价计算:实时统计商品总价
- 结算按钮:跳转至支付页面
基础HTML结构
<div id="cart-container"> <table id="cart-table"> <thead> <tr> <th>商品名称</th> <th>单价</th> <th>数量</th> <th>小计</th> <th>操作</th> </tr> </thead> <tbody> <!-商品行通过JS动态生成 --> </tbody> </table> <div class="cart-summary"> 总价:<span id="total-price">¥0.00</span> <button id="checkout-btn">结算</button> </div> </div>
核心功能实现(JavaScript)
数据存储结构
使用localStorage
保存购物车数据:
// 初始化购物车数据 let cart = JSON.parse(localStorage.getItem('cart')) || [];
渲染购物车表格
function renderCart() { const tbody = document.querySelector('#cart-table tbody'); tbody.innerHTML = ''; // 清空现有内容 cart.forEach((item, index) => { const subtotal = item.price item.quantity; const row = ` <tr data-index="${index}"> <td>${item.name}</td> <td>¥${item.price.toFixed(2)}</td> <td> <button class="decrease">-</button> <input type="number" value="${item.quantity}" min="1" class="quantity"/> <button class="increase">+</button> </td> <td>¥${subtotal.toFixed(2)}</td> <td><button class="remove">删除</button></td> </tr> `; tbody.insertAdjacentHTML('beforeend', row); }); updateTotalPrice(); }
操作事件绑定
document.getElementById('cart-table').addEventListener('click', (e) => { const target = e.target; const rowIndex = target.closest('tr').dataset.index; if (target.classList.contains('remove')) { // 删除商品 cart.splice(rowIndex, 1); saveCart(); renderCart(); } }); document.getElementById('cart-table').addEventListener('input', (e) => { const target = e.target; const rowIndex = target.closest('tr').dataset.index; if (target.classList.contains('quantity')) { const newQty = parseInt(target.value) || 1; cart[rowIndex].quantity = newQty; saveCart(); renderCart(); } });
总价计算函数
function updateTotalPrice() { const total = cart.reduce((sum, item) => sum + item.price item.quantity, 0); document.getElementById('total-price').textContent = `¥${total.toFixed(2)}`; }
数据持久化
function saveCart() { localStorage.setItem('cart', JSON.stringify(cart)); }
商品添加逻辑(示例)
// 假设从商品详情页添加商品到购物车 function addToCart(product) { const existingItem = cart.find(item => item.id === product.id); if (existingItem) { // 如果商品已存在,增加数量 existingItem.quantity += product.quantity; } else { // 新商品直接添加 cart.push({ id: product.id, name: product.name, price: product.price, quantity: product.quantity }); } saveCart(); renderCart(); }
关键功能对照表
功能 | 实现方式 |
---|---|
商品数量修改 | 监听input变化,实时更新购物车数据并重新计算总价 |
商品删除 | 通过data-index定位数据项,删除数组元素并更新视图 |
总价计算 | 使用Array.reduce累加所有商品小计 |
数据持久化 | 将购物车数组转为JSON字符串存入localStorage |
重复商品合并 | 添加时检查商品ID,存在则累加数量,不存在则新建条目 |
相关问题与解答
Q1:如何防止用户输入非数字或负数数量?
A1:在输入事件中添加验证逻辑:
const quantityInput = target.querySelector('.quantity'); quantityInput.addEventListener('input', (e) => { let value = parseInt(e.target.value); value = Math.max(1, value) || 1; // 确保最小值为1 e.target.value = value; cart[rowIndex].quantity = value; saveCart(); renderCart(); });
Q2:如何实现购物车与后端数据同步?
A2:需将saveCart()
和loadCart()
改为API请求:
// 保存购物车到服务器 async function saveCart() { await fetch('/api/cart', { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify(cart) }); } // 加载购物车数据 async function loadCart() { const response = await fetch('/api/cart'); cart = await response.