博客列表 >购物车JS代码

购物车JS代码

秋闲独醉
秋闲独醉原创
2022年08月01日 16:50:15370浏览

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <title>实战3-购物车</title>
  8. <link rel="stylesheet" href="style.css" />
  9. </head>
  10. <body>
  11. <div class="box">
  12. <!-- 1. 全选按钮 -->
  13. <div class="selectAll">
  14. <!-- change: 当它的值发生改变时触发 -->
  15. <!-- checked: 当前是选中状态, 布尔属性 -->
  16. <input type="checkbox" class="check-all" name="check-all" onchange="checkAll()" checked />
  17. <label for="check-all">全选</label>
  18. </div>
  19. <!-- 2. 商品列表 -->
  20. <ul class="list">
  21. <li><span>选择</span><span>品名</span><span>数量</span><span>单价</span><span>金额</span></li>
  22. <li>
  23. <input type="checkbox" onchange="checkItems()" checked />
  24. <span class="content">手机</span>
  25. <input type="number" value="1" min="1" class="num" />
  26. <span class="price">100</span>
  27. <span class="amount">0</span>
  28. </li>
  29. <li>
  30. <input type="checkbox" onchange="checkItems()" checked />
  31. <span class="content">电脑</span>
  32. <input type="number" value="2" min="1" class="num" />
  33. <span class="price">200</span><span class="amount">0</span>
  34. </li>
  35. <li>
  36. <input type="checkbox" onchange="checkItems()" checked />
  37. <span class="content">相机</span>
  38. <input type="number" value="3" min="1" class="num" />
  39. <span class="price">300</span>
  40. <span class="amount">0</span>
  41. </li>
  42. <li>
  43. <span>总计:</span>
  44. <span class="total-num">0</span>
  45. <span class="total-amount">0</span>
  46. </li>
  47. </ul>
  48. <!-- 3. 结算按钮 -->
  49. <button class="account">结算</button>
  50. </div>
  51. <script>
  52. // 1. 选做: 购物车选择或不选商品时,并自动过滤未选商品,自动计算
  53. // (一) 全选的自动设置
  54. // 1. 全选
  55. function checkAll() {
  56. // 第1步: 获取当前按钮的状态
  57. let status = event.target.checked;
  58. // 第2步: 根据当前状态,来动态的设置其它所有商品的选中状态
  59. const items = document.querySelectorAll('.list li input[type="checkbox"]');
  60. // console.log(items);
  61. items.forEach((item) => (item.checked = status));
  62. // document
  63. // .querySelectorAll('.list li input[type="checkbox"]')
  64. // .forEach(item => (item.checked = event.target.checked));
  65. //勾选重新算
  66. chageCalculate();
  67. }
  68. // 2. 根据用户的选择来动态的设置"全选"按钮的状态
  69. // 第1步: 获取全部的商品
  70. const items = document.querySelectorAll('.list li input[type="checkbox"]');
  71. function checkItems() {
  72. // 第2步: 判断当前状态, 只有全部选中, 才返回 true,否则就返回false
  73. // console.log([...items]);
  74. // console.log(Array.from(items));
  75. let status = [...items].every((item) => item.checked === true);
  76. // console.log(status);
  77. // 第3步: 用这个状态来更新全选按钮
  78. document.querySelector(".check-all").checked = status;
  79. }
  80. // (二) 商品的自动计算
  81. // 获取所有商品数量的元素
  82. const nums = document.querySelectorAll(".list .num");
  83. // 1. 计算商品总数
  84. function getTotalNum(numArr) {
  85. return numArr.reduce((acc, cur) => acc + cur);
  86. }
  87. // let numArr = [...nums].map(item => parseInt(item.value));
  88. // console.log(getTotalNum(numArr));
  89. // 2. 计算每个商品的金额: 数量 * 单价
  90. // numArr: 数量数组, priceArr: 单价数组
  91. function getAmount(numArr, priceArr) {
  92. // 用map(), 不用forEach? 因为map有返回值
  93. return numArr.map((num, index) => {
  94. // console.log(num, index);
  95. // 以index为索引条件在priceArr中进行查询获取与数量对应的单价
  96. return num * priceArr[index];
  97. });
  98. }
  99. // console.log(getAmount([1, 2, 3], [100, 200, 300]));
  100. // 3. 计算总金额
  101. function getTotalAmount(amountArr) {
  102. return amountArr.reduce((acc, cur) => acc + cur);
  103. }
  104. // console.log(getTotalAmount(getAmount([1, 2, 3], [100, 200, 300])));
  105. // 自动计算的通用方法
  106. function autoCalculate() {
  107. // 单价数组
  108. const prices = document.querySelectorAll(".list .price");
  109. let priceArr = [...prices].map((item) => parseInt(item.textContent));
  110. // 数量数组
  111. let numArr = [...nums].map((item) => parseInt(item.value));
  112. // 金额数组: 数量数组 * 单价数组
  113. const amountArr = getAmount(numArr, priceArr);
  114. // console.log(amountArr);
  115. // 将以上数量添加到页面
  116. // 1. 将总数量添加到页面
  117. document.querySelector(".total-num").textContent = getTotalNum(numArr);
  118. // 2. 将每个商品的金额填充
  119. document.querySelectorAll(".amount").forEach((item, index) => (item.textContent = amountArr[index]));
  120. // 3. 填充总金额
  121. document.querySelector(".total-amount").textContent = getTotalAmount(amountArr);
  122. }
  123. //勾选改变
  124. function chageCalculate() {
  125. //如果都为空,则清空数据
  126. let res = [...items].some((item, index) => item.checked);
  127. if (!res) {
  128. // 1. 将总数量添加到页面
  129. document.querySelector(".total-num").textContent = 0;
  130. // 2. 将每个商品的金额填充
  131. // document.querySelectorAll(".amount").forEach((item, index) => (item.textContent = 0));
  132. // 3. 填充总金额
  133. document.querySelector(".total-amount").textContent = 0;
  134. return false;
  135. }
  136. console.log(res);
  137. // 单价数组
  138. const prices = document.querySelectorAll(".list .price");
  139. let priceArr = [...prices].map((item) => parseInt(item.textContent));
  140. // 数量数组
  141. let numArr = [...nums].map((item) => parseInt(item.value));
  142. //勾选的数量
  143. numArr = numArr.filter(function (item, index) {
  144. return items[index].checked;
  145. });
  146. //勾选的商品金额
  147. priceArr = priceArr.filter((item, index) => [...items][index].checked);
  148. console.log(numArr, priceArr);
  149. // 金额数组: 数量数组 * 单价数组
  150. const amountArr = getAmount(numArr, priceArr);
  151. // console.log(amountArr);
  152. // 将以上数量添加到页面
  153. // 1. 将总数量添加到页面
  154. document.querySelector(".total-num").textContent = getTotalNum(numArr);
  155. // 2. 将每个商品的金额填充
  156. let amount = document.querySelectorAll(".amount");
  157. console.log(amount);
  158. amount = [...amount].map((item) => parseInt(item.textContent));
  159. console.log(amount);
  160. amount = amount.filter((item, index) => [...items][index].checked);
  161. console.log(amount);
  162. amount.forEach((item, index) => (item.textContent = amountArr[index]));
  163. // 3. 填充总金额
  164. document.querySelector(".total-amount").textContent = getTotalAmount(amountArr);
  165. }
  166. // 当页面加载时,根据默认值进行自动计算
  167. // window.addEventListener('load', autoCalculate, false);
  168. window.onload = autoCalculate;
  169. // 当用户更新商品数量时, 将会触发商品金额,总数量,和总金额的动态更新
  170. console.log(nums);
  171. nums.forEach((item) => (item.onchange = autoCalculate));
  172. items.forEach((item) => (item.onchange = chageCalculate));
  173. </script>
  174. <script>
  175. // 2. 实例演示JSON常用的二个API, 并详细描述前后端交互的原理与JSON的优势s
  176. // JSON.stringify() 对js对象进行json数据格式化
  177. let obj = {
  178. 1: "2",
  179. 8: "dd",
  180. d: "mo",
  181. 88: [2, 3, 46, 71, 9],
  182. };
  183. console.log(JSON.stringify(obj));
  184. //JSON.parse(),对json数据转为js对象
  185. let res = JSON.parse(JSON.stringify(obj));
  186. console.log(res);
  187. //前后端都是按照json格式编码和解码,只是不同的端的api接口不一样,但是json字符串格式是一样的,有利于json字符串的在不同平台被识别和解码。
  188. </script>
  189. </body>
  190. </html>
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议