基础购物车(Javascript)

使用Javascript写一个基础购物车,其中包含商品数量加加减减,下面的总价和总数量跟着商品数量变动,还可以自己添加需要的商品。

基础购物车的结构样式如下:

  HTML代码:

<body>
		<table border="1px" cellpadding="20px" style="border-collapse: collapse;">
			<thead>
				<tr>
					<th>商品名称</th>
					<th>商品价格</th>
					<th>商品数量</th>
					<th>商品操作</th>
				</tr>
			</thead>
			<tbody id="goods">
				<tr>
					<td>风扇</td>
					<td>24.8¥</td>
					<td><button>-</button> 0 <button>+</button></td>
					<td><button>修改</button> <button>删除</button></td>
				</tr>
			</tbody>
			<footer id="total">
				<tr>
					<td>总价</td>
					<td id="gross"></td>
					<td>总数量</td>
					<td id="qty"></td>
				</tr>
			</footer>
		</table>
		<button class="addition">添加</button>
		<br />
		<!-- 点击添加显示 -->
		<div class="inp" style="display: none;">
			<input class="des" type="text" placeholder="请输入商品名称" />
			<input class="cost" type="number" placeholder="请输入商品价格" />
			<input class="mag" type="number" placeholder="请输入商品数量" />
			<br />
			<button class="append">添加</button>
			<button class="cancel">取消</button>
		</div>
		<!-- 点击修改显示 -->
		<div class="amend" style="display: none;">
			<input class="dess" type="text" placeholder="请输入商品名称" />
			<input class="costs" type="number" placeholder="请输入商品价格" />
			<input class="mags" type="number" placeholder="请输入商品数量" />
			<br />
			<button onclick="appends()">确定</button>
			<button onclick="cancels()">取消</button>
		</div>
		<script src="js/basics.js"></script>
	</body>

 css代码:

<style>
			tr,
			td {
				text-align: center;
			}
		</style>

js代码:

// let声明一个变量 为data
let data;
// 声明一个最大的id
let maxid;
// 声明一个变量 为内容下标的id
let a;
// 创建 XMLHttpRequest 对象
let xhr = new XMLHttpRequest();
// 使用 open 方法指定要请求的地址、类型和方式
xhr.open('get', 'js/basics.json', true);
// 发送数据
xhr.send();
// 绑定 onreadystatechange 事件,判断 readyState 和 status 的状态
xhr.onreadystatechange = function() {
	// 第一个判断到哪一步,交互流程,有 5 个阶段 从0开始 4表示交互流程完毕 200是状态请求成功
	if (xhr.readyState == 4 && xhr.status == 200) {
		let text = xhr.responseText;
		console.log(text);
		// 将JSON中的数据转化为对象 接收服务器数据 一般为字符串
		data = JSON.parse(text);
		console.log(data);
		// 调用函数
		basic(data);
		// for循环遍历数组
		for (let i = 0; i < data.length; i++) {
			// 判断 当最大的id大于商品最大的id时 最大的id=商品的id
			if (maxid > data[i].id) {
				maxid = data[i].id
			}
		}
	}
};
// 封装函数
function basic(d) {
	let str = '';
	// let 声明一个变量 total为总价 总价从零开始
	let total = 0;
	// let 声明一个变量 amount为总数量 总数量从零开始
	let amount = 0;
	// let声明变量为gross 通过id名在文档中找到gross
	let gross = document.getElementById('gross');
	// let声明变量为qty 通过id名在文档中找到qty
	let qty = document.getElementById('qty');
	for (let i = 0; i < data.length; i++) {
		// +=是先算在等于
		// 总价等于元素的数量*所对应的价格相加
		total += data[i].num * data[i].price;
		// 总数量等于所有数据的数量 并转为整数
		amount += parseInt(data[i].num);
		// str拼接
		str += `<tr>
					<td>${data[i].name}</td>
					<td>${data[i].price}</td>
					<td><button onclick="minus(${i})">-</button> ${data[i].num} <button onclick="add(${i})">+</button></td>
					<td><button onclick="alter(${i})">修改</button> <button onclick="del(${i})">删除</button></td>
				</tr>`;
	}
	// 元素.innerHTML=内容 改变总价的内容 
	gross.innerHTML = total;
	// 元素.innerHTML=内容 改变总数量的内容
	qty.innerHTML = amount;
	// 渲染数据
	document.getElementById('goods').innerHTML = str;
};

