购物车前端开发

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

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

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行上,再对触发单击事件的元素进行判断,进而决定执行何种操作。

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

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

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

时间: 2024-12-15 01:59:57

购物车前端开发的相关文章

web前端开发规范

本文原创,这里首先声明,转载注明本文出处,翻版必究! web前端开发规范的现实意义 1.提高团队的协作能力 2.提高代码的重复利用率 3.可以写出质量更高,效率更好的代码 4.为后期维护提供更好的支持 5.可读性高 一.命名规则 1.html命名规则: a.文件名称命名规则:统一使用小写英文字母.数字.下划线的组合,不得包含汉字空格和特殊字符 2.命名原则:方便理解.方便查找 b.索引文件命名原则:index.html.index.htm.index.asp.index.aspx.index.j

Web前端开发推荐阅读书籍、学习课程下载

转自http://www.xuanfengge.com/fe-books.html 前言 学校里没有前端的课程,那如何学习JavaScript,又如何使自己成为一个合格的前端工程师呢? 除了在项目中学习和跟着有经验的同事学习,读书也是必不可少的.书中有着相对完整的知识体系,每读一本好书都会带来一次全面的提高. 而如果深一脚浅一脚的学习,写出代码的质量会参差不齐.初学者的首要任务是成为靠谱的熟练开发者,能够稳定的输出有一定质量的代码. 前端技术发展速度特别快,总是涌现出很多新的东西,需要不断的学习

麦子学院-Web前端开发工程师系列培训教程

HTML+CSS基础入门1.课程介绍2.html的语法3.html的基本结构4.html的文档设置标记上(格式标记)5.html的文档设置标记下(文本标记)6.html图像标记img7.html超链接的使用8.html表格相关的标记9.html表格实战<简单的网页布局>10.html框架详解与框架布局实战11.HTML表单设计(上)12.HTML表单设计(下)13.使用CSS样式的方式14.定义CSS样式(CSS选择器)15.CSS常用属性(颜色属性)16.css常用属性(字体相关属性)17.

拿到十份互联网公司Offer,他是怎样学好web前端开发的?

Web前端工程师是近几年的新兴职业,也是目前火爆而且高薪的职业.不同的公司也有不同的叫法,比如:网页界面开发,网站设计等,要学好web前端开发,需要掌握什么方法与技巧? 一.Div和Table 这个是最简单的,也是最基础的.要熟练掌握div.form table.ul li .p.span.font这些标签,这些都是最常用的,特别是div和table,div用于布局.table也可以用于布局,但是不灵活,基本 table是用来和数据打交道. 二.CSS 这里说的css不包括css3,一般我们看到

7招提升你的前端开发效率

7招提升你的前端开发效率 前言 前端工程师其实是一个工作很杂的职位,除了要负责切图.写html/css/js外,还要解决一系列的浏览器兼容性.网页性能优化等问题,所以提高前端工程师的开发效率是势在必行的,也是前端工程化的体现. 对于开发效率,我个人理解是 开发效率 = 新增代码的效率 + 修改代码的效率 + 维护代码的效率 那么如何提高前端开发效率便可以按照前端工程化的理念来进行划分.下面我就介绍下7个提高前端开发效率的方法. 前端工程化 方法 1.切图 切图是一个前端最基础的技能,一般我们使用

前端开发笔记(2)css基础(上)

CSS介绍 层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言.CSS不仅可以静态地修饰网页,还可以配合各种脚本语言动态地对网页各元素进行格式化.CSS 能够对网页中元素位置的排版进行像素级精确控制,支持几乎所有的字体字号样式,拥有对网页对象和模型样式编辑的能力. <style type="text/css"> span{ color:red;

Web 前端开发学习之路(入门篇)

字数1374 阅读4622 评论0 喜欢49 以前学习过一段时间的web前端开发,整理了一些我看过的/我认为比较好的学习资料(网站.书籍).不要问我为啥没有进阶版,我只是一条产品汪而已,求轻喷.== 以下引用知乎 @李路 的话. 以我的经验,大部分技术,熟读下列四类书籍即可. 入门,用浅显的语言和方式讲述正确的道理和方法,如head first系列全面,巨细无遗地探讨每个细节,遇到疑难问题时往往可以在这里得到理论解答,如Definitive Guide/Programming xx系列实践,结合

互联网前端开发技术栈

互联网前端开发技术栈 前言 互联网建立60多年了,网站开发技术日新月异,但web前端始终离不开浏览器,最终还是HTML+JavaScript+CSS这3个核心,围绕这3个核心而开发出来大量技术框架/解决方案. 我从2000年初开始做网站开发,使用的技术不断迭代,一些消失了,更多的出现了. 最近写过  .NET技术大系概览 (迄今为止最全的.NET技术栈) ,相信很多网友感叹掌握的.NET技术远没有这个技术栈里面所描述的多. 问题 大家是否想过: Web前端开发究竟包含哪些技术呢? 我所掌握的技术

《开源分享1》:前端开发必备《Html-CSS中文手册》

一直想做一些优秀的资源分享内容,今天尝试整理了一下,以后会每天抽点时间发一些自认为不错的资料出来.帮助大家提高学习效率. 今天分享的内容:前端开发:<Html-CSS中文手册>! 本手册针对的是已有一定网页设计制作经验的读者.其目的是提供完整清晰的样式表内容的快速索引及进阶帮助.所以对于网页制作和样式表的基础知识,仅简单介绍,恕不赘述. 手册提供了完整的 CSS2.0 的属性(Properties).规则(At-Rules).伪类(Pseudo-Classes).伪元素(Pseudo-Elem