如何用原生JS写一个简单购物车?来这篇文章告诉你。

2023-11-10

首先声明这仅仅只是个人理解而已,有什么错误或者缺少大家尽管在评论区发出来,共同学习,一起进步。

首先呢?我们要创建一个HTML基础代码。

基础HTML代码模板如下:他是比较关键的,是我们接下来了解的属性相关,可以直接复制拿来用的哈,它的意义就是搭载接下来的属性。

 HTML: 

​
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title></title>
		<link rel="stylesheet" href="css/index.css">
	</head>
	<body>

		<table border="1" cellspacing="0" cellpadding="0">
			<tr>
				<th>名称</th>
				<th>价格</th>
				<th>打折</th>
				<th>数量</th>
				<th>操作</th>
			</tr>
			<tbody id="ProductInfo">

			</tbody>

			<div class="wrap clearfix">
				<tfoot>
					<tr>
						<td></td>
						<td id="FooterSum">总价:¥<span id="prices">0</span></td>
						<td></td>
						<td>总数量:<span id="nums">0</span></td>
						<td></td>
					</tr>
				</tfoot>

				<div>
					<button id="product">添加商品</button>
					<div id="shopbox">
						<button id="pushbut">添加</button>
						<button id="cancel">取消</button>
						<input type="text" id="shoptext" placeholder="请输入商品名称">
						<input type="number" id="shopprice" placeholder="请输入商品价格">
						<input type="number" id="rebate" placeholder="请输入商品折扣">
						<input type="number" id="shopnum" placeholder="请输入商品数量">
					</div>
				</div>
	</body>
</html>

​

CSS:

* {
	margin: 0px;
	padding: 0px;
}

a {
	text-decoration: none;
}

.wrap {
	width: 1180px;
	margin: 0 auto;
}

td,
tr {
	border: 1px solid black;
}

table{
	margin-left: 11.5%;
}

th,
td {
	width: 235px;
	height: 50px;
	text-align: center;
}

span {
	padding: 0px 10px;
}

.cut,
.add,
.collect,
.delete {
	padding: 5px;
	margin: 7px;
}

#product {
	padding: 10px;
	margin-left: 11.5%;
}

#pushbut�cancel {
	padding: 5px;
}

#shopbox {
	display: none;
}

#shopbox{
	margin-left: 11.5%;
}

接下来就是最重要的JS部分:

我们先创建一个数组,我们在这个数组上进行操作

let Data = [{
							num: 0,
							price: 5000,
							discount: 85,
							name: '鸭梨X',
							id: 1,
						},
						{
							num: 0,
							price: 100,
							discount: 75,
							name: 'GB003',
							id: 2,
						},
						{
							num: 0,
							price: 20,
							discount: 50,
							name: '六神花露水',
							id: 3,
						}
					]

获取到DOM进行渲染操作

let ProductInfo = document.querySelector('#ProductInfo');
					let prices = document.querySelector('#prices');
					let nums = document.querySelector('#nums');
					let addition = document.querySelector('#product');
					let shopbox = document.querySelector('#shopbox');


					function func(arr) {
						ProductInfo.innerHTML = '';
						let Str = ''
						for (let i = 0; i < arr.length; i++) {
							Str += '<tr class="RowList"><td class="shopnamenow">' + arr[i].name + '</td>' +
								'<td>¥<span class="shopPriceNow">' + arr[i].price + '</span></td>' + '<td>' + Data[i].discount +
								'%</td>' +
								'<td class="bcc"><button class="cut" onclick="sub(' + i + ')">-</button><strong class="shopNumNow">' +
								Data[i].num + '</strong><button class="add" onclick="Add(' + i + ')">+</button></td>' +
								'<td><button class="collect">编辑</button><button class="delete" onclick="dele(' + i +
								')">删除</button></td></tr>'
						}
						ProductInfo.innerHTML = Str;
					}
					func(Data);

效果图如下:数量操作部分:

