购物车前端开发(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 相关文章推荐
XRegExp 0.2: Now With Named Capture
Nov 30 Javascript
js判断一个元素是否为另一个元素的子元素的代码
Mar 21 Javascript
纯js网页画板(Graphics)类简介及实现代码
Dec 24 Javascript
页面按钮禁用与解除禁用的方法
Feb 19 Javascript
javascript中的正则表达式使用详解
Aug 30 Javascript
JS响应鼠标点击实现两个滑块区间拖动效果
Oct 26 Javascript
解析AngularJS中get请求URL出现的跨域问题
Dec 01 Javascript
js实现贪吃蛇小游戏(容易理解)
Jan 22 Javascript
js仿淘宝商品放大预览功能
Mar 15 Javascript
详解Javascript获取缓存和清除缓存API
May 25 Javascript
JS数组交集、并集、差集的示例代码
Aug 23 Javascript
vue百度地图 + 定位的详解
May 13 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与Java进行通信的实现方法
2013/10/21 PHP
WordPress中注册菜单与调用菜单的方法详解
2015/12/18 PHP
ExtJs 表单提交登陆实现代码
2010/08/19 Javascript
超越Jquery_01_isPlainObject分析与重构
2010/10/20 Javascript
事件模型在各浏览器中存在差异
2010/10/20 Javascript
Javascript面向对象扩展库代码分享
2012/03/27 Javascript
JS操作Cookies包括(读取添加与删除)
2012/12/26 Javascript
返回页面顶部top按钮通过锚点实现(自写)
2013/08/30 Javascript
jquery放大镜效果超漂亮噢
2013/11/15 Javascript
浅析JS获取url中的参数实例代码
2016/06/14 Javascript
无法获取隐藏元素宽度和高度的解决方案
2017/03/07 Javascript
JS实现多张图片预览同步上传功能
2017/06/23 Javascript
关于vue中的ajax请求和axios包问题
2018/04/19 Javascript
如何实现一个webpack模块解析器
2018/10/24 Javascript
简单了解vue.js数组的常用操作
2019/06/17 Javascript
JavaScript实现京东放大镜效果
2019/12/03 Javascript
JavaScript cookie原理及使用实例
2020/05/08 Javascript
用js实现放大镜效果
2020/10/28 Javascript
Python字典数据对象拆分的简单实现方法
2017/12/05 Python
Python通过Django实现用户注册和邮箱验证功能代码
2017/12/11 Python
用python处理MS Word的实例讲解
2018/05/08 Python
Python DataFrame 设置输出不显示index(索引)值的方法
2018/06/07 Python
pygame游戏之旅 创建游戏窗口界面
2018/11/20 Python
pycharm运行scrapy过程图解
2019/11/22 Python
Python socket聊天脚本代码实例
2020/01/02 Python
pandas中read_csv、rolling、expanding用法详解
2020/04/21 Python
python 实现简单的计算器(gui界面)
2020/11/11 Python
纯css3实现图片翻牌特效
2015/03/10 HTML / CSS
MATCHESFASHION澳大利亚/亚太地区:英国时尚奢侈品电商
2020/01/14 全球购物
团队拓展活动总结
2014/08/27 职场文书
确保工程质量承诺书
2015/04/29 职场文书
学生党支部工作总结2015
2015/05/26 职场文书
Python基础之元组与文件知识总结
2021/05/19 Python
使用Pytorch训练two-head网络的操作
2021/05/28 Python
python使用torch随机初始化参数
2022/03/22 Python
码云(gitee)通过git自动同步到阿里云服务器
2022/12/24 Servers