购物车前端开发(jQuery和bootstrap3)


Posted in Javascript onAugust 27, 2016

作为一名不在软件公司工作的软件工程师,不仅要会写后台代码(PHP/JAVA/SQL...),还是兼顾前端工程师的工作(html/javascript/css...)。下面就来分享一个在实际工作项目中使用到的购物车的前端开发。

这里分享的仅仅是针对购物车的操作(产品数量的增加减少,删除购物车中产品项),假设购物车中已经放有若干产品。闲话少说,先上两张效果图。

购物车前端开发(jQuery和bootstrap3)

HTML代码如下:这里使用到了JQuery1.11和bootstrap3 。

<!DOCTYPE html>
<html>
<HEADER>
 <meta charset="UTF-8">
 <title>Shopping Cart</title>
 <script type="text/javascript" src="jquery-1.11.min.js"></script>
 <script type="text/javascript" src="demo.js"></script>
 <link href="bootstrap.min.css" media="screen" rel="stylesheet" type="text/css" />
</HEADER>
<body class="container">
 <table id="cartTable" class="cart table table-condensed" >
 <thead>
 <tr>
 <th style="width:60px;"><label><input class="check-all check" type="checkbox" /> 全选</label></th>
 <th><label>产品型号</label></th>
 <th style="width:100px;"><label>单价</label></th>
 <th style="width:120px;"><label>数量</label></th>
 <th style="width:100px;"><label>小计</label></th>
 <th style="width:40px;"><label>操作</label></th> 
 </tr>
 </thead>
 <tbody>
 <tr >
 <td ><input class="check-one check" type="checkbox" /> </td>
 <td class="goods">
  <label>Item 1</label>
 </td>
 <td class="number small-bold-red"><span>76.55</span></td>
 <td class="input-group">
  <span class="input-group-addon minus">-</span>
  <input type="text" class="number form-control input-sm" value="10" />
  <span class="input-group-addon plus">+</span>
 </td>
 <td class="subtotal number small-bold-red">101</td>
 <td class="operation"><span class="delete btn btn-xs btn-primary">删除</span></td>
 </tr>
 <tr>
 <td ><input class="check-one check" type="checkbox" /></td>
 <td class="goods">
  <label>Item 2</label>
 </td>
 <td class="number small-bold-red"><span>1100</span></td>
 <td class="input-group">
  <span class="input-group-addon minus">-</span>
  <input type="text" class="number form-control input-sm" value="1" />
  <span class="input-group-addon plus">+</span>
 </td>
 <td class="subtotal number small-bold-red">352</td>
 <td class="operation"><span class="delete btn btn-xs btn-primary">删除</span></td>
 </tr>
 <tr>
 <td ><input class="check-one check" type="checkbox" /></td>
 <td class="goods">
  <label>Item 3</label>
 </td>
 <td class="number small-bold-red"><span>1200</span></td>
 <td class="input-group">
  <span class="input-group-addon minus">-</span>
  <input type="text" class="number form-control input-sm" value="1" />
  <span class="input-group-addon plus">+</span>
 </td>
 <td class="subtotal number small-bold-red">9876.55</td>
 <td class="operation"><span class="delete btn btn-xs btn-primary">删除</span></td>
 </tr>
 <tr>
 <td ><input class="check-one check" type="checkbox" /></td>
 <td class="goods">
  <label>Item 4</label>
 </td>
 <td class="number small-bold-red"><span>1400</span></td>
 <td class="input-group">
  <span class="input-group-addon minus">-</span>
  <input type="text" class="number form-control input-sm" value="1" />
  <span class="input-group-addon plus">+</span>
 </td>
 <td class="subtotal number small-bold-red">9876.55</td>
 <td class="operation"><span class="delete btn btn-xs btn-primary">删除</span></td>
 </tr>
 </tbody>
 </table>

 <div class="row">
 <div class="col-md-12 col-lg-12 col-sm-12">
 <div style="border-top:1px solid gray;padding:4px 10px;">
 <div style="margin-left:20px;" class="pull-right total">
  <label>金额合计:<span class="currency">¥</span><span id="priceTotal" class="large-bold-red">0.00</span></label>
 </div>
 <div class="pull-right">
  <label>您选择了<span id="itemCount" class="large-bold-red" style="margin:0 4px;"></span>种产品型号,共计<span id="qtyCount" class="large-bold-red" style="margin:0 4px;"></span>件</label>
 </div>
 <div class="pull-right selected" id="selected">
  <span id="selectedTotal"></span>
 </div>
 </div>
 </div>
 </div>
