javascript 实现购物车

购物车实现3种方式

1、利用cookie

优点:不占用服务器资源,可以永远保存,不用考虑失效的问题
缺点: 对购买商品的数量是有限制的,存放数据的大小 不可以超过2k,用户如果禁用cookie那么就木有办法购买商品,卓越网实现了用户当用户禁用cookie,也可以购买。

2、利用 session

优点:用户禁用cookie,也可以购物
缺点:占用服务器资源,要考虑session失效的问题

3、利用数据库

优点:可以记录用户的购买行为,便于数据分析用户的喜好,推荐商品
缺点:给数据库造成太大的压力,如果数据量很大的话。


购物车需求分析

1、可以添加商品到购物车中

2、可以删除购物车中的商品

3、可以清空购物车

4、可以更新购物车的商品

5、可以结算





/***
* 购物车操作模块
*
*/
var shopCart = function(window){

"use strict";
//全局变量
// note new new Date("2020-12-23") 在ie下面报错,不支持这样的语法
var items = [],cartName='kuaidian_shop_cart',expires = new Date( new Date().getTime()+86400000*30 )
,debug = true,decimal = 2;
var options = {
'cartName' : cartName, //cookie的名字
'expires' : expires, //cookie失效的时间
'debug' : debug, //是否打印调试信息
'decimal' : decimal, //钱的精确到小数点后的位数
'callback' : undefined
};
//商品类
/***
* @name item
* @example
item(sku, name, price, quantity)
* @params {string} sku 商品的标示
* @params {string} name 商品的名字
* @param {number} price 商品的价格
* @param {number} quantity 商品的数量
*/
function item(sku, name, price, quantity){
this.sku = sku;
this.name = name;
this.price = price;
this.quantity = quantity;
}


//暴露给外部的接口方法
return {
inited : false,
init: function(option){
//判断用户是否禁用cookie
if(!window.navigator.cookieEnabled ){
alert('您的浏览器不支持cookie无法使用购物车!,请设置允许设置cookie。');
return false;
}
//从cookie中获取购物车中的数据
this.inited = true;
if(option){
extend(options,option);
}
var cookie = getCookie(options.cartName);
if(typeof cookie === 'undefined'){
setCookie(options.cartName,'',options.expires);
}else{
//每个item之间用&分开,item的属性之间用|分割
var cookie = getCookie(options.cartName);
if(cookie){
var cItems = cookie.split('&');
for(var i=0,l=cItems.length;i<l;i++){
var cItem = cItems[i].split('|');
var item = {};
item.sku = cItem[0] || '';
item.name = cItem[1] || '';
item.price = cItem[2] || '';
item.quantity = cItem[3] || '';
items.push(item);
};
};

};
},
findItem: function(sku){//根据sku标示查找商品
//如果木有提供sku,则返回所有的item
if(sku){
for(var i=0,l=items.length;i<l;i++){
var item = items[i];
if(item.sku === sku){
return item;
}
}
return undefined;
}else{
return items;
}

},
getItemIndex : function(sku){ //获取item在items的数组下标
for(var i=0,l=items.length;i<l;i++){
var item = items[i];
if(item.sku == sku){
return i;
}
}
//木有找到返回-1
return -1;
},
addItem: function(item){ //增加一个新商品到购物车
//添加一个商品
if(this.findItem(item.sku)){
if(options.debug){
_log('商品已经存在了');
return false;
}
}
items.push(item);
_saveCookie();
return true;
},
delItem: function(sku){ //从购物车中删除一个商品
//删除一个商品
var index = this.getItemIndex(sku);
if(index > -1){
items.splice(index,1);
_saveCookie();
}else{
if(options.debug){
_log('商品不存在');
return false;
}
}
},
updateQuantity: function(item){ //更新商品的数量
//更新一个商品
var index = this.getItemIndex(item.sku);
if(index > -1){
items[index].quantity = item.quantity;
_saveCookie();
}else{
if(options.debug){
_log('商品不存在');
return false;
}
}
},
emptyCart: function(){
//清空数组
items.length = 0;
_saveCookie();
},
checkout: function(){
//点击结算后的回调函数
if(options.callback){
options.callback();
}
},
getTotalCount: function(sku){
//获取购物车商品的数量,如果传某个商品的id,那么就返回该商品的数量
var totalCount = 0;
if(sku){
totalCount = (typeof this.findItem(sku) === 'undefined' ? 0 : this.findItem(sku).quantity );
}else{
for(var i=0,l=items.length;i<l;i++){
totalCount += (parseInt(items[i].quantity) === 'NaN' ? 0 : parseInt(items[i].quantity )) ;
}
}
return totalCount;
},
getTotalPrice : function(sku){
//获取购物车商品的总价格 ,如果传某个商品的id,那么就返回该商品的总价格
var totalPrice = 0.0;
if(sku){
var num = parseInt((typeof this.findItem(sku) === 'undefined' ? 0 : this.findItem(sku).quantity )),
price = parseFloat((typeof this.findItem(sku) === 'undefined' ? 0 : this.findItem(sku).price ));
num = num=== 'NaN' ? 0 : num;
price = price === 'NaN' ? 0 : price;
totalPrice = price * num;
}else{
for(var i=0,l=items.length;i<l;i++){
totalPrice += (parseFloat(items[i].price ) * parseInt(items[i].quantity));
}
}
return totalPrice.toFixed(options.decimal);
},
getCookie : getCookie,
setCookie : setCookie
};


/**
* 设置cookie
* @name setCookie
* @example
setCookie(name, value[, options])
* @params {string} name 需要设置Cookie的键名
* @params {string} value 需要设置Cookie的值
* @params {string} [path] cookie路径
* @params {Date} [expires] cookie过期时间
*/
function setCookie(name, value, options) {
options = options || {};
var expires = options.expires || null;
var path = options.path || "/";
var domain = options.domain || document.domain;
var secure = options.secure || null;
/**
document.cookie = name + "=" + escape(value)
+ ((expires) ? "; expires=" + expires.toGMTString() : "")
+ "; path=" + path
+ "; domain=" + domain ;
+ ((secure) ? "; secure" : "");
*/
var str = name + "=" + encodeURIComponent(value)
+ ((expires) ? "; expires=" + expires.toGMTString() : "")
+ "; path=/";
document.cookie = str;
};

/**
* 获取cookie的值
* @name getCookie
* @example
getCookie(name)
* @param {string} name 需要获取Cookie的键名
* @return {string|null} 获取的Cookie值,获取不到时返回null
*/
function getCookie(name) {
var arr = document.cookie.match(new RegExp("(^| )" + name
+ "=([^;]*)(;|$)"));
if (arr != null) {
return decodeURIComponent(arr[2]);
}
return undefined;
};

//***********************私有方法********************/
function _saveCookie(){
var i=0,l=items.length;
if(l>0){
var tItems = [];
for(;i<l;i++){
var item = items[i];
tItems[i] = item.sku + '|' +item.name + '|' + item.price + '|' + item.quantity;
};
var str = tItems.join('&');
setCookie(options.cartName, str, {expires:options.expires});
}else{
setCookie(options.cartName, '', {expires:options.expires});
}

};

//***********************工具方法********************/
//显示调试信息
function _log(info){
if(typeof console != 'undefined'){
console.log(info);
}
};
//继承属性
function extend(destination, source) {
for ( var property in source) {
destination[property] = source[property];
}
};
}(typeof window === 'undifined' ? this: window);




