PHP8.1.21版本已发布
vue8.1.21版本已发布
jquery8.1.21版本已发布

博客列表 > jQuery|原生js-分别购物车全选|全不选-勾选|不勾选自动计算

jQuery|原生js-分别购物车全选|全不选-勾选|不勾选自动计算

葡萄枝子
葡萄枝子 原创
2021年01月15日 13:07:58 1372浏览

jQuery|原生js-分别购物车全选|全不选-勾选|不勾选自动计算

  1. 使用jQuery完成购物车全选/全不选操作;
  2. 这现勾选/不勾选商品时购物车也能自动完成计算
  • head 中引入购物车样式和jQuery库
  1. <!-- 购物车css样式 -->
  2. <link rel="stylesheet" href="style.css" />
  3. <!-- 引入 jQuery 库 -->
  4. <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
  • 引入的购物车样式 style.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. }
  • body 中添加购物车html是默认的
  1. <table>
  2. <caption>
  3. 购物车
  4. </caption>
  5. <thead>
  6. <tr>
  7. <!-- 全选复选框 -->
  8. <th><input type="checkbox" name="checkAll" id="check-all" checked /><label for="check-all">全选</label>
  9. </th>
  10. <th>图片</th>
  11. <th>品名</th>
  12. <th>单位</th>
  13. <th>单价/元</th>
  14. <th>数量</th>
  15. <th>金额/元</th>
  16. </tr>
  17. </thead>
  18. <tbody>
  19. <tr>
  20. <td>
  21. <input type="checkbox" name="item" value="SN-1020" checked />
  22. </td>
  23. <td>
  24. <a href=""><img src="images/p1.jpg" alt="" /></a>
  25. </td>
  26. <td>iPhone 11</td>
  27. <td></td>
  28. <td class="price">4799</td>
  29. <td><input type="number" min="1" value="1" /></td>
  30. <td class="amount">xxxx</td>
  31. </tr>
  32. <tr>
  33. <td>
  34. <input type="checkbox" name="item" value="SN-1020" checked />
  35. </td>
  36. <td>
  37. <a href=""><img src="images/p2.jpg" alt="" /></a>
  38. </td>
  39. <td>小米pro 11</td>
  40. <td></td>
  41. <td class="price">3999</td>
  42. <td><input type="number" min="1" value="2" /></td>
  43. <td class="amount">xxxx</td>
  44. </tr>
  45. <tr>
  46. <td>
  47. <input type="checkbox" name="item" value="SN-1030" checked />
  48. </td>
  49. <td>
  50. <a href=""><img src="images/p3.jpg" alt="" /></a>
  51. </td>
  52. <td>MacBook Pro</td>
  53. <td></td>
  54. <td class="price">18999</td>
  55. <td><input type="number" min="1" value="1" /></td>
  56. <td class="amount">xxxx</td>
  57. </tr>
  58. <tr>
  59. <td>
  60. <input type="checkbox" name="item" value="SN-1040" checked />
  61. </td>
  62. <td>
  63. <a href=""><img src="images/p4.jpg" alt="" /></a>
  64. </td>
  65. <td>小米75电视</td>
  66. <td></td>
  67. <td class="price">5999</td>
  68. <td><input type="number" min="1" value="2" /></td>
  69. <td class="amount">xxxx</td>
  70. </tr>
  71. <tr>
  72. <td>
  73. <input type="checkbox" name="item" value="SN-1050" checked />
  74. </td>
  75. <td>
  76. <a href=""><img src="images/p5.jpg" alt="" /></a>
  77. </td>
  78. <td>Canon 90D单反</td>
  79. <td></td>
  80. <td class="price">9699</td>
  81. <td><input type="number" min="1" value="1" /></td>
  82. <td class="amount">xxxx</td>
  83. </tr>
  84. </tbody>
  85. <tfoot>
  86. <tr style="font-weight: bolder; font-size: 1.2em">
  87. <td colspan="5">总计:</td>
  88. <td id="sum">xxxx</td>
  89. <td id="total-amount">xxxx</td>
  90. </tr>
  91. </tfoot>
  92. </table>
  93. <div style="width: 90%; margin: 10px auto">
  94. <button style="float: right; width: 100px">结算</button>
  95. </div>

1. 使用jQuery完成购物车全选/全不选操作

  • bodyscript 标签中添加js
  1. // 使用jQuery完成购物车全选/全不选操作
  2. // 全选复选框
  3. const checkAll = $("#check-all");
  4. // 独立复选框
  5. const checkItems = $("input[name=\"item\"]");
  6. // 改变全选,独立复选框也改变
  7. checkAll.change(ev => checkItems.each(function () {
  8. $(this).prop('checked', $(ev.target).is(':checked'));
  9. }));
  10. // 改变独立复选框,改变全选
  11. checkItems.change(() => checkAll.prop('checked', [...checkItems].every(item => item.checked)));

jQuery全选全不选