</body>
</html>

HTML代码主要分为两大块,TABLE部分用于显示购物车内的产品明细,在其后使用了一个DIV用于显示汇总信息。这里使用了一个技巧需要特别说明一下:

1.为元素指定一些虚假的class名称(样式表中不存在的样式名称),方便使用JQuery的过滤器找到特定元素。如上述代码中的样式check-all / check-one / cart / subtotal

Javascript代码需要实现以下几个功能:

1.产品全选功能

2.计算产品小计(即产品单价 * 购买数量)

3.用户选中购物车中的某个产品型号,需要重新计算页面下方的汇总信息,包括选中的产品型号种类、产品数量小计和金额小计

4.用户删除购物车中某个产品型号,或是修改购买数量时,需要重新计算页面下方的汇总信息。

下面就以上功能一一说明:

1.产品全选功能

$(cartTable).find(":checkbox").click(function() {
  //全选框单击
  if ($(this).hasClass("check-all")) {
   var checked = $(this).prop("checked");
   $(cartTable).find(".check-one").prop("checked", checked);
  }

  //如果手工一个一个的点选了所有勾选框,需要自动将“全选”勾上或是取消
  var items = cartTable.find("tr:gt(0)");
  $(cartTable).find(".check-all").prop("checked", items.find(":checkbox:checked").length == items.length);

  getTotal();
 });

为购物车表格中的每一样选择框绑定单击事件。在这个事件中,需要判断出用户点击的是“全选”的选择框,还是每一个产品自己的选择框,那么这里就又一次用到了上面提到的虚假样式。这里需要特别说明的是JQuery读取元素的属性通常是使用attr()方法,但是对于checkbox来说,使用attr()无法正确读取到其checked属性值。正确用法是使用prop()方法来读取。

如果用户点击了“全选”,那么所有的选择框都应该被选中,这一点很容易考虑到。但是有一个细节需要注意,就是在用户手工一个一个的将所有产品选中时,程序应该将“全选”框也设为选中状态,或是在全部选中的状态下,用户手工取消了某一个产品的选中状态,那么程序也应该将“全选”框设为未选中状态。

最后一行代码是在用户选择完毕后,需要重新计算购物车的汇总信息。

2.产品小计功能代码:

/*
  * 计算购物车中每一个产品行的金额小计
  *
  * 参数 row 购物车表格中的行元素tr
  *
  */
 function getSubTotal(row) {
 var price = parseFloat($(row).find("span:first").text()); //获取单价
  var qty = parseInt($(row).find(":text").val()); //获取数量
  var result = price * qty; //计算金额小计
  $(row).find(".subtotal").text(result.toFixed(2)); //将计算好的金额小计写入到“小计”栏位中
 };

这个函数需要传入一个参数,即用于显示购物车内容的tr元素。
在显示购物车内容的表格中,每一个产品单价使用一个span元素包裹,且是这一行中的第一个span元素,使用JQuery过滤器$(row).find("span:first")即可以定位到产品单价,使用其text函数读取内容,并使用parseFloat将读取到的字符串转为浮点数。
购买数量,因为用户可能会去改变,所以使用input来展现。同事,使用如下过滤器即可定位到数量
$(row).find(":text")

并使用parseInt将其转为整数。在计算好单个产品金额小计之后,就需要将其写入到“小计”栏位中,使用toFixed方法,将数字格式化为带有两位小数样式。