// 数量按钮减1
// 减号事件绑定点击事件 传参
function minus(i) {
	// 当商品数量大于0时
	if (data[i].num > 0) {
		// 商品数量减一
		data[i].num--;
	} else {
		// 否则弹窗提示不能为空
		alert("商品数量不能为负")
	};
	// 调用函数
	basic(data);
};

// 数量加1
function add(i) {
	data[i].num++;
	// 调用函数
	basic(data);
};

// 商品删除
// 点击删除按钮 传参 
function del(i) {
	data.splice(i, 1)
	// 调用函数
	basic(data);
};

// 获取添加按钮
let addition = document.getElementsByClassName('addition')[0];
console.log('addition');
// 获取下面的输入框
let inp = document.getElementsByClassName('inp')[0];
console.log('inp');
// 给添加按钮绑定点击事件
addition.onclick = function() {
	// 当点击添加按钮时,下面的输入框出现
	inp.style = "display:block"
};

// 点击取消按钮输入框隐藏
// 获取取消按钮
let cancel = document.getElementsByClassName('cancel')[0];
console.log('cancel');
// 给取消按钮绑定点击事件
cancel.onclick = function() {
	// 点击取消按钮 下面的三个输入框隐藏并清空
	inp.style = "display:none";
	des.value = null;
	cost.value = null;
	mag.value = null;
};

// 添加事件
// 获取向上添加的添加按钮
let append = document.getElementsByClassName('append')[0];
console.log('append');
// 获取三个输入框
let des = document.getElementsByClassName('des')[0];
console.log('des');
let cost = document.getElementsByClassName('cost')[0];
console.log('cost');
let mag = document.getElementsByClassName('mag')[0];
console.log('mag');
// 给添加绑定点击事件
append.onclick = function() {
	console.log(data);
	// 判断内容都不为空且价格大于零 数量大于等于零 并且数量为整数
	if (des.value != '' && cost.value != '' && mag.value != '' && cost.value > 0 && mag.value >= 0 && mag.value %
		1 === 0) {
		// 通过数组尾部添加添加新的内容
		data.push({
			"id": ++maxid,
			"name": des.value,
			"price": parseFloat(cost.value),
			"num": parseInt(mag.value)
		})
		// 添加上以后下面的输入框隐藏并清空
		inp.style = "display:none";
		des.value = '';
		cost.value = '';
		mag.value = '';
		console.log(data);
		basic(data);
	} else {
		alert("信息填写完整")
	};
};

// 修改事件
// 获取修改隐藏的输入框
// 给修改按钮添加点击事件
let amend = document.getElementsByClassName('amend')[0];
// 获取三个输入框
let dess = document.getElementsByClassName('dess')[0];
console.log('dess');
let costs = document.getElementsByClassName('costs')[0];
console.log('costs');
let mags = document.getElementsByClassName('mags')[0];
console.log('mags');
// 给添加绑定点击事件 点击添加出现编辑弹窗
function alter(index) {
	console.log(index);
	amend.style.display = "block";
	// 数据回显
	dess.value = data[index].name;
	costs.value = data[index].price;
	mags.value = data[index].num;
	// a等于数据下标的id
	a = data[index].id;
};
// 编辑添加
// 点击下面输入框里的添加 
function appends() {
	// 判断三个输入框任意一个为空或价格小于0或数量小于0时 提示信息有误
	if (dess.value == '' || costs.value == '' || mags.value == '' || costs.value < 0 || mags.value < 0) {
		alert("信息有误");
		// 否则for循环遍历数组
	} else {
		for (let i = 0; i < data.length; i++) {
			// if判断用户输入的id等于内容的id时 内容修改
			if (data[i].id == a) {
				data[i].name = dess.value;
				data[i].price = costs.value;
				data[i].num = mags.value;
				// 修改完成 输入框隐藏 调用渲染函数
				alert("确认修改");
				amend.style.display = "none";
				basic(data);
				return;
			}
		}
		// 否则提示没有找到相应的数据 输入框隐藏
		amend.style.display = 'none';
	};
};
// 编辑取消
function cancels() {
	// 点击取消,编辑的输入框隐藏,数据重新渲染
	amend.style = "display:none";
	basic(data);
};

