当前位置:首页 > 日记 > 正文

JavaScript实现类似淘宝的购物车效果

JavaScript实现类似淘宝的购物车效果

前言

相信大家都很熟悉商品购物车这一功能,每当我们在某宝某东上购买商品的时候,看中了哪件商品,就会加入购物车中,最后结算。购物车这一功能,方便消费者对商品进行管理,可以添加商品,删除商品,选中购物车中的某一项或几项商品,最后商品总价也会随着消费者的操作随着变化。本文介绍的是通过JavaScript实现类似于淘宝的购物车效果,包括商品的单选、全选、删除、修改数量、价格计算、数目计算、预览等功能。

功能如下

      1. 实现兼容低版本IE的getElementsByClassName()方法

      2. JS表格操作

      3. 通过parseInt()parseFloat()把字符串转换成数字

      4. 通过toFixed()把数字格式化成指定位数的小数

      5. 事件代理的运用

效果图:

border-collapse有两个值可以选择,分别是collapse和separate,就是合并边框和分离边框,分离边框之下又可以设置间距和边框样式

border-spacing:2em 4em;(设置右间距和下间距)

border-style:none solid dashed dotted;(分别设置上右下左的样式)

html结构:

<table id="cartTable"> <thead> <tr> <th><label><input class="check-all check" type="checkbox"/> 全选</label></th> <th>商品</th> <th>单价</th> <th>数量</th> <th>小计</th> <th>操作</th> </tr> </thead> <tbody> <tr> <td class="checkbox"><input class="check-one check" type="checkbox" /></td> <td class="goods"><img src="images/1.webp" alt="" /><span>Casio/卡西欧 EX-TR350</span></td> <td class="price">5999.88</td> <td class="count"><span class="reduce"></span><input class="count-input" type="text" value="1"/><span class="add">+</span></td> <td class="subtotal">5999.88</td> <td class="operation"><span class="delete">删除</span></td> </tr> <tr> <td class="checkbox"><input class="check-one check" type="checkbox" /></td> <td class="goods"><img src="images/2.webp" alt="" /><span>Canon/佳能 PowerShot SX50 HS</span></td> <td class="price">3888.50</td> <td class="count"><span class="reduce"></span><input class="count-input" type="text" value="1"/><span class="add">+</span></td> <td class="subtotal">3888.50</td> <td class="operation"><span class="delete">删除</span></td> </tr> <tr> <td class="checkbox"><input class="check-one check" type="checkbox" /></td> <td class="goods"><img src="images/3.webp" alt="" /><span>Sony/索尼 DSC-WX300</span></td> <td class="price">1428.50</td> <td class="count"><span class="reduce"></span><input class="count-input" type="text" value="1"/><span class="add">+</span></td> <td class="subtotal">1428.50</td> <td class="operation"><span class="delete">删除</span></td> </tr> <tr> <td class="checkbox"><input class="check-one check" type="checkbox" /></td> <td class="goods"><img src="images/4.webp" alt="" /><span>Fujifilm/富士 instax mini 25</span></td> <td class="price">640.60</td> <td class="count"><span class="reduce"></span><input class="count-input" type="text" value="1"/><span class="add">+</span></td> <td class="subtotal">640.60</td> <td class="operation"><span class="delete">删除</span></td> </tr> </tbody></table><div class="foot" id="foot"> <label class=" fl select-all"><input type="checkbox" class="check-all check" /> 全选</label> <a class="fl delete" id="deleteAll" href="javascript:;" rel="external nofollow" >删除</a> <div class="fr closing">结 算</div> <div class="fr total">合计:¥<span id="priceTotal">0.00</span></div> <div class="fr select" id="selected">已选商品<span id="selectedTotal">0</span>件<span class="arrow up">︽</span><span class="arrow down">︾</span></div> <div class="selected-view"> <div id="selectedViewList" class="clearfix"> <div><img src="images/1.webp"><span>取消选择</span></div> </div> <span class="arrow">◆<span>◆</span></span> </div></div>

css代码:

