博客列表 >js购物车/json常用转换API

js购物车/json常用转换API

汇享科技
汇享科技原创
2022年08月01日 09:23:50375浏览

购物车自动计算

  1. <div class="box">
  2. <!-- 1. 全选按钮 -->
  3. <div class="selectAll">
  4. <!-- change: 当它的值发生改变时触发 -->
  5. <!-- checked: 当前是选中状态, 布尔属性 -->
  6. <input
  7. type="checkbox"
  8. class="check-all"
  9. name="check-all"
  10. onchange="checkAll()"
  11. checked
  12. />
  13. <label for="check-all">全选</label>
  14. </div>
  15. <!-- 2. 商品列表 -->
  16. <ul class="list">
  17. <li>
  18. <span>选择</span><span>品名</span><span>数量</span><span>单价</span
  19. ><span>金额</span>
  20. </li>
  21. <li>
  22. <input type="checkbox" onchange="checkItems()" checked />
  23. <span class="content">手机</span>
  24. <input type="number" value="1" min="1" class="num" />
  25. <span class="price">100</span>
  26. <span class="amount">0</span>
  27. </li>
  28. <li>
  29. <input type="checkbox" onchange="checkItems()" checked />
  30. <span class="content">电脑</span>
  31. <input type="number" value="2" min="1" class="num" />
  32. <span class="price">200</span><span class="amount">0</span>
  33. </li>
  34. <li>
  35. <input type="checkbox" onchange="checkItems()" checked />
  36. <span class="content">相机</span>
  37. <input type="number" value="3" min="1" class="num" />
  38. <span class="price">300</span>
  39. <span class="amount">0</span>
  40. </li>
  41. <li>
  42. <span>总计:</span>
  43. <span class="total-num">0</span>
  44. <span class="total-amount">0</span>
  45. </li>
  46. </ul>
  47. <!-- 3. 结算按钮 -->
  48. <button class="account">结算</button>
  49. </div>
  1. <script>
  2. // (一) 全选的自动设置
  3. // 1. 全选
  4. function checkAll() {
  5. // 第1步: 获取当前按钮的状态
  6. let status = event.target.checked;
  7. // 第2步: 根据当前状态,来动态的设置其它所有商品的选中状态
  8. const items = document.querySelectorAll(
  9. '.list li input[type="checkbox"]'
  10. );
  11. items.forEach((item) => (item.checked = status));
  12. // document
  13. // .querySelectorAll('.list li input[type="checkbox"]')
  14. // .forEach(item => (item.checked = event.target.checked));
  15. autoCalculate();
  16. }
  17. // 2. 根据用户的选择来动态的设置"全选"按钮的状态
  18. function checkItems() {
  19. // 第1步: 获取全部的商品
  20. const items = document.querySelectorAll(
  21. '.list li input[type="checkbox"]'
  22. );
  23. // 第2步: 判断当前状态, 只有全部选中, 才返回 true,否则就返回false
  24. let status = [...items].every((item) => item.checked === true);
  25. // 第3步: 用这个状态来更新全选按钮
  26. document.querySelector(".check-all").checked = status;
  27. autoCalculate();
  28. }
  29. // (二) 商品的自动计算
  30. // 获取所有商品数量的元素
  31. const nums = document.querySelectorAll(".list .num");
  32. // 1. 计算商品总数
  33. function getTotalNum(numArr) {
  34. return numArr.reduce((acc, cur) => acc + cur);
  35. }
  36. // 2. 计算每个商品的金额: 数量 * 单价
  37. // numArr: 数量数组, priceArr: 单价数组
  38. function getAmount(numArr, priceArr) {
  39. // 用map(), 不用forEach? 因为map有返回值
  40. return numArr.map((num, index) => {
  41. // 以index为索引条件在priceArr中进行查询获取与数量对应的单价
  42. return num * priceArr[index];
  43. });
  44. }
  45. // 3. 计算总金额
  46. function getTotalAmount(amountArr) {
  47. return amountArr.reduce((acc, cur) => acc + cur);
  48. }
  49. // 自动计算的通用方法
  50. function autoCalculate() {
  51. // 数量数组
  52. //拿到ckecked状态为true的数量
  53. let a = [...nums].map((item) => item.parentNode);
  54. let b = a.filter(function (item, k) {
  55. if (item.children[0].checked === true) {
  56. return item.children;
  57. }
  58. });
  59. numArr = b.map((item) => parseInt(item.children[2].value));
  60. // 单价数组
  61. const prices = document.querySelectorAll(".list .price");
  62. let priceArr = [...prices].map((item) => parseInt(item.textContent));
  63. let c = [...nums].map((item) => item.parentNode);
  64. let d = c.filter(function (item, k) {
  65. if (item.children[0].checked === true) {
  66. return item.children;
  67. }
  68. });
  69. priceArr = d.map((item) => item.children[3].textContent);
  70. // 金额数组: 数量数组 * 单价数组
  71. const amountArr = getAmount(numArr, priceArr);
  72. // 将以上数量添加到页面
  73. // 1. 将总数量添加到页面
  74. document.querySelector(".total-num").textContent = getTotalNum(numArr);
  75. // 2. 将每个商品的金额填充
  76. document.querySelectorAll(".amount").forEach((item, index) => {
  77. if (item.parentNode.children[0].checked === true) {
  78. item.textContent = amountArr[index];
  79. } else {
  80. item.textContent = 0;
  81. }
  82. });
  83. // 3. 填充总金额
  84. document.querySelector(".total-amount").textContent =
  85. getTotalAmount(amountArr);
  86. }
  87. // 当页面加载时,根据默认值进行自动计算
  88. // window.addEventListener('load', autoCalculate, false);
  89. window.onload = autoCalculate;
  90. // 当用户更新商品数量时, 将会触发商品金额,总数量,和总金额的动态更新
  91. nums.forEach((item) => (item.onchange = autoCalculate));

json常用的两个API

json不是js对象但是可以在js对象之间来回转换,在前后端交互中存在很重要的地步 json本质上是js对象的序列化用字符串表示
l6a2gxw8.png

  1. let a = {
  2. name: "json数据",
  3. email: "111@qq.com",
  4. };
  5. console.log(a);
  6. let b = JSON.stringify(a);
  7. console.log("转化为JSON数据", b);
  8. console.log("-----------");
  9. let c = `{
  10. "name":"json数据",
  11. "age":10,
  12. "mail":"nicai"
  13. }`;
  14. console.log(c);
  15. let d = JSON.parse(c);
  16. console.log("转换之后的数据", d);
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议