HTML购物车示例(勾选、删除、添加和结算功能)

news2024/11/18 12:41:55

以下是一个简单的HTML购物车示例,包含勾选、删除、添加和结算功能。结算功能使用PHP实现,可以获取选中商品的ID。

在这里插入图片描述

以下是一个简单的HTML购物车示例,包含勾选、删除、添加和结算功能。结算功能使用PHP实现,可以获取选中商品的ID`以下是一个简单的HTML购物车示例,包含勾选、删除、添加和结算功能。结算功能使用PHP实现,可以获取选中商品的ID。

<!DOCTYPE html>
<html>
<head>
      <link rel="stylesheet" href="css/style.css" />
	<title>购物车</title>
	<style>
		table {
			border-collapse: collapse;
			width: 100%;
		}

		th, td {
			text-align: left;
			padding: 8px;
			border-bottom: 1px solid #ddd;
		}

		tr:hover {
			background-color: #f5f5f5;
		}

		.check {
			width: 20px;
		}

		.delete {
			color: red;
			cursor: pointer;
		}

		.total {
			font-weight: bold;
			text-align: right;
		}

		#checkout {
			margin-top: 20px;
			text-align: right;
		}
	</style>
</head>
<body>
	<h1>购物车</h1>
	<table>
		<thead>
			<tr>
				<th class="check"></th>
				<th>商品名称</th>
				<th>价格</th>
				<th>数量</th>
				<th>小计</th>
				<th class="delete"></th>
			</tr>
		</thead>
		<tbody>
			<tr class="item-row" data-id="1">
				<td class="check"><input type="checkbox" name="item[]" value="1"></td>
				<td>商品1</td>
				<td>10.00</td>
				<td><input type="number" name="quantity[]" value="1"></td>
				<td class="subtotal">10.00</td>
				<td class="delete">X</td>
			</tr>
			<tr class="item-row" data-id="2">
				<td class="check"><input type="checkbox" name="item[]" value="2"></td>
				<td>商品2</td>
				<td>20.00</td>
				<td><input type="number" name="quantity[]" value="1"></td>
				<td class="subtotal">20.00</td>
				<td class="delete">X</td>
			</tr>
			<tr class="item-row" data-id="3">
				<td class="check"><input type="checkbox" name="item[]" value="3"></td>
				<td>商品3</td>
				<td>30.00</td>
				<td><input type="number" name="quantity[]" value="1"></td>
				<td class="subtotal">30.00</td>
				<td class="delete">X</td>
			</tr>
		</tbody>
		<tfoot>
			<tr>
				<td colspan="4" class="total">总计:</td>
				<td class="total" id="total">0.00</td>
				<td></td>
			</tr>
		</tfoot>
	</table>
	<div id="checkout">
		<button onclick="checkout()">结算</button>
	</div>

	<script>
		// 计算小计和总计
		function updateSubtotal() {
			var rows = document.querySelectorAll('.item-row');
			var total = 0;
			for (var i = 0; i < rows.length; i++) {
				var row = rows[i];
				var price = parseFloat(row.querySelector('td:nth-child(3)').textContent);
				var quantity = parseInt(row.querySelector('input[name="quantity[]"]').value);
				var subtotal = price * quantity;
				row.querySelector('.subtotal').textContent = subtotal.toFixed(2);
				total += subtotal;
			}
			document.querySelector('#total').textContent = total.toFixed(2);
		}

		// 删除商品
		function deleteItem() {
			var row = this.parentNode;
			row.parentNode.removeChild(row);
			updateSubtotal();
		}

		// 添加商品
		function addItem() {
			var table = document.querySelector('table');
			var row = table.insertRow(-1);
			row.classList.add('item-row');
			row.dataset.id = Date.now(); // 生成一个随机ID
			row.innerHTML = `
				<td class="check"><input type="checkbox" name="item[]" value="${row.dataset.id}"></td>
				<td><input type="text" name="name[]"></td>
				<td><input type="number" name="price[]" step="0.01"></td>
				<td><input type="number" name="quantity[]" value="1"></td>
				<td class="subtotal">0.00</td>
				<td class="delete">X</td>
			`;
			row.querySelector('.delete').addEventListener('click', deleteItem);
			row.querySelector('input[name="quantity[]"]').addEventListener('input', updateSubtotal);
			row.querySelector('input[name="price[]"]').addEventListener('input', updateSubtotal);
		}

		// 结算选中的商品
		function checkout() {
			var items = document.querySelectorAll('input[name="item[]"]:checked');
			var ids = [];
			for (var i = 0; i < items.length; i++) {
				ids.push(items[i].value);
			}
			if (ids.length > 0) {
				window.location.href = 'checkout.php?ids=' + ids.join(',');
			} else {
				alert('请选择要结算的商品');
			}
		}

		// 绑定事件
		var deleteButtons = document.querySelectorAll('.delete');
		for (var i = 0; i < deleteButtons.length; i++) {
			deleteButtons[i].addEventListener('click', deleteItem);
		}
		var addBtn = document.querySelector('#add');
		addBtn.addEventListener('click', addItem);
		var quantityInputs = document.querySelectorAll('input[name="quantity[]"]');
		for (var i = 0; i < quantityInputs.length; i++) {
			quantityInputs[i].addEventListener('input', updateSubtotal);
		}
		var priceInputs = document.querySelectorAll('input[name="price[]"]');
		for (var i = 0; i < priceInputs.length; i++) {
			priceInputs[i].addEventListener('input', updateSubtotal);
		}
	</script>
</body>
</html>
`

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

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