*{ margin: 0; padding: 0; } a{ color: #666; text-decoration: none; } body{ padding:20px; color: #666; } .fl{ float: left; } .fr{ float: right; } table{ border-collapse: collapse; border-spacing: 0; border: 0; text-align: center; width: 937px; } th,td{ border: 1px solid #cadeff; } th{ background: #e2f2ff; border-top: 3px solid #a7cbff; height: 30px; } td{ padding: 10px; color: #444; } tbody tr:hover{ background: RGB(238,246,255); } .checkbox{width: 60px;} .goods{width: 300px;} .goods span{ width: 180px; margin-top: 20px; text-align: left; float: left; } .price{width: 130px;} .count{width: 90px;} .count .add, .count input, .count .reduce{ float: left; margin-left: -1px; position: relative; z-index: 0; } .count .add, .count .reduce{ height: 23px; width: 17px; border: 1px solid #e5e5e5; background: #f0f0f0; text-align: center; line-height: 23px; color: #444; } .count .add:hover, .count .reduce:hover{ color: #f50; z-index: 3; border-color: #f60; cursor: pointer; } .count input{ width: 50px; height: 15px; line-height: 15px; border: 1px solid #aaa; color: #343434; text-align: center; padding: 4px 0; background-color: #fff; z-index: 2; } .subtotal{ width: 150px; color: red; font-weight: bold; } .operation{width: 80px;} .operation span:hover, .a:hover{ cursor: pointer; color: red; text-decoration: underline; } img{ width: 100px; height: 80px; margin-right: 10px; float: left; } .foot{ width: 935px; margin-top: 10px; color: #666; height: 48px; border: 1px solid #c8c8c8; background-image: linear-gradient(RGB(241,241,241),RGB(226,226,226)); position: relative; z-index: 8; } .foot div, .foot a{ line-height: 48px; height: 48px; } .foot .select-all{ width: 100px; height: 48px; line-height: 48px; padding-left: 5px; color: #666; } .foot .closing{ border-left: 1px solid #c8c8c8; width: 100px; text-align: center; color: #000; font-weight: bold; background: RGB(238,238,238); cursor: pointer; } .foot .total{ margin: 0 20px; cursor: pointer; } .foot #priceTotal, .foot #selectedTotal{ color: red; font-family: "微软雅黑"; font-weight: bold; } .foot .select{ cursor: pointer; } .foot .select .arrow{ position: relative; top: -3px; margin-left: 3px; } .foot .select .down{ position: relative; top: 3px; display: none; } .show .select .down{ display: inline; } .show .select .up{ display: none; } .foot .select:hover .arrow{ color: red; } .foot .selected-view{ width: 935px; border: 1px solid #c8c8c8; position: absolute; height: auto; background: #fff; z-index: 9; bottom: 48px; left: -1px; display: none; } .show .selected-view{display: block;} .foot .selected-view div{height: auto;} .foot .selected-view .arrow{ font-size: 16px; line-height: 100%; color: #c8c8c8; position: absolute; right: 330px; bottom: -9px; } .foot .selected-view .arrow span{ color: #fff; position: absolute; left: 0; bottom: 1px; } #selectedViewList{ padding: 20px; margin-bottom: -20px; } #selectedViewList div{ display: inline-block; position: relative; width: 100px; height: 80px; border: 1px solid #ccc; margin: 10px; } #selectedViewList div span{ display: none; color: #fff; font-size: 12px; position: absolute; top: 0; right: 0; width: 60px; height: 18px; line-height: 18px; text-align: center; background: RGBA(0,0,0,.5); cursor: pointer; } #selectedViewList div:hover span{ display: block; }

js部分:

1)实现商品的全选功能及数量和价格的计算

var cartTable = document.getElementById('cartTable'); var tr = cartTable.children[1].rows;//获取table下的tbody下的每一行 var checkInputs = document.getElementsByClassName('check'); var checkAllInputs = document.getElementsByClassName('check-all'); var selectedTotal = document.getElementById('selectedTotal'); var priceTotal = document.getElementById('priceTotal'); //计算总数和价格 function getTotal(){ var selected = 0; var price = 0; for(var i=0;i < tr.length; i++){ if(tr[i].getElementsByTagName('input')[0].checked){  selected += parseInt(tr[i].getElementsByTagName('input')[1].value);  price += parseFloat(tr[i].cells[4].innerHTML);//cells属性为获得tr下面的td } } selectedTotal.innerHTML = selected; priceTotal.innerHTML = price.toFixed(2);//保留两位小数 } for(var i=0;i<checkInputs.length;i++){ checkInputs[i].onclick = function(){ if(this.className === 'check-all check'){//如果点击的是全选按钮,则使所有按钮的状态和它相同  for(var j=0;j<checkInputs.length;j++){  checkInputs[j].checked = this.checked;  } } if(this.checked == false){//如果其中一个变为未选中状态,则使全选按钮取消选中  for(var i=0;i<checkAllInputs.length;i++){  checkAllInputs[i].checked = false;  } } getTotal(); } }