json假数据:

[{
	"id":1,
	"name":"风扇",
	"price":"24.8",
	"num":0
	
},{
	"id":2,
	"name":"南街村拌面",
	"price":"5",
	"num":0
	
},{
	"id":3,
	"name":"甜美风小裙子",
	"price":"99.8",
	"num":0
	
},{
	"id":4,
	"name":"空调",
	"price":"1688",
	"num":0
	
},{
	"id":5,
	"name":"维达纸巾",
	"price":"2.5",
	"num":0
	
},{
	"id":6,
	"name":"衬衣",
	"price":"50",
	"num":0
}]

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

百度智能云推出智能运维工具,云助手让云服务器运维更简单

为了提升云服务器执行命令的效率&#xff0c;百度智能云发布了 SmartTerm 远程连接终端。不止于此&#xff0c;为了更加极致地提升运维效率&#xff0c;我们又推出了「云助手」这款轻量快捷的运维工具。 ​ 只有做过云服务器运维的人才知道管理上万台云服务器有多崩溃。在海量…

全局指令选择

概述 基于SelectionDAG 的指令选择方法可以生成质量较高的机器码&#xff0c;但代价是开发难度和代码复杂度较高 快速指令选择方法复杂度较低&#xff0c;但代码质量较差。为了综合二者的优点&#xff0c;取长补短&#xff0c;LLVM在现有的架构上实现了全局指令选择&#xff…

四川音盛佳云电子商务有限公司引领商业新潮流

在当今这个数字化飞速发展的时代&#xff0c;电商行业正以其独特的魅力吸引着越来越多的目光。而在众多电商企业中&#xff0c;四川音盛佳云电子商务有限公司凭借其专业、专注的抖音电商服务&#xff0c;逐渐崭露头角&#xff0c;成为行业的佼佼者。 四川音盛佳云电子商务有限…

AI智能盒子助力打造垃圾发电AI应用标杆!

垃圾焚烧发电作为一种新型的垃圾处理方式&#xff0c;能将其转化为电能&#xff0c;实现资源的再利用&#xff0c;成为实现节能环保的重要方式之一。为有效落实环境、安全、健康及社会责任管理体系&#xff0c;知名垃圾发电投资运营商光大环保能源致力于广泛利用科技&#xff0…

HarmonyOS开发知识 :扩展修饰器,实现节流、防抖、权限申请

引言 防重复点击&#xff0c;利用装饰器面向切面&#xff08;AOP&#xff09;的特性结合闭包&#xff0c;实现节流、防抖和封装权限申请。 节流 节流是忽略操作&#xff0c;在触发事件时&#xff0c;立即执行目标操作&#xff0c;如果在指定的时间区间内再次触发了事件&…

frp安装与配置

个人从网上杂乱的信息中学习、试错&#xff0c;记录自己成功配置的方法&#xff0c;避免遗忘 一、frp的下载 因目前无法下载&#xff0c;仅保留下载方法&#xff0c;版本号根据实际修改&#xff0c;目前使用0.54版&#xff0c;不同系统下载不同文件。 wget https://github.c…

Python Django Vue3 在线商城网站 在线商城后台管理 案例源码

源码地址获取 演示视频 Python DjangoVue3 在线商城网站&#xff0c;商城管理后台系统案例源码 附带运行教程&#xff0c;开发工具&#xff0c;系统运行演示 技术栈:Django Vue3 开发工具:Pycharm 后端构建工具:Pip 前端构建工具:WebPack 运行环境:Windows Python版本:3.11 Nod…

制作ubuntu18.04 cuda10.2+ROS1+opencv 4.5.4的 docker镜像

如果搭建的版本高可以参考&#xff1a; https://gitlab.com/nvidia/container-images/l4t-jetpack.git 如果版本比较低&#xff0c;按照下面的步骤进行操作&#xff1a; 使用的硬件平台为Xavier NX&#xff0c;系统环境如下图&#xff1a; 搭建docker环境需求跟实际环境一致如下…

【CVPR2024】面向StableDiffusion的编辑算法FreePromptEditing,提升图像编辑效果