3.购物车金额汇总

/*
  * 计算购物车中产品的累计金额
  *
  *
  */
 function getTotal() {
 var qtyTotal = 0;
  var itemCount = 0;
  var priceTotal = 0;
  $(cartTable).find("tr:gt(0)").each(function() {
  if ($(this).find(":checkbox").prop("checked") == true) { //如果选中
    itemCount++; //累加产品品种数量
    qtyTotal += parseInt($(this).find(":text").val()); //累计产品购买数量
    priceTotal += parseFloat($(this).find(".subtotal").text()); //累计产品金额
   }
  });    $("#itemCount").text(itemCount);
  $("#qtyCount").text(qtyTotal);
 $("#priceTotal").text(priceTotal.toFixed(2));
 };

计算购物车汇总信息时,应该是遍历购物车中所有的行,将每一行的小计和数量分别进行累加即可。这里使用一个技巧来获取购物车表格中的所有行$(cartTable).find("tr:gt(0)")

这里使用的tr:gt(0)是表示选择表格中所有的tr元素并且索引是大于0的(即除去第一个tr元素),这是为什么呢?我们回头看一下HTML代码就不难发现,第一个tr元素是表格标题头,不包含任何业务数据,所以在遍历时,应该除去这一个tr元素。

4.用户删除产品,或是修改购买数量时重新计算产品小计和汇总信息

