热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

购物车的收货地址jsphp,Javascript实现购物车功能的详细代码

我们肯定都很熟悉商品购物车这一功能,每当我们在某宝某东上购买商品的时候,看中了哪件商品,就会加入购物车中,最后结算。购物车这

我们肯定都很熟悉商品购物车这一功能,每当我们在某宝某东上购买商品的时候,看中了哪件商品,就会加入购物车中,最后结算。购物车这一功能,方便消费者对商品进行管理,可以添加商品,删除商品,选中购物车中的某一项或几项商品,最后商品总价也会随着消费者的操作随着变化。

现在,笔者对购物车进行了简单实现,能够实现真实购物车当中的大部分功能。在本示例当中,用到了Javascript中BOM操作,DOM操作,表格操作,COOKIE,json等知识点,同时,采用三层架构方式对购物车进行设计,对Javascript的综合应用较强,对Javascript初学者进阶有一定的益处。

请看主页效果图:

dc8a77f6ae53543fb67bcdfa35e25411.png

现在读者已经对主页的效果图进行了了解,我在这里附上主页的html代码,供读者参考,建议读者根据自己的思路写代码。

请看html代码:

商品列表页面

商品列表

我的购物车0

p1.jpg

智能手表酷黑,棒,棒,棒,棒¥998

添加购物车

p2.jpg

智能手机001金红色,酷酷酷酷¥1998

添加购物车

p3.jpg

华为手机002帅帅帅帅帅帅帅帅帅帅¥998

添加购物车

p4.jpg

华为手机003杠杠的¥2000

添加购物车

html结构代码有了之后,就可以对主页进行css表现设计,这里不对css进行过多讲解。

我们对主页进行设计之后,就可以进行与主页相关的DOM操作,涉及到添加按钮的点击事件,COOKIE和json的应用,COOKIE主要为了让当前数据与购物车进行共享,以方便操作。请看与之相关的Javascript代码:

这是index.js代码,主要是主页的相关操作:

/*

思路:

第一步:获取所要操作的节点对象

第二步:当页面加载完后,需要计算本地COOKIE存了多少【个】商品,把个数赋值给ccount

第三步:为每一个商品对应的添加购物车按钮绑定一个点击事件onclick

更改本地的COOKIE

获取当前商品的pid

循环遍历本地的COOKIE转换后的数组,取出每一个对象的pid进行对比,若相等则该商品不是第一次添加

从购物车中取出该商品,然后更pCount值追加1

否则:创建一个新的对象,保存到购物中。同时该商品的数量为1

*/

var ccount = document.getElementById("ccount"); //显示商品总数量的标签节点对象

var btns = document.querySelectorAll(".list dl dd button"); //所有的购物车按钮

//约定好用名称为datas的COOKIE来存放购物车里的数据信息 datas里所存放的就是一个json字符串

var listStr = COOKIEObj.get("datas");

/*判断一下本地是否有一个购物车(datas),没有的话,创建一个空的购物车,有的话就直接拿来使用*/

if(!listStr) { //没有购物车 datas json

COOKIEObj.set({

name: "datas",

value: "[]"

});

listStr = COOKIEObj.get("datas");

}

var listObj = JSON.parse(listStr); //数组

/*循环遍历数组,获取每一个对象中的pCount值相加总和*/

var totalCount = 0; //默认为0

for(var i = 0, len = listObj.length; i

totalCount = listObj[i].pCount + totalCount;

}

ccount.innerHTML = totalCount;

/*循环为每一个按钮添加点击事件*/

for(var i = 0, len = btns.length; i

btns[i].onclick = function() {

var dl = this.parentNode.parentNode;

var pid = dl.getAttribute("pid");//获取自定义属性

var arrs = dl.children;//获取所有子节点

if(checkObjByPid(pid)) {

listObj = updateObjById(pid, 1)

} else {

var imgSrc = arrs[0].firstElementChild.src;

var pName = arrs[1].innerHTML;

var pDesc = arrs[2].innerHTML;

var price = arrs[3].firstElementChild.innerHTML;

var obj = {

pid: pid,

pImg: imgSrc,

pName: pName,

pDesc: pDesc,

price: price,

pCount: 1

};

listObj.push(obj)

listObj = updateData(listObj);

}

ccount.innerHTML = getTotalCount();

}

}

这是COOKIE.js的代码,主要涉及COOKIE的设置获取操作,采用单例设计模式进行了封装设计,请看代码:

/*

单例设计模式

完整形式:[]中是可选项

document.COOKIE = “name=value[;expires=date][;path=path-to-resource][;domain=域名][;secure]”

*/