近日&#xff0c;阿里云人工智能平台PAI与华南理工大学贾奎教授团队合作在深度学习顶级会议 CVPR2024 上发表 FPE(Free-Prompt-Editing) 算法&#xff0c;这是一种面向StableDiffusion的图像编辑算法。在这篇论文中&#xff0c;StableDiffusion可用于实现图像编辑的本质被挖掘&…

智慧之光照亮黑暗矿井:揭秘未来矿山的智能化革命

1. 煤矿行业背景概述 1.1 煤矿行业产能概述 截至2018年底&#xff0c;全国安全生产许可证等证照齐全的生产煤矿3373处&#xff0c;产能35.3亿吨/年。 已核准&#xff08;审批&#xff09;、开工建设煤矿1010处&#xff0c;产能10.3亿吨/年。 13个亿吨级煤炭能源基地&#xf…

Vulnhub——AI: WEB: 1

渗透复现 &#xff08;1&#xff09;目录扫描爆破出隐藏页面info.php和传参页面&#xff0c;泄露网站绝对路径并且存在SQL注入点 &#xff08;2&#xff09;已知网站绝对路径&#xff0c;存在SQL注入点&#xff0c;尝试OS-shell写入 &#xff08;3&#xff09;OS-shell写入后…

数据库:与红黑树不同的延迟序列

在内存里维护一个序列&#xff0c;可能第一个想到的就是红黑树。但是&#xff0c;红黑树算法复杂&#xff0c;这还不是主要的&#xff0c;主要的问题是&#xff1a;红黑树的空间利用率低。 红黑树的空间利用率 一个红黑树的节点&#xff0c;包括父节点指针、两个子节点指针、…

集团门户网站的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;论坛管理&#xff0c;集团文化管理&#xff0c;基础数据管理&#xff0c;公告通知管理 前台账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;论坛&#xff0…

python小白兔做操 青少年编程电子学会python编程等级考试三级真题解析2021年12月

python小白兔做操 2021年12月 python编程等级考试级编程题 一、题目要求 1、编程实现 小白兔们每天早上都到草坪上做早操。做操前&#xff0c;首先要按照身高由矮到高排个队&#xff0c;下列代码实现了排队的功能。首先读取小白兔的只数&#xff0c;然后读取每只小白兔的身…

鸿蒙实现金刚区效果

前言&#xff1a; DevEco Studio版本&#xff1a;4.0.0.600 所谓“金刚区"是位于APP功能入口的导航区域&#xff0c;通常以“图标文字”的宫格导航的形式出现。之所以叫“金刚区”&#xff0c;是因为该区域会随着业务目标的改变&#xff0c;展示不同的功能图标&#xff…

Android OTA 升级基础知识详解+源码分析

前言&#xff1a; 本文仅仅对OTA升级的几种方式的概念和运用进行总结&#xff0c;仅在使用层面对其解释。需要更详细的内容我推荐大神做的全网最详细的讲解&#xff1a; https://blog.csdn.net/guyongqiangx/article/details/129019303?spm1001.2014.3001.5502 三种升级方式…

ubuntu的home内存不足的解决办法(win和ubuntu双系统)

这种解决办法前提是windows和ubuntu双系统 首先在windows系统上创建一个空的硬盘分区 然后在ubuntu系统上把这个空的硬盘放在主目录里 然后可以把东西存在这个文件夹中 如下图&#xff0c;但实际主目录的内存没有变&#xff0c;以后存东西就在这个文件夹里面就好了 具体操作…

【Gradio】Chatbots 如何用 Gradio 创建聊天机器人

Creating A Chatbot Fast 简介 聊天机器人是大型语言模型的一个流行应用。使用 gradio &#xff0c;您可以轻松构建您的聊天机器人模型的演示&#xff0c;并与您的用户分享&#xff0c;或者使用直观的聊天机器人用户界面自己尝试。 本教程使用 gr.ChatInterface() &#xff0c;…

「51媒体」总台,地方卫视媒体邀约新闻报道采访怎么做?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 总台对选题要求非常严格&#xff0c;在想做总台新闻报道之前&#xff0c;让我们先来了解下总台对新闻选题有哪些要求&#xff1a; 一、新闻价值 社会意义&#xff1a;新闻报道的首要任务…

【电源开发】输出电压纹波

输出电压纹波是什么 电压纹波指的是直流输出电压中一个交流部分 减小输出电压纹波的方法 调整输出端的电容值 提高开关电源的工作频率