2. 这现勾选/不勾选商品时购物车也能自动完成计算

  • 续写 jQuery 版购物车完成自动计算
  1. // 购物车,数据填充
  2. function cart() {
  3. // 独立单价组
  4. let pricesObj = $('.price').map((i, ele) => $(ele).text() * 1);
  5. // 独立数量组
  6. let numbersObj = $('input[type="number"]').map((i, ele) => $(ele).val() * 1);
  7. // 独立金额组
  8. let amountsObj = [pricesObj, numbersObj].reduce((total, curr) => total.map((i, item) => item * curr[i]));
  9. // 独立金额数据填充,由单品数量改变触发,与独立复选框状态无关
  10. $('.amount').each((i, ele) => ($(ele).text(amountsObj[i])));
  11. // 总数量,总金额的计算由独立复选框选中状态确定
  12. // 获取所有独立复选框元素
  13. let items = $("input[name=\"item\"]");
  14. // 过滤出所有独立复选框选中状态的组
  15. numbersObj = numbersObj.filter((i, ele) => $(items[i]).is(':checked'));
  16. // 过滤出所有独立复选框选中状态的金额组
  17. amountsObj = amountsObj.filter((i, ele) => $(items[i]).is(':checked'));
  18. // 计算总数量和总金额
  19. let sum = [...numbersObj].reduce((p, n) => p + n, 0);
  20. let total = [...amountsObj].reduce((p, n) => p + n, 0);
  21. // 填充总数量和总金额到页面中
  22. $('#sum').text(sum);
  23. $('#total-amount').text(total);
  24. }
  25. // 改变单品数量时触发
  26. $('input[type="number"]').each((i, ele) => $(ele).change(function(){
  27. cart();
  28. }));
  29. // 改变独立复选框状态时触发
  30. $("input[name=\"item\"]").each((i, item) => $(item).change(function(){
  31. cart();
  32. }));
  33. // 全选状态改变时触发
  34. $('#check-all').change(function(){
  35. cart();
  36. });
  37. // 页面载入完成后触发
  38. $(function(){
  39. cart();
  40. });
  • 将以上 jQuery 版购物车全部注释,原生 js 版,完成自动计算
  1. // 原生js购物车全选/全不选操作
  2. // 全选复选框
  3. const checkAll = document.getElementById('check-all');
  4. // 独立复选框
  5. const checkItems = document.getElementsByName('item');
  6. // 改变全选,独立复选框也改变
  7. checkAll.onchange = ev => checkItems.forEach(item => item.checked = ev.target.checked);
  8. // 改变独立复选框,改变全选
  9. checkItems.forEach(item => item.onchange = () => checkAll.checked = [...checkItems].every(ele => ele.checked));
  10. // 购物车,数据填充
  11. function cart() {
  12. // 独立单价数组
  13. let pricesArr = [...document.getElementsByClassName('price')].map(p => p.textContent * 1);
  14. // 独立数量数组
  15. let numbersArr = [...document.querySelectorAll('input[type="number"]')].map(n => n.value * 1);
  16. // 独立金额数组
  17. let amountsArr = [pricesArr, numbersArr].reduce((total, curr) => total.map((item, i) => item * curr[i]));
  18. // 独立金额数据填充,由单品数量改变触发,与独立复选框状态无关
  19. document.querySelectorAll('.amount').forEach((ele, i) => (ele.textContent = amountsArr[i]));
  20. // 总数量,总金额的计算由独立复选框选中状态确定
  21. // 获取所有独立复选框元素
  22. let items = document.getElementsByName('item');
  23. // 过滤出所有独立复选框选中状态的数量数组
  24. numbersArr = numbersArr.filter((ele, i) => [...items][i].checked);
  25. // 过滤出所有独立复选框选中状态的金额数组
  26. amountsArr = amountsArr.filter((ele, i) => [...items][i].checked);
  27. // 计算总数量和总金额
  28. let sum = numbersArr.reduce((p, n) => p + n, 0);
  29. let total = amountsArr.reduce((p, n) => p + n, 0);
  30. // 填充总数量和总金额到页面中
  31. document.getElementById('sum').textContent = sum;
  32. document.getElementById('total-amount').textContent = total;
  33. }
  34. // 改变单品数量时触发
  35. document.querySelectorAll('input[type="number"]').forEach(ele => ele.onchange = cart);
  36. // 改变独立复选框状态时触发
  37. document.getElementsByName('item').forEach(item => item.onchange = cart);
  38. // 全选状态改变时触发
  39. // 由于前面 check-all 已添加 onchange 事件,这里使用事件监听
  40. document.getElementById('check-all').addEventListener('change', cart);
  41. // 页面载入完成后触发
  42. window.onload = cart;
  • 效果和 jQuery 版是一样的

购物车1

  • 点击取消全选,数量和总金额清零

购物车2

  • 只选中第2和第3个商品,将第3个商品数量改为2,改动其它未被选中的商品,不计算在总计内,只计算到右边独立商品的金额处

购物车3

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议