核心提示:思路1.给tbody一个id=shopList 当进入购物车时如果有两个商品被勾选了,需要计算出总价钱2.当手动勾选商品时,也要把相应的价格加到总价中去3.给全选添加一个id=checkAll当勾选全...
思路
1.给tbody一个id=”shopList” 当进入购物车时如果有两个商品被勾选了,需要计算出总价钱
2.当手动勾选商品时,也要把相应的价格加到总价中去
3.给全选添加一个id=”checkAll”当勾选全部选中时,要计算所有商品的总价要注意的是:这个函数,当单选是也要触发,因为当全部商品都勾选时也就相当调用了这个函数
4.当再次点击全选时取消所有产品
5.当点击+加号时也要计算
6.当点击-加号时也要计算
7.文本框中也可以直接输入,这里需要校验的地方比较多
8.当点击删除时,将选中的商品移除
代码思路
1.首先计算总价
totalPrice(); function totalPrice(){ //获取所有商品列表 var lists = $('#shopList tr'); var total = 0;//这里是后添加的; //循环遍历 lists.each(function(){ //遍历的结果this会是tr标签,也就是js对象,我们要转换为Jquery对象 var _vm = $(this); //获取所有选中的商品 var isChecked = _vm.find('.checkbox').prop('checked'); //判断当商品勾选时,计算总价 if(isChecked){ //获取单价 *1乘1就会把字符串转换为数字 var price = _vm.find('.price').text()*1; var num = _vm.find('.num').val()*1; //总价就是两者相乘,在循环体的外面定义一个total变量用来存值 total += price*num; } }); //循环后将所得结果添加到页面 $('#total').text(total); }
2.点击勾选商品,改变总价
checkEvent(); function checkEvent(){ //这里采用的是委托代理方式,通过冒泡机制,实现效果 //通过给父级一个click代理效果,所有的子集当单击时都会触发这个效果 //我们这里又添加一个筛选,只有.checkbox才会触发这个效果 $('#shopList').on('click','.checkbox',function(){ //调用计算系统 totalPrice(); //调用全选函数isCheckAll();没勾选一次都要判断 //是否全部选中了 isCheckAll(); }); };
3.全部选中时的总价格
isCheckAll(); function isCheckAll(){ //判断勾选的个数和总个数是否相同 var len = $('#shopList .checkbox').length; var clen = $('#shopList .checkbox:checked').length; if(len === clen){ $('#checkAll').prop('checked',true); }else{ $('#checkAll').prop('checked',false); } }; //上面的代码简化为一行 function isCheckAll(){ $('#checkAll').prop('checked',$('#shopList .checkbox').length === $('#shopList .checkbox:checked').length); };
4.判断全选是否是选中状态
checkAllEvent(); function checkAllEvent(){ $('#checkAll').click(function(){ //之前的思路:当点击时获取checkbox的状态,如果是勾选就去掉,不是就勾选,很绕 //下面的思路:不管之前甚么状态,获取的点击后的状态,如果是勾选就设置为勾选,反之一样 $('#shopList .checkbox').prop('checked',$(this).prop('checked')); //再次调用一次计算系统; totalPrice(); }); };
5.单击加号+计算价格
addEvent(); function addEvent(){ //这里和checkbox一样也用委托代理 $('#shopList').on('click','.add',function(){ //将js对象转换为jquery对象 var _vm = $(this); var num = _vm.prev().val()*1;//获取数值 num++; _vm.prev().val(num);//改变后在赋值回去 totalPrice(); //因为当点击加号时,如果没有勾选商品,就变得没有意义,所以要勾选商品 //勾选时,那就要判断是否全选了商品,若是都选了,那么全选按钮就要被选中 isCheckAll(); }); //这里的代码可以优化下,将_vm.prev()对象存储一下 //因为获取dom节点的过程是比较耗性能的,所以存储下好; }
6.单击减号-计算价格
minusEvent(); function minusEvent(){ $('#shopList').on('click','.minus',function(){ var _vm = $(this); var numNode = _vm.next();//获取减号所在的下一个截点对象; var num = numNode.val()*1; if(num >1){ num--;//只有大于1的时候才减 } numNode.val(num); totalPrice(); isCheckAll(); }); };
7.文本框中直接改变数值
numEvent(); function numEvent(){ $('#shopList').on('keyup','.num',function(){ var _vm = $(this); var num = _vm.val(); num = num.replace(/[^\d]+/g,'').replace(/^0+/,''); _vm.val(num); if(num){ totalPrice(); isCheckAll(); } }).on('blur','.num',function(){ var _vm = $(this); var num = _vm.val(); if(!num){ _vm.val(1); } totalPrice(); isCheckAll(); }); };
8.删除
delEvent(); function delEvent(){ $('#shopList').on('click','.col_width_9 span',function(){ var isDel = confirm('您确定要删除么?'); if(isDel){ $(this).parents('tr').remove(); totalPrice(); } }); }