//为数量调整的+ -号提供单击事件,并重新计算产品小计
 /*
  * 为购物车中每一行绑定单击事件,以及每行中的输入框绑定键盘事件
  * 根据触发事件的元素执行不同动作
  * 增加数量
  * 减少数量
  * 删除产品
  *
  */
 $(cartTable).find("tr:gt(0)").each(function() {
 var input = $(this).find(":text"); 
 //为数量输入框添加事件,计算金额小计,并更新总计
 $(input).keyup(function() {
 var val = parseInt($(this).val());
 if (isNaN(val) || (val < 1)) { $(this).val("1"); }
  getSubTotal($(this).parent().parent()); //tr element
  getTotal();
 });

 //为数量调整按钮、删除添加单击事件,计算金额小计,并更新总计
 $(this).click(function() {
 var val = parseInt($(input).val());
 if (isNaN(val) || (val < 1)) { val = 1; }

 if ($(window.event.srcElement).hasClass("minus")) {
   if (val > 1) val--;
   input.val(val);
   getSubTotal(this);
  }
  else if ($(window.event.srcElement).hasClass("plus")) {
   if (val < 9999) val++;
  input.val(val);
 getSubTotal(this);
  }
  else if ($(window.event.srcElement).hasClass("delete")) {
   if (confirm("确定要从购物车中删除此产品?")) {
    $(this).remove();
 }
  }
   getTotal();
 });

我在这里并不是一一对“增加”、“减少”和“删除”按钮进行事件绑定,而是将单击事件统一绑定在TR行上,再对触发单击事件的元素进行判断,进而决定执行何种操作。

点击“+”或是“-”按钮时,程序会将数量加一或是减一,并重新计算产品小计和汇总信息。

同时,还为数量输入框绑定了键盘事件,在输入框内每按下一次键盘,都会触发该事件,重新计算产品小计和汇总信息。

至此,购物车的前端开发,算是告一段落。

小伙伴们可以使用以下链接获取源码:https://github.com/chris-mao/ShoppingCart.git

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
真正的JQuery.ajax传递中文参数的解决方法
May 28 Javascript
jquery选择器的选择使用及性能介绍
Jan 16 Javascript
文本有关的样式和jQuery求对象的高宽问题分别说明
Aug 30 Javascript
javascript数组去重方法终极总结
Jun 05 Javascript
JavaScript实现信用卡校验方法
Apr 07 Javascript
JavaScript操作XML文件之XML读取方法
Jun 09 Javascript
分享纯手写漂亮的表单验证
Nov 19 Javascript
基于JavaScript实现根据手机定位获取当前具体位置(X省X市X县X街道X号)
Dec 29 Javascript
详解Angularjs在控制器(controller.js)中使用过滤器($filter)格式化日期/时间实例
Feb 17 Javascript
Vue实现双向绑定的原理以及响应式数据的方法
Jul 02 Javascript
微信小程序ibeacon三点定位详解
Oct 31 Javascript
Async/Await替代Promise的6个理由
Jun 15 Javascript
利用Angularjs和Bootstrap前端开发案例实战
Aug 27 #Javascript
轻松掌握JavaScript享元模式
Aug 27 #Javascript
JavaScript编码风格指南(中文版)
Aug 26 #Javascript
JavaScript使用forEach()与jQuery使用each遍历数组时return false 的区别
Aug 26 #Javascript
ES6中的数组扩展方法
Aug 26 #Javascript
jQuery实现微信长按识别二维码功能
Aug 26 #Javascript
XMLHttpRequest Level 2 使用指南
Aug 26 #Javascript
You might like
php中session过期时间设置及session回收机制介绍
2014/05/05 PHP
php防止sql注入之过滤分页参数实例
2014/11/03 PHP
使用PHP把HTML生成PDF文件的几个开源项目介绍
2014/11/17 PHP
PHP与JavaScript针对Cookie的读写、交互操作方法详解
2017/08/07 PHP
thinkPHP5框架分页样式类完整示例
2018/09/01 PHP
漂亮的thinkphp 跳转页封装示例
2019/10/16 PHP
php使用pthreads v3多线程实现抓取新浪新闻信息操作示例
2020/02/21 PHP
jQuery 表格插件整理
2010/04/27 Javascript
如何设置一定时间内只能发送一次请求
2014/02/28 Javascript
调试JavaScript中正则表达式中遇到的问题
2015/01/27 Javascript
JS动画效果打开、关闭层的实现方法
2015/05/09 Javascript
js实现仿爱微网两级导航菜单效果代码
2015/08/31 Javascript
jquery div模态窗口的简单实例
2016/05/28 Javascript
AngularJS 获取ng-repeat动态生成的ng-model值实例详解
2016/11/29 Javascript
小程序视频列表中视频的播放与停止的示例代码
2018/07/20 Javascript
原生js基于canvas实现一个简单的前端截图工具代码实例
2019/09/10 Javascript
[01:10]DOTA2次级职业联赛 - Fly战队宣传片
2014/12/01 DOTA
Python实现SVN的目录周期性备份实例
2015/07/17 Python
Django视图之ORM数据库查询操作API的实例
2017/10/27 Python
python安装pil库方法及代码
2019/06/25 Python
Python使用Opencv实现图像特征检测与匹配的方法
2019/10/30 Python
Python3 使用map()批量的转换数据类型,如str转float的实现
2019/11/29 Python
python读取Kafka实例
2019/12/23 Python
Python3监控疫情的完整代码
2020/02/20 Python
python matplotlib:plt.scatter() 大小和颜色参数详解
2020/04/14 Python
HTML5移动端手机网站开发流程
2016/04/25 HTML / CSS
html5 canvas手势解锁源码分享
2020/01/07 HTML / CSS
荷兰演唱会和体育比赛订票网站:viagogo荷兰
2018/04/08 全球购物
《大江保卫战》教学反思
2014/04/11 职场文书
医院义诊活动总结
2014/07/04 职场文书
爱与责任师德演讲稿
2014/08/26 职场文书
机械工程及自动化专业求职信
2014/09/03 职场文书
小学教师师德师风自我剖析材料
2014/09/29 职场文书
维护民族团结心得体会2016
2016/01/15 职场文书
python实现Thrift服务端的方法
2021/04/20 Python
Spring Boot实战解决高并发数据入库之 Redis 缓存+MySQL 批量入库问题
2022/02/12 Redis