jQuery与Bootstrap 3实现购物车前端交互开发详解

作者:资源驿站时间:2026-10-30 13:02:46浏览:143

本文详细讲解如何使用jQuery和Bootstrap 3构建购物车前端界面。内容涵盖全选逻辑、小计计算、汇总更新及删除功能,重点解析checkbox属性读取、DOM元素定位及事件绑定的具体实现方法。

购物车前端开发概述

对于独立于软件公司的工程师而言,工作范围往往不仅限于后端开发(如PHP、Java或SQL),还需兼顾前端技术(HTML、JavaScript、CSS等)。本文旨在分享一个在实际项目中应用的购物车前端开发案例。

本文聚焦于购物车的核心交互操作,包括产品数量的增减以及删除购物车内的商品项,并假设购物车中已存在若干商品。首先展示两张效果示意图。

购物车前端开发概述

HTML结构与框架使用

HTML部分代码使用了JQuery 1.11版本与Bootstrap 3框架。


<!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名称(如check-all、check-one、cart、subtotal),以便利用JQuery的过滤器快速定位特定元素。

JavaScript功能实现

Javascript代码需实现以下核心功能:

1. 实现商品全选功能。

2. 计算单个商品的小计金额(即单价乘以购买数量)。

3. 当用户选中购物车中的特定商品型号时,需重新计算页面底部的汇总信息,包括选中商品的种类、数量小计及金额小计。

4. 当用户删除购物车中的商品型号或修改购买数量时,需重新计算页面底部的汇总信息。

接下来对上述功能逐一进行说明:

1. 商品全选功能的实现逻辑。

全选功能与checkbox处理


$(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();
 });

为购物车表格中的每个复选框绑定单击事件。在此事件中,需判断用户点击的是“全选”复选框还是单个商品的复选框,这再次用到了前述的自定义class名称。需特别说明的是,JQuery读取元素属性通常使用attr()方法,但对于checkbox的checked属性,attr()无法正确读取,必须使用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)表示选择表格中所有索引大于0的tr元素(即排除第一个tr元素)。原因在于回顾HTML代码可知,第一个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

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

作者最新文章