相关文章

Linux下安装Redis

下载 方式一&#xff1a;官网下载稳定版本&#xff0c;然后FTP上传至服务器 https://download.redis.io/releases/ 方式二&#xff1a;服务器内使用wget下载&#xff08;想下其它版本可参考上图&#xff0c;更改命令后缀版本即可&#xff09; wget http://download.redis.i…

2.基础篇

目录 一、描述软件测试的生命周期&#xff08;软件测试的流程&#xff09; 二、如何描述一个bug 三、bug的级别&#xff08;粗略划分&#xff09; 四、bug的生命周期 五、因为一个bug和开发人员产生争执怎么办 六、如何设置弱网&#xff1f; 一、描述软件测试的生命周期&a…

Flex弹性布局

文章目录 1. 开启Flex布局2. 应用于flex container的css属性flex-directionjustify-contentalign-itemsflex-wrapflex-flowalign-content 3. 应用于flex items的css属性orderflex-growflex-shrinkflex-basis&#xff08;了解&#xff09;align-selfflex 1. 开启Flex布局 flex c…

校招推荐学习java开发还是大数据开发

这两个方向其实都是不错的方向&#xff0c;java虽然卷&#xff0c;但是技能在手也不怕。大数据的发展前景也是不容小觑的。关键就在于你未来想发展的方向以及个人的兴趣 首先可以肯定的是&#xff0c;市场上终归是需要Java人才的&#xff0c;但是总会有人来问&#xff0c;Java…

对偶问题和KKT条件

KKT条件 对于不等式约束优化问题 min ⁡ f ( x ) s . t . g ( x ) ≤ 0 \min\quad f(x)\\ {\rm s.t.}\quad g(x)\leq 0 minf(x)s.t.g(x)≤0 拉格朗日函数为 L ( x , λ ) f ( x ) λ g ( x ) L(x,\lambda)f(x)\lambda g(x) L(x,λ)f(x)λg(x) 。 KKT条件包括 拉格朗日函…

分享5款轻量级的Win10神器,错过你会后悔的

今天我要为大家推荐五款小众而且小体积的WIN10小工具&#xff0c;它们可以让你的电脑使用更加方便和高效&#xff0c;而且不占用太多的空间和资源&#xff0c;非常适合轻量级的办公和娱乐。 1.窗口管理工具——TileIconifier TileIconifier可以将窗口最小化到托盘区域,从而更…

在Android应用中集成使用traceroute工具

背景知识 traceroute是一个常用于Linux系统的网络工具&#xff0c;它可显示数据包在IP网络中所经过路由的IP地址&#xff0c;理想状态下可探测本机和目标地址之间的所有路由节点。 其他操作系统中也有类似的替代品&#xff0c;实现都大同小异。一般用法如下&#xff1a; 终端…

【TCP为什么需要粘包和拆包】

如今&#xff0c;大半个互联网都建立在 TCP 协议之上&#xff0c;我们使用的 HTTP 协议、消息队列、存储、缓存&#xff0c;都需要用到 TCP 协议——这是因为 TCP 协议提供了可靠性。简单来说&#xff0c;可靠性就是让数据无损送达。但若是考虑到成本&#xff0c;就会变得非常复…

一文带你理解SpringBean

Bean定义 ​ Bean作为Spring框架面试中不可或缺的概念&#xff0c;其本质上是指代任何被Spring加载生成出来的对象。&#xff08;本质上区别于Java Bean&#xff0c;Java Bean是对于Java类的一种规范定义。&#xff09;Spring Bean代表着Spring中最小的执行单位&#xff0c;其…