let pushbut = document.querySelector('#pushbut')
					let cancel = document.querySelector('#cancel')
					var del = document.querySelectorAll('.del');

					// 增加计算
					function Add(i) {
						let RowNum = document.querySelector('#ProductInfo');
						let shopNum = RowNum.getElementsByTagName('strong');
						Data[i].num++;
						shopNum[i].innerHTML = Data[i].num;
						amount++;
						nums.innerHTML = amount;
						totalPrices += Data[i].price;
						prices.innerHTML = totalPrices
					}

					// 减少计算
					function sub(i) {
						if (Data[i].num > 0) {
							Data[i].num--;
							totalPrices -= Data[i].price;
							amount--;
							prices.innerHTML = totalPrices;
							nums.innerHTML = amount;
						}
						let RowNum = document.querySelector('#ProductInfo');
						let shopNum = RowNum.getElementsByTagName('strong');
						shopNum[i].innerHTML = Data[i].num;
					}

 删除和添加商品:

// 删除操作
					function dele(i) {

						if (Data[i].num > 0) {
							totalPrices -= (Data[i].price * Data[i].num);
							amount -= Data[i].num;
							prices.innerHTML = totalPrices;
							nums.innerHTML = amount;
						}
						Data.splice(i, 1)
						func(Data);
					}
					
					// 添加数据
					let totalPrices = 0;
					let amount = 0;
					
					addition.onclick = function() {
						shopbox.style.display = 'block';
						addition.style.display = 'none';
					}
					cancel.onclick = function() {
						shopbox.style.display = 'none';
						addition.style.display = 'block';
					}
					let nullShop = NaN;
					pushbut.onclick = function() {
						let shopnum = document.querySelector('#shopnum').value;
						let shopprice = document.querySelector('#shopprice').value;
						let shoptext = document.querySelector('#shoptext').value;
						let rebate = document.querySelector('#rebate').value;
						if (shopnum != '' || shopprice != '' || rebate != '' || shoptext != '') {
							Data.push({
								num: parseInt(shopnum),
								discount: parseInt(rebate),
								price: parseInt(shopprice),
								name: shoptext,
							})
							amount = parseFloat(amount) + parseFloat(shopnum);
							nums.innerHTML = amount;
							totalPrices += parseFloat(shopnum) * parseFloat(shopprice);
							prices.innerHTML = totalPrices;
							func(Data)
						} else {
							alert(' * 未添加商品信息 * ');
						}
					}

不多说我们直接看效果:

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何用原生JS写一个简单购物车?来这篇文章告诉你。 的相关文章

