购物车的收货地址js php,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 < len; i++) {

totalCount = listObj[i].pCount + totalCount;

}

ccount.innerHTML = totalCount;

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

for(var i = 0, len = btns.length; i < len; 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 < len; 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 < len; 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 < len; 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 < len; 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 < len; 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 < len; 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 < len; 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 < len; i++) {

cks[i].onchange = function() {

checkAllChecked();

totalPrice.innerHTML = getTotalPrice();

}

}

/*全选实现*/

allCheck.onchange = function() {

if(this.checked) {

for(var i = 0, len = cks.length; i < len; i++) {

cks[i].checked = true;

}

} else {

for(var i = 0, len = cks.length; i < len; 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 < len; 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 = 1;

updateObjById(pid, 0)

} else {

updateObjById(pid, -1)

}

tr.children[0].firstElementChild.checked = true;

checkAllChecked();

var price = tr.children[4].firstElementChild.innerHTML;

tr.children[5].firstElementChild.innerHTML = price * txtObj.value;

totalPrice.innerHTML = getTotalPrice();

}

ups[i].onclick = function() {

var txtObj = this.previousElementSibling;//上一个兄弟节点

var tr = this.parentNode.parentNode;

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

txtObj.value = Number(txtObj.value) + 1;

updateObjById(pid, 1)

tr.children[0].firstElementChild.checked = true;

checkAllChecked()

var price = tr.children[4].firstElementChild.innerHTML;

tr.children[5].firstElementChild.innerHTML = price * txtObj.value;

totalPrice.innerHTML = getTotalPrice();

}

dels[i].onclick = function() {

var tr = this.parentNode.parentNode;

var pid = tr.getAttribute("pid")

if(confirm("确定删除?")) {

//remove() 自杀

tr.remove();

listObj = deleteObjByPid(pid);

}

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

box.className = "box";

table.className = "hide";

} else {

box.className = "box hide";

table.className = "";

}

totalPrice.innerHTML = getTotalPrice();

}

}

/*检测是否要全选*/

function checkAllChecked() {

var isSelected = true; //全选是否会选中

for(var j = 0, len = cks.length; j < len; j++) {

if(cks[j].checked == false) {

isSelected = false;

break;

}

}

allCheck.checked = isSelected;

}

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/381268.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CLI下的网页浏览器之二——Lynx

出自&#xff1a;http://vb2005xu.javaeye.com/blog/230044 Lynx浏览器使用指南 Lynx是一个字符界面下的全功能的WWW浏览器。Lynx 可以运行在很多种操作系统下&#xff0c;如VMS, UNIX, Windows 95, Windows NT等&#xff0c;当然也包括Linux。 由于没有漂亮的图形界面&#xf…

stm32 整数加法循环时间_【教学设计】小数加法教学设计

小数加法教学设计刘秀锦舞钢市特殊教育学校教材分析本节课是第四单元“小数加减法”的第一课时&#xff0c;小数加减法是以整数加减法为基础进行教学的&#xff0c;本节课走踏实了&#xff0c;后边的知识才能顺利的进行下去&#xff0c;所以本节课还是以小步走、学一点、练一点…

天锐绿盾解密_天锐绿盾数据防泄密系统

天锐绿盾数据防泄密系统&#xff08;简称数据防泄密系统&#xff09;是一套从源头上保障数据安全和使用安全的软件系统。包含了文件透明加解密、内部文件流转、密级管控、离线管理、文件外发管理、灵活的审批流程、工作模式切换、服务器白名单等功能&#xff0c;并全面覆盖Mac、…

矩阵维度必须一致_如何从看得懂到会使用矩阵思维

本来我一开始是想学习如何使用艾森豪威尔矩阵的&#xff0c;但是利用学习观的方法想去网上找有关艾森豪威尔矩阵的例子时&#xff0c;发现网上几乎没有&#xff0c;网上能搜出来的都是对这个矩阵的介绍&#xff0c;看完这些介绍你会发现很简单&#xff0c;都能看懂&#xff0c;…

numpy 归一化_归一化(MinMax)和标准化(Standard)的区别

此文参考https://blog.csdn.net/u010947534/article/details/86632819定义上的区别归一化&#xff1a;将数据的值压缩到0到1之间&#xff0c;公式如下标准化&#xff1a;将数据所防伪均值是0&#xff0c;方差为1的状态&#xff0c;公式如下&#xff1a;归一化、标准化的好处&am…

python多态_Python基础入门18节-第十六节 面向对象如何理解多态

多态是面向对象的一大特性&#xff0c;Python本身也是一门多态性的语言。在Python中要实现多态&#xff0c;还是得借助于上节提到的继承。假设有这么一个场景&#xff0c;在夏季我们可以看到荷花、牡丹花、太阳花&#xff0c;夏天一到这些花全都开放了。这些花我们就将它理解多…

linux重启后root密码错误,Linux技巧| 解决Debian Root密码忘记的问题

Debian Root密码忘记开机 grub 菜单下进入单用户模式进行修改密码/修改系统文件。解决过程注&#xff1a;本教程适用于 Debian 7 8 91. 首先。重启一下系统。在开机 grub 内核选择菜单那里&#xff0c;迅速按“e”。2. 将光标移动到“linux”开头的那一行&#xff0c;将原来的“…

SilverLight学习笔记--Silverlight中WebService通讯

本文我们学习如何在Silverlight中使用WebService进行通讯。 新建项目Silverlight应用程序&#xff0c;命名为&#xff1a;SLWebService。在服务器端我们需要做两项目工作: 1、在Web项目中新建一个类Person&#xff0c;我们将在WebService中返回它的实例化对象。Person类定义如下…

