需求说明:
1.当点击点餐按钮时,对应的菜品将被添加到购物车当中,并且在“点餐按钮”被点击时候,不能被再次点击;
2.购物车中的操作:点击“+”或“-”,被选中菜品的数量以及购物车中的菜品总数和总额相应变化;当被选中菜品的数量小于1时,将被从购物车中删除,同时它的点餐按钮回复可选状态;
3:当点击清空购物车时,购物车内的菜品全部被删除,菜品总数和总额同时清零,所有点餐按钮恢复可点击状态。
/*------------------------------------jQuery版---------------------------------------*/
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>点餐jQuery版</title>
<style>
*{ margin:0; padding:0}
body{font-size:14px}
h1,h2,h3,h4,h5,h6{ font-weight:normal}
ul{ list-style:none}
i,strong,em{ font-style:normal; font-weight:normal}
p,dt,dd{ padding:5px 0}
button{ padding:5px 10px}
.wrap{ width:500px; padding:20px;position: relative;margin: auto;top: 0;left: 0;right: 0;bottom: 0;}
li{ padding:10px; margin-bottom:20px; background:#efefef; position:relative;border-radius: 10px;}
hr{ margin:50px 0}
h2,dt{ font-size:24px; font-weight:bold; padding:10px 0}
h5{ font-size:16px; font-weight:bold}
h6{font-size:14px; padding:5px 0}
.cateList p{ font-size:12px; margin-right:80px}
.cateList .orderBtn{ position:absolute; top:20px; right:20px; border-radius: 5px;}
.shopping_cart{ position:relative}
.shopping_cart .price{ position:absolute; top:10px; right:10px; font-size:18px;}
.shopping_cart em{ font-size:24px}
.clearBtn{ position:absolute; top:10px; right:0;}
.shoppingList{position: relative;}
.shoppingList .price{position: absolute; top: 5px; right:10px;}
.shoppingList h5{margin-bottom: 20px;}
</style>
</head>
<body>
<div class="wrap">
<h2>菜单</h2>
<ul class="cateList">
<li id="cate1" data-name="宫保鸡丁" data-price="22">
<h5>宫保鸡丁</h5>
<p>是一道闻名中外的特色传统名菜。鲁菜、川菜、贵州菜中都有收录,原料、做法有差别。</p>
<h6>价格:<em>22</em></h6>
<button type="button" class="orderBtn">点餐</button>
</li>
<li id="cate2" data-name="鱼香肉丝" data-price="18">
<h5>鱼香肉丝</h5>
<p>是一道闻名中外的特色传统名菜。鲁菜、川菜、贵州菜中都有收录,原料、做法有差别。</p>
<h6>价格:<em>18</em></h6>
<button type="button" class="orderBtn">点餐</button>
</li>
<li id="cate3" data-name="红烧茄子" data-price="15">
<h5>红烧茄子</h5>
<p>是一道闻名中外的特色传统名菜。鲁菜、川菜、贵州菜中都有收录,原料、做法有差别。</p>
<h6>价格:<em>15</em></h6>
<button type="button" class="orderBtn">点餐</button>
</li>
</ul>
<hr>
<div class="shopping_cart">
<dl>
<dt>购物车</dt>
<dd id="total_count">总数:<em>0</em>元</dd>
<dd id="total_price">总额:<em>0</em>元</dd>
<dd><button id="clearBtn" type="button" class="clearBtn">清空购物车</button></dd>
</dl>
<ul id="shoppingList" class="shoppingList">
<!--<li>
<h5>宫保鸡丁</h5>
<p>价格:<em>28</em></p>
<p><button type="button">-</button> 数量:<em>1</em> <button type="button">+</button></p>
</li>-->
</ul>
</div>
</div>
</body>
</html>
<script src="jquery-1.11.3.min.js"></script>
<script>
var cate_arr=[
/*{
"id":"cate1",
"name":"宫保鸡丁",
"price":32,
"num":1,
},*/
]; //设置空数组,用来盛放被点的菜品的json数据,交于后台使用
//点餐
$('.orderBtn').click(function(){
$(this).prop('disabled',true);//按钮禁用
var pa=$(this).parent('li'); //点餐按钮的父级元素(li)
var json={}; //定义一个空的json
json.id=pa.attr('id'); //为json添加'li'的属性-->id
json.name=pa.attr('data-name'); //为json添加'li'的属性-->data-name
json.price=pa.attr('data-price'); //为json添加'li'的属性-->data-price
json.num=1;
cate_arr.push(json); //将被选中的菜品的id、菜名、价格以json格式追加进cate_arr数组中
console.log(cate_arr)
//刷新购物车
ref(cate_arr);
});
function ref(arr){ //刷新购物车函数 传入数组(cate_arr 被选菜品)参数
var total_count=0;//总数量
var total_price=0;//总价格
var html=""; //初始化购物车内容
for(var i=0; i<arr.length; i++){ //for循环被选菜品数组
html+='<li data-id="'+arr[i].id+'"><h5>'+arr[i].name+'</h5><p class="price">价格:<em>'+arr[i].price+'</em></p><p><button class="subBtn" type="button">-</button> 数量:<em>'+arr[i].num+'</em> <button class="addBtn" type="button">+</button></p></li>'; //购物车加入内容
total_count+=arr[i].num;//总数量
total_price+=arr[i].price*arr[i].num; //总价格
};
$('#shoppingList').empty().append(html); //先清空购物车内容,在添加新的内容
$('#total_count em').text(total_count);
$('#total_price em').text(total_price);
};
//购物车加减数量
$('#shoppingList').on('click','.subBtn,.addBtn',function(){ //绑定事件监听
var cls=$(this).prop('class');
var em=$(this).siblings('em');
var pa=$(this).parents('li');
var n=parseInt(em.text());
switch(cls){
case "subBtn":
n--;
for(var j=0; j<cate_arr.length; j++){
if(cate_arr[j].id==pa.attr('data-id')){
cate_arr[j].num=n;
if(n<1){ //当菜品数量被减至小于1时,删除被选菜品
pa.remove();
$('#'+cate_arr[j].id+' .orderBtn' ).prop('disabled',false); //恢复按钮点击状态
cate_arr.splice(j,1); //数组中删除数据
};
ref(cate_arr);
}
};
em.text(n);
break;
case "addBtn":
n++;
for(var j=0; j<cate_arr.length; j++){
if(cate_arr[j].id==pa.attr('data-id')){
cate_arr[j].num=n;
ref(cate_arr);
}
};
em.text(n);
break;
}
})
//清空购物车
$('#clearBtn').click(function(){
$('#shoppingList').empty();
$('#total_count em').text(0);
$('#total_price em').text(0);
$('.orderBtn').prop('disabled',false);
cate_arr=[];
});
</script>
/*------------------------------------vue版---------------------------------------*/
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>点餐Vue版</title>
<script src="vue.js"></script>
<style>
*{ margin:0; padding:0}
body{font-size:14px}
h1,h2,h3,h4,h5,h6{ font-weight:normal}
ul{ list-style:none}
i,strong,em{ font-style:normal; font-weight:normal}
p,dt,dd{ padding:5px 0}
button{ padding:5px 10px}
.wrap{ width:500px; padding:20px;position: relative;margin: auto;top: 0;left: 0;right: 0;bottom: 0;}
li{ padding:10px; margin-bottom:20px; background:#efefef; position:relative;border-radius: 10px;}
hr{ margin:50px 0}
h2,dt{ font-size:24px; font-weight:bold; padding:10px 0}
h5{ font-size:16px; font-weight:bold}
h6{font-size:14px; padding:5px 0}
.cateList p{ font-size:12px; margin-right:80px}
.cateList .orderBtn{ position:absolute; top:20px; right:20px; border-radius: 5px;}
.shopping_cart{ position:relative}
.shopping_cart .price{ position:absolute; top:10px; right:10px; font-size:18px;}
.shopping_cart em{ font-size:24px}
.clearBtn{ position:absolute; top:10px; right:0;}
.shoppingList{position: relative;}
.shoppingList .price{position: absolute; top: 5px; right:10px;}
.shoppingList h5{margin-bottom: 20px;}
</style>
</head>
<body>
<div class="wrap" id="box">
<h2>菜单</h2>
<ul class="cateList">
<!-- v-for指令将所有菜品加入到li中 -->
<li v-for='(item,i) in arr'>
<h5>{{ item.name }}</h5> <!-- 菜名 -->
<p>{{ item.des }}</p> <!-- 描述 -->
<h6>{{ item.price }}</h6> <!-- 价格 -->
<button type="button" class="orderBtn" @click='order(i)' :disabled='item.disable'>点餐</button> <!-- 绑定点击事件(点菜函数) -->
</li>
</ul>
<hr>
<div class="shopping_cart">
<dl>
<dt>购物车</dt>
<dd id="total_count">总数:<em>{{ totalNum }}</em>个</dd>
<dd id="total_price">总额:<em>{{ totalPrice }}</em>元</dd>
<dd><button id="clearBtn" type="button" class="clearBtn" @click='clear'>清空购物车</button></dd>
</dl>
<ul id="shoppingList" class="shoppingList">
<!--<li>
<h5>宫保鸡丁</h5>
<p>价格:<em>28</em></p>
<p><button type="button">-</button> 数量:<em>1</em> <button type="button">+</button></p>
</li>-->
<li v-for='(item,i) in shoppingList'>
<h5>{{ item.name }}</h5>
<p class="price">价格:<em>{{ item.price }}</em></p>
<p><button type="button" @click='sub(i)'>-</button> 数量:<em>{{ item.num }}</em> <button type="button" @click='add(i)'>+</button></p>
</li>
</ul>
</div>
</div>
</body>
</html>
<script>
var vm=new Vue({
el: '#box',
data: {
arr:[ //将菜品以json对象的方式装入arr数组中 name-菜名 des-菜品描述 price-价格 disable-按钮状态 mark-在数组中的编号
{name:'宫保鸡丁', des:'宫保鸡丁选用鸡肉为主料,佐以花生米、黄瓜、辣椒等辅料烹制而成。', price:22, disable:false, mark:0},
{name:'鱼香肉丝', des:'一道特色传统名菜,以鱼香调味而得名,属川菜。', price:18, disable:false, mark:1},
{name:'木须肉', des:'木须肉原名木樨肉,是一道常见的特色传统名菜,属八大菜系之一的鲁菜。', price:15, disable:false, mark:2}
],
shoppingList:[], //首先定义一个空数组,用来装入选中的菜品信息
totalNum: 0, //初始化购物车菜品总量
totalPrice: 0 //初始化购物车菜品总价格
},
methods:{
order: function(i){ //点菜函数
this.totalNum++;
this.totalPrice+=this.arr[i].price;
this.arr[i].disable=true;
//shoppingList数组中追加进菜名 价格 数量 和 *编号(这里编号用来记录哪道菜品,以便后边恢复按钮的可点击状态)
this.shoppingList.push( {name:this.arr[i].name, price:this.arr[i].price, num:1, mark:this.arr[i].mark });
},
sub: function(i){ //购物车内减少数量函数
this.shoppingList[i].num--; //选中菜品数量递减
if(this.shoppingList[i].num<1){ //判断条件:如果菜品数量被减至小于1时
this.totalNum--;
this.totalPrice-=this.shoppingList[i].price;
this.arr[this.shoppingList[i].mark].disable=false; //点菜按钮恢复
this.shoppingList.splice(i,1) //在shoppingList数组中清除掉数量已经为零的菜品
return;
};
this.totalNum--; //2-- >1
this.totalPrice-=this.shoppingList[i].price;
console.log(this.shoppingList[i].mark)
},
add: function(i){ //购物车内增加数量函数
this.totalNum++; //总量递增
this.shoppingList[i].num++; //选中菜品数量递增
this.totalPrice+=this.shoppingList[i].price; //总价递增
},
clear: function(){
this.totalNum=0;
this.totalPrice=0;
this.shoppingList=[]; //被选菜品数组清零
for(var i=0 ; i<this.arr.length ; i++){
this.arr[i].disable=false; //所有按钮恢复状态
console.log(this.arr[i].disabled)
};
}
}
})
</script>
(个人认为)
比起jQuery,vue用来处理数据转换逻辑更加清晰,代码更加简洁。