随机推荐

  • Linux 内核蓝牙驱动移植

    实验原理 FS MP1A开发板蓝牙采用 AP6236 AP6212 WIFI蓝牙二合一芯片 蓝牙部分通过 usart3与 SoC 进行数据交互 注意 此部分内容为 AP6236 AP6212 移植过程 如果 WIFI 蓝牙是 USB 模块可
  • 技术部岗位职责——技术部经理

    一 制定工作计划 根据企业新产品开发 工艺技术改进计划制定技术部的年度 季度工作目标和工作计划 经批准后组织实施 根据产品研发与工艺技术发展需要 制定工艺试验研究计划 并组织实施 二 技术研发管理 编制本部门各项管理程序 新产品工艺技术标准
  • OpenWrt Makefile 整体分析

    分析版本 svn svn openwrt org cn openwrt branches backfire OpenWrt基本结构 target Linux 目录里面是各平台 arch 的相关代码 target linux config 文
  • oracle中存储过程 查询出多条数据的处理方法

    oracle中存储过程 查询出多条数据的处理方法 用游标处理 定义游标 cursor a is select begin open a loop fetch a into 自己定义的变量 开始操作 end loop close a end
  • Charles下载ssl证书-app端

    1 点击help 选择SSL Proxying 选择安装app端ssl证书 2 这里可以看到我们的IP 以及端口号 3 在手机端更改WiFi的代理 切换为手动代理 IP端口更改为提示的信息 注意电脑端跟移动端必须保持在同一网络下 4 这里电
  • Secure Federated Matrix Factorization学习总结

    Secure Federated Matrix Factorization学习总结 背景 传统的矩阵分解推荐系统 会泄漏用户的评分信息 特征向量 可能大家会觉得泄漏这两种信息不重要 但是通过这两种信息 恶意攻击者可以进行inference
  • 域渗透笔记-证书服务器(ADCS)安装

    什么是ADCS AD CS证书服务 SSL证书 可以部署企业根或独立根建立SSL加密通道 这是所有服务器证书 无论品牌 申请方式都可以起到的功能 唯一的价值区别在于加密强度 目前 达到128位对称加密强度的服务器证书均可以实现有保障的加密通
  • python抢淘宝的东西-Python 实现毫秒级淘宝抢购脚本的示例代码

    本篇文章主要介绍了Python 通过selenium实现毫秒级自动抢购的示例代码 通过扫码登录即可自动完成一系列操作 抢购时间精确至毫秒 可抢加购物车等待时间结算的 也可以抢聚划算的商品 博主不提供任何服务器端程序 也不提供任何收费抢购软件
  • 关于解决Uncaught SyntaxError: The requested module ‘/node_modules/.vite/deps/vue-router.js?v=569ce1cd‘ d

    1 按照官方文档我们需要引入VueRouter 但是会报错 大致翻译为 请求的模块 node modules vite deps vue router js V 569ce1cd 没有提供名为 default 的导出 因为vue底层代码 导
  • 输入一个字符串,编写函数统计该字符串中的字母、数字和其他字符的个数;

    欢迎加qq群 453398542 学习讨论 会定期分享资料课程 解答问题 输入一个字符串 编写函数统计该字符串中的字母 数字和其他字符的个数 include
  • 高通9008固件下载备份工具

    高通9008固件下载备份工具 www bbs 16rd com
  • Spring项目配置文件中RabbitMQ监听器各个参数的作用

    spring rabbitmq listener simple concurrency 设置监听器容器的并发消费者数量 默认为1 即单线程消费 spring rabbitmq listener simple max concurrency
  • MySql数据库varchar和java字符串length()长度tips

    Java 中字符串以 Unicode 方式编码的 其长度通常计算的是字符数 一个中文也算一个字符 public static void main String args String fileName 中文English 12345 中文
  • CTFshow之web5

    CTFshow web web5 考察md5绕过 web5 考察md5绕过 首先打开页面是一个页面源码 我们先来进行代码审计 看有没有可以利用的地方 重点审计这段代码
  • Bitlocker加密,与解除加密

    引文 应为C盘空间不够用了 想着用U盘从新给C盘分下区 操作时才发现我系统里的磁盘都是Bitlocker加密的 分区工具操作不了磁盘 所以就找到一下方法来解决 1 先讲一下解除加密 直接点击 设置 gt 隐私和安全性 gt 设备加密 gt
  • Android PackageManagerService源码分析和APK安装原理详解

    前些天发现了一个蛮有意思的人工智能学习网站 8个字形容一下 通俗易懂 风趣幽默 感觉非常有意思 忍不住分享一下给大家 点击跳转到教程 一 PackageManagerService简称PMS PackageManagerService是An
  • Unity Physics.OverlapSphere实现冲击波

    知识点1 球形射线检测 根据 层级Layer 和 半径值球形范围 内 过滤获得 Collider数组 用途 冲击波 对范围内游戏对象造成伤害 Physics OverlapSphere gameObject transform positi
  • 熔断,降级,限流区别

    熔断 限流 降级都是保持系统稳定运行的策略 但针对的场景有所不同 熔断 服务熔断的作用类似于我们家用的保险丝 当某服务出现不可用或响应超时的情况时 为了防止整个系统出现雪崩 暂时停止对该服务的调用 上面的解释中有两个很关键的词 一个是暂时
  • 推荐几个好用又好玩的vscode插件!

    推荐几个有用的插件 会提高你的开发效率 走过路过不要错过 一 koroFileHeader 先来一个镇场子的 一键生成佛祖保佑 下载koroFileHeader插件 安装之后 新建一个文件 这时候会自动生成一个模板 显示作者的相关信息 当然
  • 如何用原生JS写一个简单购物车?来这篇文章告诉你。

    首先声明这仅仅只是个人理解而已 有什么错误或者缺少大家尽管在评论区发出来 共同学习 一起进步 首先呢 我们要创建一个HTML基础代码 基础HTML代码模板如下 他是比较关键的 是我们接下来了解的属性相关 可以直接复制拿来用的哈 它的意义就是