博客列表 >JavaScript学习之购物车全选、自动计算

JavaScript学习之购物车全选、自动计算

景云
景云原创
2021年03月22日 16:19:40812浏览

功能示例图

1.商品的全选与取消全选

1.1 点击全选时,每个商品选择框全部激活;反之全部取消。
1.2 点击单个商品选择框时,会判断所所有商品选择框是否全部激活,全部激活则全选框激活,只要有一个选择框未激活,则全选框不激活。

2. 商品金额的计算

2.1 每个商品根据数量和单价计算单个商品总额,渲染到页面中

3.根据商品选择框是否激活,计算已激活的所以商品的数量和金额,渲染到页面中

  1. <!DOCTYPE html>
  2. <html lang="en">
  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. <link rel="stylesheet" href="./style.css">
  9. <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.js"></script>
  10. </head>
  11. <body>
  12. <table>
  13. <caption>
  14. 购物车
  15. </caption>
  16. <thead>
  17. <tr>
  18. <!-- 全选复选框 -->
  19. <th><input type="checkbox" name="checkAll" id="check-all" /><label for="check-all">全选</label></th>
  20. <th>图片</th>
  21. <th>品名</th>
  22. <th>单位</th>
  23. <th>单价/元</th>
  24. <th>数量</th>
  25. <th>金额/元</th>
  26. </tr>
  27. </thead>
  28. <tbody>
  29. <tr>
  30. <td>
  31. <input type="checkbox" name="item" value="SN-1020" checked />
  32. </td>
  33. <td>
  34. <a href=""><img src="images/1.gif" alt="" /></a>
  35. </td>
  36. <td>iPhone 11</td>
  37. <td></td>
  38. <td class="price">1</td>
  39. <td><input type="number" min="1" value="1" /></td>
  40. <td class="amount">xxx</td>
  41. </tr>
  42. <tr>
  43. <td>
  44. <input type="checkbox" name="item" value="SN-1020" checked />
  45. </td>
  46. <td>
  47. <a href=""><img src="images/1.gif" alt="" /></a>
  48. </td>
  49. <td>小米pro 11</td>
  50. <td></td>
  51. <td class="price">2</td>
  52. <td><input type="number" min="1" value="2" /></td>
  53. <td class="amount">xxx</td>
  54. </tr>
  55. <tr>
  56. <td>
  57. <input type="checkbox" name="item" value="SN-1030" />
  58. </td>
  59. <td>
  60. <a href=""><img src="images/1.gif" alt="" /></a>
  61. </td>
  62. <td>MacBook Pro</td>
  63. <td></td>
  64. <td class="price">3</td>
  65. <td><input type="number" min="1" value="1" /></td>
  66. <td class="amount">xxx</td>
  67. </tr>
  68. <tr>
  69. <td>
  70. <input type="checkbox" name="item" value="SN-1040" checked />
  71. </td>
  72. <td>
  73. <a href=""><img src="images/1.gif" alt="" /></a>
  74. </td>
  75. <td>小米75电视</td>
  76. <td></td>
  77. <td class="price">4</td>
  78. <td><input type="number" min="1" value="2" /></td>
  79. <td class="amount">xxx</td>
  80. </tr>
  81. <tr>
  82. <td>
  83. <input type="checkbox" name="item" value="SN-1050" checked />
  84. </td>
  85. <td>
  86. <a href=""><img src="images/1.gif" alt="" /></a>
  87. </td>
  88. <td>Canon 90D单反</td>
  89. <td></td>
  90. <td class="price">5</td>
  91. <td><input type="number" min="1" value="1" /></td>
  92. <td class="amount">xxx</td>
  93. </tr>
  94. </tbody>
  95. <tfoot>
  96. <tr style="font-weight: bolder; font-size: 1.2em">
  97. <td colspan="5">总计:</td>
  98. <td id="sum">xxx</td>
  99. <td id="total-amount">xxx</td>
  100. </tr>
  101. </tfoot>
  102. </table>
  103. <div style="width: 90%; margin: 10px auto">
  104. <button style="float: right; width: 100px">结算</button>
  105. </div>
  106. <script>
  107. //1.获取全选和所有独立商品复选框
  108. const checkAll = document.querySelector("#check-all");
  109. const checkItems = document.getElementsByName("item");
  110. // 为全选框添加事件:change(当值发生变化时会触发)
  111. checkAll.onchange = function (ev) {
  112. checkItems.forEach(function (item) {
  113. item.checked = ev.target.checked;
  114. })
  115. //全选框取消或激活时需要触发自动计算
  116. autoCalculate();
  117. }
  118. // 为每个单独的商品选择框添加change事件(每个商品都选择时,全选框被激活,否则取消)
  119. checkItems.forEach(function (item) {
  120. item.onchange = function () {
  121. // Array.every(callback):对数组中每个成员进行回调处理,只有全部为true,最终才返回true,只要有一个返回false最终也会返回false,类似“逻辑与 and”;some()相反。
  122. checkAll.checked = [...checkItems].every(item => item.checked);
  123. //每次选中或取消单个商品选择框时需要触发自动计算
  124. autoCalculate();
  125. }
  126. })
  127. // 获取所以的数量控件
  128. const numInput = document.querySelectorAll("tbody input[type=number]");
  129. // 用户更新数量时自动触发自动计算
  130. numInput.forEach(function (input) {
  131. input.onchange = autoCalculate;
  132. })
  133. // 购物车刚加载完也要触发自动计算
  134. window.onload = autoCalculate;
  135. // 封装一个计算金额的函数
  136. function autoCalculate() {
  137. // 获取单价组成的数组
  138. const prices = document.querySelectorAll("tbody .price");
  139. const priceArr = [...prices].map(function (item) {
  140. return item.textContent * 1;//结果为字符串,乘以1后会执行自动转换,转换成数字
  141. })
  142. // 获取数量组成的数组
  143. const numbers = document.querySelectorAll("tbody input[type=number]");
  144. const numberArr = [...numbers].map(function (item) {
  145. return item.value * 1;//结果为字符串,乘以1后会执行自动转换,转换成数字
  146. })
  147. //计算每件商品金额,单价*数量
  148. // 将金额数组和数量数组作为一个新的数组,reduce()将会对其内的两个数组都进行处理; total为最终返回值,curr为当前被操作的数组
  149. const amountArr = [priceArr, numberArr].reduce(function (total, curr) {
  150. return total.map(function (item, index) {
  151. return item * curr[index];
  152. })
  153. })
  154. //获取选中的商品数量的数组
  155. let checkNumberArr = [];
  156. [...numbers].map(function (item, index) {
  157. // 如果当前商品选中,将商品数量取出
  158. if (checkItems[index].checked) {
  159. checkNumberArr[index] = item.value * 1;
  160. }
  161. })
  162. //获取选中的商品价格的数组
  163. let checkPriceArr = [];
  164. [...prices].map(function (item, index) {
  165. // 如果当前商品选中,将商品数量取出
  166. if (checkItems[index].checked) {
  167. checkPriceArr[index] = item.textContent * 1;
  168. }
  169. })
  170. //计算每件选中商品的金额
  171. const amountCheckedArr = [checkPriceArr, checkNumberArr].reduce(function (total, curr) {
  172. return total.map(function (item, index) {
  173. return item * curr[index];
  174. })
  175. })
  176. //选中商品总数
  177. let sum = 0;
  178. if (checkNumberArr.length > 0) {
  179. sum = checkNumberArr.reduce(function (pre, cur) {
  180. return pre + cur;
  181. })
  182. }
  183. // 计算选中商品总金额
  184. let totalAmount = 0;
  185. if (amountCheckedArr.length > 0) {
  186. totalAmount = amountCheckedArr.reduce(function (pre, cur) {
  187. return pre + cur;
  188. });
  189. }
  190. // 将计算的结果渲染到购物车中
  191. document.querySelector("#sum").textContent = sum;
  192. // 总金额也渲染
  193. if (totalAmount) {
  194. document.querySelector("#total-amount").textContent = totalAmount;
  195. } else {
  196. document.querySelector("#total-amount").textContent = '0';
  197. }
  198. // 每个商品的金额也渲染
  199. document.querySelectorAll(".amount").forEach(function (item, index) {
  200. item.textContent = amountArr[index];
  201. });
  202. }
  203. </script>
  204. </body>
  205. </html>