var COOKIEObj = {

/*

增加或修改COOKIE

参数:o 对象{}

name:string COOKIE名

value:string COOKIE值

expires:Date对象 过期时间

path:string 路径限制

domain:string 域名限制

secure:boolean true https false或undeinfed

*/

set: function(o) {

var COOKIEStr = encodeURIComponent(o.name) + "=" + encodeURIComponent(o.value);

if(o.expires) {

COOKIEStr += ";expires=" + o.expires;

}

if(o.path) {

COOKIEStr += ";path=" + o.path;

}

if(o.domain) {

COOKIEStr += ";domain=" + o.domain;

}

if(o.secure) {

COOKIEStr += ";secure";

}

document.COOKIE = COOKIEStr;

},

/*

删除

参数:n string COOKIE的名字

*/

del: function(n) {

var date = new Date();

date.setHours(-1);

//this代表的是当前函数的对象

this.set({

name: n,

expires: date

});

},

/*查找*/

get: function(n) {

n = encodeURIComponent(n);

var cooikeTotal = document.COOKIE;

var COOKIEs = cooikeTotal.split("; ");

for(var i = 0, len = COOKIEs.length; i

var arr = COOKIEs[i].split("=");

if(n == arr[0]) {

return decodeURIComponent(arr[1]);

}

}

}

}

下面的是server.js代码,主要对购物车中各种操作进行了封装,比如商品个数统计,更新获取本地数据等操作,方便代码管理,请看代码:

/*

功能:查看本地数据中是否含有指定的对象(商品),根据id

参数:id:商品的标识

*/

function checkObjByPid(id) {

var jsonStr = COOKIEObj.get("datas");

var jsonObj = JSON.parse(jsonStr);

var isExist = false;

for(var i = 0, len = jsonObj.length; i

if(jsonObj[i].pid == id) {

isExist = true;

break;

}

}

return isExist; //return false;

}

/*

功能:更新本地数据

参数:arr 数组对象

返回一个值:最新的本地转换后的数组对象

* */

function updateData(arr) {

var jsonStr = JSON.stringify(arr);

COOKIEObj.set({

name: "datas",

value: jsonStr

});

jsonStr = COOKIEObj.get("datas");

return JSON.parse(jsonStr);

}

/*

获取商品的总数量

返回:数字

*/

function getTotalCount() {

/*循环遍历数组,获取每一个对象中的pCount值相加总和*/

var totalCount = 0; //默认为0

var jsonStr = COOKIEObj.get("datas");

var listObj = JSON.parse(jsonStr);

for(var i = 0, len = listObj.length; i

totalCount = listObj[i].pCount + totalCount;

}

return totalCount;

}

/*

更新本地数据根据pid

id:商品的标识

*/

function updateObjById(id, num) {

var jsonStr = COOKIEObj.get("datas");

var listObj = JSON.parse(jsonStr);

for(var i = 0, len = listObj.length; i

if(listObj[i].pid == id) {

listObj[i].pCount = listObj[i].pCount + num;

break;

}

}

return updateData(listObj)

}

/*

获取本地数据

返回 数组对象

* */

function getAllData() {

var jsonStr = COOKIEObj.get("datas");

var listObj = JSON.parse(jsonStr);

return listObj;

}

function deleteObjByPid(id) {

var lisObj = getAllData();

for(var i = 0, len = lisObj.length; i

if(lisObj[i].pid == id) {

lisObj.splice(i, 1);

break;

}

}

updateData(lisObj);

return lisObj;

}

因为上述代码中涉及了进入购物车后的一些操作,读者看了之后可能会感动疑惑,不用担心,下面请看点击进入我的购物车之后的分析。

请看效果图:

df6cd7be960abd6969a6ea8afec2b524.png

笔者在主页中点击了三种商品,共点击了七次,在购物车中出现了相应商品以及价格计算。对于途中的各种信息,相信读者一目了然。请看本购物车的html代码:

购物车

购物车

返回商品列表页面

全选

图片

描述

数量

单价

小计

操作

购物车里没有任何商品

总价格:¥0

在对购物车进行相关的表现设计之后,既要进行Javascript行为设计,请看与本页相关的cart.js代码:

/*

思路:

第一步:当页面加载完后,根据本地的数据,动态生成表格(购物车列表)

获取所要操作的节点对象

判断购物车中是否有数据?

有:

显示出购物列表

没有:

提示购物车为空

第二步:当购物车列表动态生成后,获取tbody里所有 的checkeBox标签节点对象,看那个被选中就获取对应行小计进行总价格运算。

第三步:

为每一个checkbox添加一个onchange事件,根据操作更改总价格

第四步:全选

第五步:

为加减按钮添加一个鼠标点击事件

更改该商品的数量

第六步:删除

获取所有的删除按钮

为删除按钮添加一个鼠标点击事件

删除当前行,并更新本地数据

*/

var listObj = getAllData();

var table = document.getElementById("table")

var box = document.getElementById("box")

var tbody = document.getElementById("tbody");

var totalPrice = document.getElementById("totalPrice");

var allCheck = document.getElementById("allCheck");

if(listObj.length == 0) { //购物车为空

box.className = "box";

table.className = "hide";

} else {

box.className = "box hide";

table.className = "";

for(var i = 0, len = listObj.length; i

var tr = document.createElement("tr");

tr.setAttribute("pid", listObj[i].pid);

//{"pid":值,"pImg":值,"pName":值,"pDesc":值,"price":值,"pCount":1},

tr.innerHTML = '

' +

'' +

'

' +

'

' +

'' +

'

' +

'

' +

listObj[i].pDesc +

'

' +

'

' +

'-+' +

'

' +

'

' +

'¥' + listObj[i].price + '' +

'

' +

'

' +

'¥' + listObj[i].price * listObj[i].pCount + '' +

'

' +

'

' +

'删除' +

'

';

tbody.appendChild(tr);

}

}

