博客列表 >购物车全选/全不选功能和库存管理功能实例演示

购物车全选/全不选功能和库存管理功能实例演示

手机用户1594223549
手机用户1594223549原创
2022年11月15日 18:48:23485浏览

1.输出结果

2.代码部分

  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>购物车全选</title>
  8. <style>
  9. .cart {
  10. width: 460px;
  11. display: grid;
  12. gap: 10px;
  13. }
  14. table {
  15. border-collapse: collapse;
  16. text-align: center;
  17. }
  18. table caption {
  19. font-size: 20px;
  20. margin-bottom: 10px;
  21. }
  22. table input[type='number'] {
  23. width: 40px;
  24. }
  25. table th,
  26. table td {
  27. border-bottom: thin solid #888;
  28. padding: 5px;
  29. }
  30. table thead {
  31. border-top: thin solid #888;
  32. background-color: lightcoral;
  33. }
  34. table tfoot {
  35. background-color: lightcoral;
  36. }
  37. table tbody tr:nth-child(odd):hover {
  38. background-color: #eee;
  39. cursor: pointer;
  40. }
  41. table tr td:first-child {
  42. padding-left: 20px;
  43. }
  44. table tr td:last-child {
  45. padding-right: 20px;
  46. }
  47. .cart .pay {
  48. display: grid;
  49. grid: 1fr / auto-flow;
  50. place-content: end;
  51. gap: 10px;
  52. }
  53. </style>
  54. </head>
  55. <body>
  56. <div class="cart">
  57. <table>
  58. <caption>
  59. 我的购物车
  60. </caption>
  61. <thead>
  62. <tr>
  63. <!-- 全选按钮 -->
  64. <td><input type="checkbox" name="" class="check-all" checked /></td>
  65. <td>编号</td>
  66. <td>品名</td>
  67. <td>单位</td>
  68. <td>单价</td>
  69. <td>数量</td>
  70. <td>金额(元)</td>
  71. </tr>
  72. </thead>
  73. </table>
  74. </div>
  75. <script type="module">
  76. // (一) 商品信息
  77. const items = [
  78. { id: 286, name: '酸奶', units: '箱', price: 50, num: 1 },
  79. { id: 870, name: '苹果', units: '千克', price: 10, num: 1 },
  80. { id: 633, name: '外套', units: '件', price: 300, num: 1 },
  81. { id: 153, name: '皮鞋', units: '双', price: 400, num: 1 },
  82. { id: 109, name: '手机', units: '台', price: 5000, num: 1 },
  83. ];
  84. // (二) 导入购物车模块
  85. import Cart from './modules/cart.js';
  86. // (三) 实例化购物车类
  87. const cart = new Cart(items);
  88. // console.log(cart.total);
  89. // console.log(cart.money);
  90. // console.log(cart.totalMoney);
  91. // (四) 获取购物车(表格)
  92. const table = document.querySelector('table');
  93. // (五) 将商品渲染到购物车元素中 tbody
  94. // 1.创建 tbody: 商品容器
  95. const tbdoy = table.createTBody();
  96. // 2. 创建tbody的内容,商品列表
  97. // 把item里面的所有的商品遍历一遍,除了item还需要用其他值,根据键获取
  98. items.forEach(function (item, key) {
  99. // 1. 创建商品模板字符串
  100. // 插入tobdy的每个商品
  101. const tr = `
  102. <tr>
  103. <td><input type="checkbox" name="" class="check" checked /></td>
  104. <td>${item.id}</td>
  105. <td>${item.name}</td>
  106. <td>${item.units}</td>
  107. <td>${item.price}</td>
  108. <td>
  109. <input type="number" name="" value="${item.num}"
  110. </td>
  111. <td class="money">${cart.money[key]}</td>
  112. </tr>
  113. `;
  114. // 2. 将内容填充到tbody
  115. tbdoy.insertAdjacentHTML('beforeend', tr);
  116. });
  117. // (六) 将相关统计数据(总数量,总金额),填充到tfoot中
  118. const tfoot = table.createTFoot();
  119. // 创建tfoot内容
  120. let tr = `
  121. <tr>
  122. <td colspan="5">总计:</td>
  123. <td class="total">${cart.total}</td>
  124. <td class="total-money">${cart.totalMoney}</td>
  125. </tr>
  126. `;
  127. tfoot.insertAdjacentHTML('beforeend', tr);
  128. // (七) 更新数量,实时计算出结果并显示出来
  129. // 1. 拿到所有的数量控件
  130. // input[type=number] 数量控件通过标签加属性选择器来拿,然后放到一个变量里面保存’
  131. const nums = table.querySelectorAll('input[type=number]');
  132. // 2. 为每一个数量控件添加事件监听: input
  133. nums.forEach(function (num, key) {
  134. num.oninput = function () {
  135. // 1. 计算总数量
  136. // 是个字符串,需要转成数值类型,要不然没法相加
  137. // 对应的商品找到,对数量更新
  138. items[key].num = num.value * 1;
  139. cart.total = cart.getTotal(items);
  140. // 2. 计算每个商品金额
  141. cart.money[key] = num.value * 1 * items[key].price;
  142. // 3. 计算每个商品金额
  143. cart.totalMoney = cart.money.reduce(function (acc, cur) {
  144. return acc + cur;
  145. });
  146. // 4.将数据渲染到指定元素上
  147. table.querySelector('.total').textContent = cart.total;
  148. // 加key知道的更新的哪一个 ,数组多个值
  149. table.querySelectorAll('.money')[key].textContent = cart.money[key];
  150. table.querySelector('.total-money').textContent = cart.totalMoney;
  151. };
  152. });
  153. </script>
  154. </body>
  155. </html>
  1. // 默认导出购物车模块
  2. export default class {
  3. // 构造器
  4. constructor(items) {
  5. // 1. 商品总数量
  6. // 用属性的方法写
  7. this.total = this.getTotal(items);
  8. // 2. 每个商品金额(数组)
  9. this.money = this.getMoney(items);
  10. // 3. 商品总金额
  11. this.totalMoney = this.getTotalMoney();
  12. }
  13. // (一) 计算商品总数量
  14. getTotal(items) {
  15. // 1. 数量数组: 每个商品的数量num字段组成的数组
  16. // map有返回值,forezch没返回值
  17. let numArr = items.map(function(item) {
  18. return item.num;
  19. });
  20. // 2. 计算总数量
  21. // arr累加器,cur当前值 然后returm出去之后前台就有值了
  22. // 遍历数组
  23. return numArr.reduce(function (acc, cur) {
  24. return acc + cur;
  25. });
  26. }
  27. // (二) 计算每个商品的金额
  28. getMoney(items) {
  29. // 金额 = 数量 * 单价
  30. return items.map(function (item){
  31. return item.num * item.price;
  32. });
  33. }
  34. // (三) 计算商品总金额
  35. getTotalMoney() {
  36. return this.money.reduce(function (acc, cur) {
  37. return acc + cur;
  38. });
  39. }
  40. }
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议