Blogger Information
Blog 19
fans 0
comment 0
visits 13200
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
JS实战(自动轮播图+购物车自动计算)
王浩
Original
560 people have browsed it
  1. 作业内容:
  2. 1. 给轮播图加上自动播放功能;
  3. 2. 给购物车加上选择时自动计算功能;
  4. 3. 复习之前的课程,找到短板,整理笔记;
  5. 4. 预习PHP知识,为节后新课做准备.

1. 给轮播图加上自动播放功能

具体生效代码如下:

  1. // 定时翻页
  2. setInterval(() => {
  3. document.querySelector(".next").dispatchEvent(new Event("click"));
  4. }, 2000);

完整代码经过修正,也贴上:

  1. const banners = [
  2. "images/banner_1.jpg",
  3. "images/banner_2.jpg",
  4. "images/banner_3.jpg",
  5. "images/banner_4.jpg",
  6. ];
  7. const imgGroup = document.querySelector(".container>.img-group");
  8. const btnGroup = document.querySelector(".container>.btn-group");
  9. //页面加载完,生成图片和按钮
  10. window.onload = () => {
  11. // 生成所有图片
  12. createImgs(imgGroup, banners.length);
  13. // 生成与图片对应大小的铵钮
  14. createBtns(btnGroup, banners.length);
  15. };
  16. // 生成所有图片
  17. function createImgs(p, len) {
  18. const frag = document.createDocumentFragment();
  19. for (let i = 0; i < len; i++) {
  20. // 创建图片元素
  21. const img = document.createElement("img");
  22. img.src = banners[i];
  23. img.dataset.index = i + 1;
  24. // 给第一张图片加上active样式
  25. if (i === 0) img.classList.add("active");
  26. frag.append(img);
  27. }
  28. p.append(frag);
  29. }
  30. // 生成与图片对应大小的铵钮
  31. function createBtns(p, len) {
  32. const frag = document.createDocumentFragment();
  33. for (let i = 0; i < len; i++) {
  34. const btn = document.createElement("span");
  35. btn.dataset.index = i + 1;
  36. // 给第一个按钮增加active样式
  37. if (i === 0) btn.classList.add("active");
  38. // 为按钮添加onclick事件
  39. btn.onclick = showImgs;
  40. frag.append(btn);
  41. }
  42. p.append(frag);
  43. }
  44. // 按钮事件
  45. function showImgs(ev) {
  46. const index = ev.target.dataset.index;
  47. [...imgGroup.children].forEach((item) => item.classList.remove("active"));
  48. [...btnGroup.children].forEach((item) => item.classList.remove("active"));
  49. ev.target.classList.add("active");
  50. [...imgGroup.children].filter((item) => item.dataset.index === index)[0].classList.add("active");
  51. }
  52. // 翻页,向前-1,向后1
  53. function nextImg(ev, direction) {
  54. ev.preventDefault();
  55. let index = imgGroup.querySelector(".active").dataset.index;
  56. let count = banners.length;
  57. direction > 0 ? ++index : --index;
  58. index === 0 ? (index = count) : index;
  59. index > count ? (index = 1) : index;
  60. [...imgGroup.children].forEach((item) => item.classList.remove("active"));
  61. [...btnGroup.children].forEach((item) => item.classList.remove("active"));
  62. [...imgGroup.children]
  63. .filter((item) => item.dataset.index === index.toString())[0]
  64. .classList.add("active");
  65. [...btnGroup.children]
  66. .filter((item) => item.dataset.index === index.toString())[0]
  67. .classList.add("active");
  68. }
  69. // 定时翻页
  70. setInterval(() => {
  71. document.querySelector(".next").dispatchEvent(new Event("click"));
  72. }, 2000);

2. 给购物车加上选择时自动计算功能;

  1. // 三句代码实现:当选择某个商品或去掉某个商品时, 能自动计算
  2. // 第一句在checkAll.onchange里加上一个autoCalculate(),即下面代码第11行
  3. // 第二句在checkItems.onchange里加上一个autoCalculate(),即下面代码第16行
  4. // 最后一句在计算的函数里,添加一条判断语句,即下面代码第37行。判断前面的check如果没勾上,就不纳入计算
  1. // 全选复选框
  2. const checkAll = document.querySelector("#check-all");
  3. const checkItems = document.getElementsByName("item");
  4. // change: 当控件中的值发生变化时触发
  5. // 将全选按钮的状态,赋值给下面所有的商品的checkbox
  6. checkAll.onchange = function (ev) {
  7. checkItems.forEach(function (item) {
  8. item.checked = ev.target.checked;
  9. });
  10. autoCalculate();
  11. };
  12. checkItems.forEach(function (item) {
  13. item.onchange = function (ev) {
  14. autoCalculate();
  15. //只有全部选中才更新全选按钮的状态
  16. checkAll.checked = [...checkItems].every(function (item) {
  17. return item.checked;
  18. });
  19. };
  20. });
  21. // 自动计算
  22. // 所有的计算,都是基于数量的变化
  23. const numInput = document.querySelectorAll('input[type="number"]');
  24. numInput.forEach(function (input) {
  25. input.onchange = autoCalculate;
  26. });
  27. function autoCalculate() {
  28. // 1. 获取每个商品的金额: 数量 * 单价
  29. const numbers = document.querySelectorAll('input[type="number"]');
  30. const numArr = [...numbers].map(function (num) {
  31. if (!num.parentNode.parentNode.getElementsByClassName("item")[0].checked) return 0;
  32. return num.value * 1;
  33. });
  34. const prices = document.querySelectorAll("tbody .price");
  35. const priceArr = [...prices].map(function (num) {
  36. return num.textContent * 1;
  37. });
  38. // 2. 计算出每个商品的金额(数组)
  39. const amountArr = [priceArr, numArr].reduce(function (prev, curr) {
  40. return prev.map(function (item, key) {
  41. return item * curr[key];
  42. });
  43. });
  44. // console.log(amountArr);
  45. // 3. 总金额
  46. let total = amountArr.reduce(function (prev, curr) {
  47. return prev + curr;
  48. });
  49. // 4. 总数量
  50. let sum = numArr.reduce(function (prev, curr) {
  51. return prev + curr;
  52. });
  53. // 5. 将所有数据渲染到页面中
  54. document.querySelectorAll(".amount").forEach(function (item, index) {
  55. item.textContent = amountArr[index];
  56. });
  57. document.querySelector("#total-amount").textContent = total;
  58. document.querySelector("#sum").textContent = sum;
  59. }
  60. window.onload = autoCalculate;
  61. // 作业 : 当选择某个商品或去掉某个商品时, 能自动计算

3. 预习和复习相关部分已经在陆续进行

Correcting teacher:PHPzPHPz

Correction status:qualified

Teacher's comments:
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post