CSS

  1. table {
  2. border-collapse: collapse;
  3. width: 90%;
  4. text-align: center;
  5. margin: auto;
  6. }
  7. table caption {
  8. margin-bottom: 15px;
  9. font-size: 1.5rem;
  10. }
  11. table th,
  12. table td {
  13. border-bottom: 1px solid #ccc;
  14. padding: 5px;
  15. font-weight: normal;
  16. }
  17. table thead tr:first-of-type {
  18. background-color: #e6e6e6;
  19. height: 3em;
  20. }
  21. table input[type="checkbox"] {
  22. width: 1.5em;
  23. height: 1.5em;
  24. }
  25. table tbody tr {
  26. border-bottom: 1px solid #ccc;
  27. }
  28. table tbody tr:hover {
  29. background-color: #f6f6f6;
  30. cursor: pointer;
  31. }
  32. tbody img {
  33. width: 3em;
  34. }
  35. tbody input[type="number"] {
  36. width: 3em;
  37. }
  38. button {
  39. width: 150px;
  40. height: 30px;
  41. outline: none;
  42. border: none;
  43. background-color: teal;
  44. color: white;
  45. letter-spacing: 5px;
  46. }
  47. button:hover {
  48. opacity: 0.7;
  49. cursor: pointer;
  50. }
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议