在页面中引用

1、导入js文件

2、初始化shopCart对象


shopCart.init({
'decimal' : 4
});
shopCart.addItem(item); //添加商品到购物车
shopCart.delItem('12345'); //从购物车中删除商品
shopCart.emptyCart(); //清空购物车
item.quantity = 4;
alert(shopCart.getTotalPrice()); //获取购物车中的数量
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现购物的基本流程如下: 1. 创建一个空的购物数组,用于存放商品信息。 2. 在页面中展示商品列表,并为每个商品添加“加入购物”按钮。 3. 点击“加入购物”按钮时,获取当前商品的信息(如商品ID、名称、价格等),将其添加到购物数组中。 4. 在页面中展示购物列表,包括每个商品的信息以及数量、总价等信息。 5. 实现购物中商品数量、总价的实时更新,例如增加或减少商品数量时,购物列表应该实时更新。 6. 实现删除购物中的商品,同时更新购物列表和购物数组。 7. 实现结算功能,包括计算购物中所有商品的总价、应付款项等信息。 下面是一个简单的示例代码: HTML部分: ``` <!-- 商品列表 --> <div id="product-list"> <div class="product" data-id="1" data-name="商品1" data-price="10.00"> <h3>商品1</h3> <p>价格:10.00元</p> <button class="add-to-cart">加入购物</button> </div> <div class="product" data-id="2" data-name="商品2" data-price="20.00"> <h3>商品2</h3> <p>价格:20.00元</p> <button class="add-to-cart">加入购物</button> </div> ... </div> <!-- 购物列表 --> <div id="cart-list"> <h2>购物</h2> <table> <thead> <tr> <th>商品名称</th> <th>单价</th> <th>数量</th> <th>总价</th> <th>操作</th> </tr> </thead> <tbody> </tbody> </table> <div id="cart-summary"> <p>总价:<span id="total-price">0.00</span>元</p> <button id="checkout">结算</button> </div> </div> ``` JS部分: ``` // 购物数组 var cart = []; // 获取商品列表和购物列表元素 var productList = document.getElementById('product-list'); var cartList = document.getElementById('cart-list'); // 添加商品到购物 function addToCart(id, name, price) { // 检查购物中是否已存在该商品 for (var i = 0; i < cart.length; i++) { if (cart[i].id === id) { cart[i].quantity++; return; } } // 如果购物中不存在该商品,则添加到购物数组中 cart.push({ id: id, name: name, price: price, quantity: 1 }); } // 渲染购物列表 function renderCart() { // 清空购物列表 cartList.querySelector('tbody').innerHTML = ''; // 遍历购物数组,生成购物列表 for (var i = 0; i < cart.length; i++) { var item = cart[i]; var tr = document.createElement('tr'); tr.innerHTML = ` <td>${item.name}</td> <td>${item.price.toFixed(2)}</td> <td>${item.quantity}</td> <td>${(item.price * item.quantity).toFixed(2)}</td> <td><button class="remove-from-cart" data-id="${item.id}">删除</button></td> `; cartList.querySelector('tbody').appendChild(tr); } // 更新总价 var totalPrice = cart.reduce((sum, item) => sum + item.price * item.quantity, 0); document.getElementById('total-price').textContent = totalPrice.toFixed(2); } // 商品列表添加点击事件 productList.addEventListener('click', function(event) { var target = event.target; if (target.classList.contains('add-to-cart')) { var product = target.closest('.product'); var id = product.dataset.id; var name = product.dataset.name; var price = parseFloat(product.dataset.price); addToCart(id, name, price); renderCart(); } }); // 购物列表添加点击事件 cartList.addEventListener('click', function(event) { var target = event.target; if (target.classList.contains('remove-from-cart')) { var id = target.dataset.id; cart = cart.filter(item => item.id !== id); renderCart(); } }); // 结算按钮添加点击事件 document.getElementById('checkout').addEventListener('click', function(event) { var totalPrice = cart.reduce((sum, item) => sum + item.price * item.quantity, 0); alert(`您需要支付${totalPrice.toFixed(2)}元`); }); ``` 以上代码仅为示例,实际项目中可能需要根据具体需求进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值