如何用ApiFox自动生成接口文档?没有比这更详细的教程了

目录 前言 第一步&#xff1a;安装 Apifox IDEA 插件&#xff08;Apifox Helper&#xff09; 第二步&#xff1a;配置 Apifox 访问令牌 和项目 ID 第三步&#xff1a;自动生成文档&#xff01; 第四步&#xff1a;去 Apifox 项目中查看自动生成的文档 Apifox 更多好用的功能…

Addictive Multiplicative in NN

特征交叉是特征工程中的重要环节&#xff0c;在以表格型&#xff08;或结构化&#xff09;数据为输入的建模中起到了很关键的作用。 特征交互的作用&#xff0c;一是尽可能挖掘对目标有效的模式、特征&#xff0c;二是具有较好的可解释性&#xff0c;三是能够将对数据的洞见引…

一文教会你如何重装Windows10系统【过程+图解+说明】

前言 申请了一台台式机电脑&#xff0c;操作系统是windows11的&#xff0c;要windows10的系统。电脑不能连网&#xff0c;身为程序员&#xff0c;我竟然想着别人远程帮我安装&#xff0c;可恶呐。之前也没重装过系统。第一次重装遇到了一些坑。我甚至在拼夕夕上花了几块钱买个镜…

python-使用Qchart总结5-使用信号槽绘制动态曲线图

python-使用Qchart总结3-绘制曲线图在这篇文章基础上&#xff0c;来改造一下&#xff0c;绘制一下动态曲线图吧 一、明确需求 ①点击按钮&#xff0c;开始动态加载曲线&#xff0c;细节:一个一个点加载出来 二、实现 ①在UI上添加按钮&#xff0c;打开原先的untitled.ui文件…

【Linux】浅谈eloop机制

目录 1.eloop 机制 2.eloop结构体 2.1.eloop_data结构体 2.2 Socket事件结构体 2.3 Timeout事件结构体 2.4 Signal事件结构体 3.eloop_init 4.eloop_run 4.1 signal事件 4.2 socket事件 4.3 timeout事件 1.eloop 机制 主线程中启动事件监听机制&#xff0c;对不同的…

【Python入门】字符串的扩展

前言 &#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff0c;喜爱音乐的一位博主。 &#x1f4d7;本文收录于Python零基础入门系列&#xff0c;本专栏主要内容为Python基础语法、判断、循环语句、函…

Nginx介绍及安装

简介 Nginx 是一个高性能的 HTTP 和反向代理服务器。它最初由 Nigel Cook 开发&#xff0c;旨在解决 Apache 服务器在高并发环境下性能瓶颈的问题。Nginx 具有占用资源少、处理能力强等优点&#xff0c;在互联网应用中广泛应用于静态资源服务、反向代理、负载均衡、HTTP缓存、…

2023年web前端开发之JavaScript进阶(一)

接上篇博客进行学习,通俗易懂,详细 博客地址: 2023年web前端开发之JavaScript基础(五)基础完结_努力的小周同学的博客-CSDN博客 学习内容 学习 作用域、变量提升、 闭包等语言特征&#xff0c;加深对 JavaScript 的理解&#xff0c;掌握变量赋值、函数声明的简洁语法&#xff0…

rs485转tcp网关盒子怎么用(rs485协议转以太网tcp/ip)

随着工业自动化技术的不断发展&#xff0c;越来越多的工业设备在使用时需要进行数据通信。其中&#xff0c;RS485通信协议是一种常见的工业通信协议&#xff0c;而TCP/IP协议则是互联网通信的标准协议。为了实现RS485协议与TCP/IP协议之间的通信&#xff0c;可以使用RS485转TCP…

【Java】面试常问知识点(Java基础—2)

Java基础 多线程的状态 新建状态 当用new操作符创建一个线程时&#xff0c; 例如new Thread(r)&#xff0c;线程还没有开始运行&#xff0c;此时线程处在新建状态。 当一个线程处于新生状态时&#xff0c;程序还没有开始运行线程中的代码 就绪状态 一个新创建的线程并不自动…

ChatGLM-6B微调与部署

文章目录 基于ChatGLM-6B的推理与部署配置环境与准备配置环境模型文件准备 代码运行 Demo命令行 Demo基于 Gradio 的网页版 Demo基于 Streamlit 的网页版 Demo 基于peft框架的LoRA微调ChatGLM-6B配置环境与准备配置环境模型文件准备数据准备数据处理 微调过程 基于P-Tuning v2微…