2)点击已选商品实现商品预览浮层的功能

点击已选商品时会显示出已选择商品的列表

同时在getTotal()函数中增加新创建的div

js代码:

function getTotal(){ var selected = 0; var price = 0; var HTMLstr = ''; for(var i=0;i < tr.length; i++){ if(tr[i].getElementsByTagName('input')[0].checked){  tr[i].className = 'on';  selected += parseInt(tr[i].getElementsByTagName('input')[1].value);  price += parseFloat(tr[i].cells[4].innerHTML);//cells属性为获得tr下面的td  HTMLstr += '<div><img src="'+ tr[i].getElementsByTagName('img')[0].src + '"><span>取消选择</span></div>'; } else{  tr[i].className = ''; } } selectedTotal.innerHTML = selected; priceTotal.innerHTML = price.toFixed(2);//保留两位小数 selectedViewList.innerHTML = HTMLstr; if(selected == 0){ foot.className = 'foot'; } } for(var i=0;i<checkInputs.length;i++){ checkInputs[i].onclick = function(){ if(this.className === 'check-all check'){//如果点击的是全选按钮,则使所有按钮的状态和它相同  for(var j=0;j<checkInputs.length;j++){  checkInputs[j].checked = this.checked;  } } if(this.checked == false){//如果其中一个变为未选中状态,则使全选按钮取消选中  for(var i=0;i<checkAllInputs.length;i++){  checkAllInputs[i].checked = false;  } } getTotal(); } } selected.onclick = function(){ if(foot.className == 'foot'){ if(selectedTotal.innerHTML != 0){  foot.className = 'foot show'; } }else{ foot.className = 'foot'; } }

 3)商品列表中的取消选择与事件代理

已选商品列表中没有appendChild的时候div和span都不存在,所以要使用事件代理。

selectedViewList.onclick = function(e){  var el = e.srcElement;  if(el.className == 'del'){  var index = el.getAttribute('index');  var input = tr[index].getElementsByTagName('input')[0];  input.checked = false;  input.onclick();  } }

4)实现增减商品数量及小计价格的计算

//增减商品数量事件代理 for(var i=0;i<tr.length;i++){  tr[i].onclick = function(e){  e = e|| window.event;  var el = e.srcElement;  var cls = el.className;  var input = this.getElementsByTagName('input')[1];  var val = parseInt(input.value);  var reduce = this.getElementsByTagName('span')[1];  switch (cls){   case 'add':   input.value = val + 1;   reduce.innerHTML = '-';    getsubTotal(this);   break;   case 'reduce':   if(val > 1){    input.value = val - 1;    getsubTotal(this);   }else{    reduce.innerHTML = '';   }  }  getTotal();  }  tr[i].getElementsByTagName('input')[1].onkeyup = function(){  var val = parseInt(this.value);  var tr = this.parentNode.parentNode;//this指的是当前的input,其父节点的父节点就是当前的tr  var reduce = tr.getElementsByTagName('span')[1];  if(isNaN(val) || val < 1){   val = 1;  }  this.value = val;//保证输入框中都是大于1的纯数字  if(val <= 1){   reduce.innerHTML = '';  }  else{   reduce.innerHTML = '-';  }  getsubTotal(tr);  getTotal();  } }

 5)实现删除商品功能

学会用for循环删除数组中的一些数据时要回置下标 i 。

//删除商品 deleteAll.onclick = function(){  if(selectedTotal.innerHTML != '0'){  var conf = confirm("确定要删除所选商品吗");  if(conf){   for(var i=0;i<tr.length;i++){   var input = tr[i].getElementsByTagName('input')[0];   if(input.checked){    tr[i].parentNode.removeChild(tr[i]);    i --;//因为删除数组中的一个后,后面的索引就会向前移,此时要让i也向前移一个,回置下标i   }   }   getTotal();  }  } }

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。

相关文章

ps如何将文字进行栅格化

ps如何将文字进行栅格化

栅格,文字,方法,如何将,电脑软件,  栅格化其实很好用的,对一些图片或者文字要处理就可以栅格化。很多刚学习的新手小伙伴可能还不知道,下面是小编带来关于ps如何将文字进行栅格化的内容,希望可以让大家有所收获!ps将文字进行栅格化的方法打…