导出文件_一招解决PDF文件导出图片

将PDF文件保存为高清图片是经常需要进行的保存方式之一&#xff0c;因为PDF文件虽然安全性高&#xff0c;但是相比较图片而言&#xff0c;还是不易进行查看的&#xff0c;那么如何将PDF文件导出图片呢&#xff1f;以前也了解过很多方法&#xff0c;不过最好的当然不是截图了。虽…

linux缓存文件用户权限错误,CVE-2019-11244漏洞到底该如何修复?--关于缓存文件权限设置...

2019年5月&#xff0c;Kubernetes社区(后面简称”社区“)修复了标号为CVE-2019-11244的安全漏洞&#xff0c;这个修复方案似乎并不彻底&#xff0c;于是有人发布Issue对此提出异议&#xff0c;希望提供进一步修复方案。虽然Kubernetes已经非常安全&#xff0c;但对于一些安全标…

高中数学40分怎么办_2019年第35届全国高中数学联赛试题及参考答案

2019年第35届全国高中数学联赛考试已结束&#xff0c;本文收集整理本次数学联赛的试题和参考答案&#xff0c;以供大家了解参考。本次数学联赛由全国高中数学联赛组委会统一命题&#xff0c;共分为一试和二试。一试时间为80分钟&#xff0c;包括8道填空题(每题8分)和3道解答题(…

一个把图片保存到SQL数据库的工具

因公司的业务需要,会把很多图片保存到数据库中.因此做了一个很简单的工具,把图片保存到SQL数据库中.1.可以连接到不同服务器上的SQL数据库,可以选择操作各个表;2.可以指定保存到数据库的图片格式(JPG or BMP);3.可以用windows图片和传真查看器预览图片.下载地址:一个把图片保存…

redis 哨兵_Redis哨兵机制的原理介绍

php中文网最新课程每日17点准时技术干货分享本篇文章给大家带来的内容是介绍Redis的哨兵机制&#xff0c;让大家了解哨兵机制的原理和如何实现。有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对你有所帮助。概述Redis的复制有一个缺点&#xff0c;当主…

BoooLee pyretoolkit -- 一个基于python re模块的在线正则表达式测试工具

为了学习python re模块正则表达式&#xff0c;寻找了一些正则表达式工具&#xff0c;除了komodo捆绑的rx toolkit外&#xff0c;其他的测试工具都是基于.net或其他引擎的&#xff0c;语法上多少有点出入。 干错自己写一个&#xff0c;用了2天时间&#xff0c;python re googl…

【大数据】NiFi 的基本使用

NiFi 的基本使用 1.NiFi 的安装与使用1.1 NiFi 的安装1.2 各目录及主要文件 2.NiFi 的页面使用2.1 主页面介绍2.2 面板介绍 3.NiFi 的工作方式3.1 基本方式3.2 选择处理器3.3 组件状态3.4 组件的配置3.4.1 SETTINGS&#xff08;通用配置&#xff09;3.4.2 SCHEDULING&#xff0…

linux 如何打包分区文件,Linux基础------文件打包解包---tar命令,文件压缩解压---命令gzip,vim编辑器创建和编辑正文件,磁盘分区/格式化,软/硬链接...

作业一&#xff1a;1)将用户信息数据库文件和组信息数据库文件纵向合并为一个文件/1.txt(覆盖)cat /etc/passwd /etc/group > /1.txt2)将用户信息数据库文件和用户密码数据库文件纵向合并为一个文件/2.txt(追加)cat /etc/passwd /etc/shadow >> /2.txt3)将/1.txt、/2.…

sqlserver大数据表操作慢_架构师必看!操作日志系统搭建秘技

​在Java开发中&#xff0c;我们经常会遇到一个棘手的问题&#xff1a;记录用户的操作行为。某些操作是相对简单的&#xff0c;我们可以逐条记录。但是某些操作行为却很难记录&#xff0c;例如编辑操作。在某一次操作中&#xff0c;用户可能编辑了对象A的几个属性&#xff0c;而…

sql共享功能目录无法更改_大企业数据库服务首选!AliSQL这几大企业级功能你不可不知...

MySQL代表了开源数据库的快速发展&#xff0c;从2004年前后的Wiki、WordPress等轻量级Web 2.0应用起步&#xff0c;到2010年阿里巴巴在电商及支付场景大规模使用MySQL数据库&#xff0c;再到2012年开始阿里云RDS for MySQL为成千上万家客户提供可靠的关系数据库服务&#xff0c…

递归下降语法分析器的构建_一文了解函数式查询优化器Spark SQL Catalyst

大数据技术与架构点击右侧关注&#xff0c;大数据开发领域最强公众号&#xff01;暴走大数据点击右侧关注&#xff0c;暴走大数据&#xff01;记录一下个人对sparkSql的catalyst这个函数式的可扩展的查询优化器的理解&#xff0c;目录如下&#xff1a;0. Overview1. Catalyst工…

被远程机器长时间无响应 (错误码:[308])_自动折叠式“Rollbot”为完全不受束缚的软机器人铺平了道路...

如今&#xff0c;大多数软机器人依靠外部电源和控制&#xff0c;使它们与车外系统连接或用硬件组装。现在&#xff0c;来自哈佛大学约翰保尔森工程与应用科学学院&#xff08;SEAS&#xff09;和加州理工学院的研究人员开发了受折纸结构启发的软机器人系统&#xff0c;可以根据…