/*

功能:计算总价格

*/

var cks = document.querySelectorAll("tbody .ck");

function getTotalPrice() {

cks = document.querySelectorAll("tbody .ck");

var sum = 0;

for(var i = 0, len = cks.length; i

if(cks[i].checked) { //如果当前被选中

var tr = cks[i].parentNode.parentNode;

var temp = tr.children[5].firstElementChild.innerHTML;

sum = Number(temp) + sum;

}

}

return sum;

}

/*循环遍历为每一个checkbox添加一个onchange事件*/

for(var i = 0, len = cks.length; i

cks[i].onchange = function() {

checkAllChecked();

totalPrice.innerHTML = getTotalPrice();

}

}

/*全选实现*/

allCheck.onchange = function() {

if(this.checked) {

for(var i = 0, len = cks.length; i

cks[i].checked = true;

}

} else {

for(var i = 0, len = cks.length; i

cks[i].checked = false;

}

}

totalPrice.innerHTML = getTotalPrice();

}

var downs = document.querySelectorAll(".down"); //一组减的按钮

var ups = document.querySelectorAll(".up"); //一组加的按钮

var dels = document.querySelectorAll(".del"); //一组删除按钮

for(var i = 0, len = downs.length; i

downs[i].onclick = function() {

var txtObj = this.nextElementSibling;//下一个兄弟节点

var tr = this.parentNode.parentNode;

var pid = tr.getAttribute("pid");

txtObj.value = txtObj.value - 1;

if(txtObj.value <1) {

txtObj.value &#61; 1;

updateObjById(pid, 0)

} else {

updateObjById(pid, -1)

}

tr.children[0].firstElementChild.checked &#61; true;

checkAllChecked();

var price &#61; tr.children[4].firstElementChild.innerHTML;

tr.children[5].firstElementChild.innerHTML &#61; price * txtObj.value;

totalPrice.innerHTML &#61; getTotalPrice();

}

ups[i].onclick &#61; function() {

var txtObj &#61; this.previousElementSibling;//上一个兄弟节点

var tr &#61; this.parentNode.parentNode;

var pid &#61; tr.getAttribute("pid");

txtObj.value &#61; Number(txtObj.value) &#43; 1;

updateObjById(pid, 1)

tr.children[0].firstElementChild.checked &#61; true;

checkAllChecked()

var price &#61; tr.children[4].firstElementChild.innerHTML;

tr.children[5].firstElementChild.innerHTML &#61; price * txtObj.value;

totalPrice.innerHTML &#61; getTotalPrice();

}

dels[i].onclick &#61; function() {

var tr &#61; this.parentNode.parentNode;

var pid &#61; tr.getAttribute("pid")

if(confirm("确定删除&#xff1f;")) {

//remove() 自杀

tr.remove();

listObj &#61; deleteObjByPid(pid);

}

if(listObj.length &#61;&#61; 0) { //购物车为空

box.className &#61; "box";

table.className &#61; "hide";

} else {

box.className &#61; "box hide";

table.className &#61; "";

}

totalPrice.innerHTML &#61; getTotalPrice();

}

}

/*检测是否要全选*/

function checkAllChecked() {

var isSelected &#61; true; //全选是否会选中

for(var j &#61; 0, len &#61; cks.length; j

if(cks[j].checked &#61;&#61; false) {

isSelected &#61; false;

break;

}

}

allCheck.checked &#61; isSelected;

}

上述代码完成了购物车中的相关操作&#xff0c;比如价格计算&#xff0c;商品数量更换&#xff0c;商品删除等操作。

到这里我们已经完成了购物车的大部分功能&#xff0c;我们对html&#xff0c;css, BOM,DOM,json,COOKIE等进行了综合应用&#xff0c;相信读者理解之后一定会对自己的Javascript学习更进一步&#xff0c;本示例中涉及的大部分代码都在本页中贴出&#xff0c;部分代码资源未向读者展示&#xff0c;读者可以点击下面的资源链接&#xff0c;下载本示例的全部代码及图片资料。本示例采用HBuilder编译器编译运行&#xff0c;涉及COOKIE操作&#xff0c;请读者自行安装服务器或者添加到HBuilder中运行查看。

以上就是本文的全部内容&#xff0c;希望对大家的学习有所帮助&#xff0c;也希望大家多多支持脚本之家。



推荐阅读
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • 在Android中解析Gson解析json数据是很方便快捷的,可以直接将json数据解析成java对象或者集合。使用Gson解析json成对象时,默认将json里对应字段的值解析到java对象里对应字段的属性里面。然而,当我们自己定义的java对象里的属性名与json里的字段名不一样时,我们可以使用@SerializedName注解来将对象里的属性跟json里字段对应值匹配起来。本文介绍了使用@SerializedName注解解析json数据的方法,并给出了具体的使用示例。 ... [详细]
author-avatar
hy
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有