怎么把wps文字变成格式把wps文字变

怎么把wps文字变成格式把wps文字变

文字,步骤,方法,图片格式,格式,  如果对wps不太熟练的同学,可能在听到这个要把wps文字变图片的操作,可能都会问一句可能吗,其实是完全可能的,而且还很简单。下面小编教你怎么把wps文字变成图片格式,希望对你有帮助!wps文字变成图片格式的方法步…

canvas绘图不清晰的解决方案

canvas绘图不清晰的解决方案

绘图,解决方案,清晰,电脑软件,canvas,现象描述  同样大小的图片(60x60px)用canvas和DOM绘制,结果发现canvas的画面质量要差很多。结果如下图所示。上图中,左侧红框中的金币采用DOM绘制,右侧和下方的金币和文字等使用canvas绘制,结果canvas绘制…

单页PPT演示制作长文本的方法是什

单页PPT演示制作长文本的方法是什

文本,方法,演示,电脑软件,PPT,  通过对PPT控件工具箱中的文本框控件的设置,可以制作出带滚动条的文本框,能够将大段内容收录其中。以下是小编为您带来的关于单页PPT演示长文本,希望对您有所帮助。单页PPT演示长文本插入文本框控件这个过程主…

怎么在PPT2013中制作数学立方体

怎么在PPT2013中制作数学立方体

立方体,数学,电脑软件,  在用PPT2013制作数学图形时,例如立体矩形,立方体就不好直接用插入形状的方法绘制。难道就没有办法了么?以下是小编为您带来的关于PPT2013中制作数学立方体,希望对您有所帮助。PPT2013中制作数学立方体1 启动PowerPoi…

wps表格中如何快速复制相同内容wps

wps表格中如何快速复制相同内容wps

方法,表格,快速,内容,电脑软件,  表格的编制是办公室里几乎每天都在使用的,同一表格中相同内容的文字要出现在不同行列中,也许你习惯于采用复制、粘贴的方式也处理,但其实在wps表格中有一种很快捷的方式。下面小编告诉是什么吧。wps表格快速…

PPT2010如何制作多媒体相册

PPT2010如何制作多媒体相册

多媒体,电脑软件,  PPT演示文稿是指用PPT软件制作的一系列幻灯片,通过将思维视觉化的方式,用文字、图表、图像和音频视频等载体按照逻辑顺序展示相互关联的思想观点。PPT里面有新建相册的功能,你有没有尝试过呢。将自己的相片整理成一个有序…

JavaScript高阶函数_动力节点Java

JavaScript高阶函数_动力节点Java

高阶函数,学院,节点,动力,电脑软件,高阶函数英文叫Higher-order function。那么什么是高阶函数?JavaScript的函数其实都指向某个变量。既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为…

excel表格数字显示异常的解决方法

excel表格数字显示异常的解决方法

显示,解决方法,数字,表格,电脑软件,  Excel中该如何解决数字显示异常的问题呢?下面是小编带来的关于excel表格数字显示异常的解决方法,希望阅读过后对你有所启发!excel表格数字显示异常的解决方法:  数字显示异常步骤1:当你发现输入的一串…

微信小程序使用Socket的实例

微信小程序使用Socket的实例

实例,程序,电脑软件,微信小,Socket,微信小程序使用Socket的实例首先,一个小程序同时只能有一个WebSocket连接,如果当前已经存在一个WebSocket连接,会关闭当前连接,并重新建立一个连接。其次,如果使用了appID,协议必须是 wss://...最近团队用小程…

如何去掉word页码的两种方法

如何去掉word页码的两种方法

方法,页码,两种,电脑软件,word,  Microsoft Word应用广泛,在处理很多文档时比较实用,有时写文档时需要加入页码,在插入菜单中选择页码即可,那去掉页码该怎么办呢?那么下面就由小编给大家分享下去掉word页码的技巧,希望能帮助到您。去掉word页…

为Excel2010设置纸张大小的方法是

为Excel2010设置纸张大小的方法是

设置,方法,纸张,大小,电脑软件,  在Excel2010表格的使用中,用户根据实际需要设置工作表所使用的纸张大小,可以通过两种方式进行设置。以下是小编为您带来的关于为Excel2010设置纸张大小,希望对您有所帮助。为Excel2010设置纸张大小操作步骤…