• 原生js--购物车案例


    目录

    案例要求:

    添加商品页面 shop.html

    购物车页面 car.html

    反选全选思路

    数量加减思路

    选中删除按钮

    总价计算


    案例要求:

    • 点击添加商品弹出对话框,添加成功渲染到页面
    • 页面实现删除商品,添加购物车跳转到购物车页面
    • 商品存在数量增加,商品不存在就添加商品
    • 购物车页面实现全选反选,删除,总计,价格排序,选中删除效果

    添加商品页面 shop.html

    1. <style>
    2. #int {
    3. display: none;
    4. }
    5. style>
    6. <body>
    7. <div id="box">
    8. <button id="addshop">添加商品button>
    9. <div id="int">
    10. <input type="text" placeholder="输入商品" id="name"><br />
    11. <input type="text" placeholder="输入价格" id="price"><br />
    12. <button id="addok">添加button>
    13. div>
    14. <table>
    15. <thead>
    16. <tr>
    17. <th>全选<input type="checkbox" id="all">th>
    18. <th>序号th>
    19. <th>姓名th>
    20. <th>价格th>
    21. <th>操作th>
    22. tr>
    23. thead>
    24. <tbody>
    25. tbody>
    26. table>
    27. div>
    28. body>
    29. <script>
    30. let btn = document.getElementById('addshop')
    31. let int = document.getElementById('int')
    32. let name = document.getElementById('name')
    33. let price = document.getElementById('price')
    34. let addok = document.getElementById('addok')
    35. let tbody = document.querySelector("tbody")
    36. // 定义一个空数组
    37. let arr = []
    38. // 添加商品弹出对话框
    39. btn.onclick = () => {
    40. int.style.display = 'block'
    41. }
    42. // 添加商品按钮
    43. addok.onclick = () => {
    44. if (name.value != "" && price.value != "") {
    45. let obj = {
    46. name: name.value,
    47. price: price.value,
    48. num:1,
    49. isCheck:false,
    50. }
    51. arr.push(obj)
    52. // 遮罩层消失
    53. int.style.display = 'none'
    54. render(arr)
    55. } else {
    56. alert("请正确填写")
    57. }
    58. }
    59. int.onclick = () => {
    60. // 阻止冒泡 和 捕获
    61. event.stopPropagation()
    62. }
    63. // 渲染arr
    64. function render(arr) {
    65. let str = ""
    66. arr.forEach((item, index) => {
    67. str += `
    68. ${index + 1}
    69. ${item.name}
    70. ${item.price}
    71. `
    72. })
    73. console.log(str)
    74. tbody.innerHTML = str
    75. }
    76. // 删除按钮
    77. function del(i){
    78. console.log(i);
    79. arr.splice(i,1)
    80. render(arr)
    81. }
    82. // 添加购物车
    83. function addCar(index){
    84. let car=[]
    85. let getlist=localStorage.getItem('token')
    86. if(getlist){
    87. car=JSON.parse(getlist)
    88. }
    89. // 查找商品,如果不等于-1,说明商品已经存在,存在就添加商品的数量
    90. let list=car.findIndex((item)=>{
    91. return item.name==arr[index].name
    92. })
    93. if(list != -1){
    94. // 商品存在,添加商品数量
    95. car[list].num++
    96. }else{
    97. // 商品不存在,添加购物车
    98. car.push(arr[index])
    99. }
    100. // 保存到本地
    101. window.localStorage.setItem('token',JSON.stringify(car))
    102. // 跳转购物车页面
    103. location.href='car.html'
    104. }
    105. script>

    由于我们涉及到了页面跳转,所以我们把数据保存在本地,然后在购物车页面取到数据,然后再对数据进行渲染

    购物车页面 car.html

    1. <style>
    2. h4 {
    3. margin-left: 50%;
    4. margin-top: 10px;
    5. }
    6. style>
    7. <body>
    8. <h4>购物车页面h4>
    9. <button onclick="back()">返回button>
    10. <table>
    11. <thead>
    12. <tr>
    13. <th>全选<input type="checkbox" id="all" onchange=quan() >th>
    14. <th>序号th>
    15. <th>姓名th>
    16. <th>价格 <button onclick="jiang()">降序button>th>
    17. <th>数量th>
    18. <th>小计th>
    19. <th>操作th>
    20. tr>
    21. thead>
    22. <tbody>
    23. tbody>
    24. table>
    25. <p>总计:<span id="total">span>p>
    26. <button onclick="delall()">选中删除button>
    27. body>
    28. <script>
    29. let alll=document.getElementById('all')
    30. let tbody = document.querySelector("tbody")
    31. //定义一个空数组
    32. let car = []
    33. //从本地获取到数据
    34. let getlist = localStorage.getItem('token')
    35. if (getlist) {
    36. car = JSON.parse(getlist)
    37. }
    38. render(car)
    39. // 降序
    40. function jiang() {
    41. car.sort((a, b) => {
    42. return b.price - a.price
    43. })
    44. render(car)
    45. }
    46. //数据渲染
    47. function render(car) {
    48. let str = ""
    49. car.forEach((item, index) => {
    50. str += `
    51. ${index}) ${item.isCheck?'checked':''}>
    52. ${index + 1}
    53. ${item.name}
    54. ${item.price}
    55. ${item.num}
    56. ${item.price * item.num}
    57. `
    58. })
    59. tbody.innerHTML = str
    60. total()
    61. }
    62. var num = localStorage.getItem('token')
    63. // console.log(JSON.parse(num)[0].num);
    64. // 选中删除
    65. function delall(){
    66. let bb=JSON.parse(localStorage.getItem('token'))
    67. let list=bb.filter((item)=>{
    68. return item.isCheck===false
    69. })
    70. localStorage.setItem('token',JSON.stringify(list) )
    71. render(list)
    72. }
    73. //数量减
    74. function jian(e) {
    75. let bb=JSON.parse(localStorage.getItem('token'))
    76. if( bb[e].num=1){
    77. bb[e].num=1
    78. }else{
    79. bb[e].num--
    80. }
    81. localStorage.setItem('token',JSON.stringify(bb) )
    82. render(bb)
    83. }
    84. // 数量加
    85. function jia(e) {
    86. let bb=JSON.parse(localStorage.getItem('token'))
    87. bb[e].num++
    88. console.log(bb);
    89. localStorage.setItem('token',JSON.stringify(bb) )
    90. render(bb)
    91. }
    92. // 返回按钮
    93. function back() {
    94. location.href = 'shop.html'
    95. }
    96. // 删除
    97. function del(i) {
    98. console.log(i);
    99. car.splice(i, 1)
    100. render(car)
    101. }
    102. // 反选
    103. function xuan(e){
    104. let bb=JSON.parse(localStorage.getItem('token'))
    105. // bb[e].isCheck=bb[e].isCheck
    106. console.log(bb[e].isCheck);
    107. bb[e].isCheck=!bb[e].isCheck
    108. localStorage.setItem('token',JSON.stringify(bb) )
    109. if(bb.every((item)=>{return item.isCheck}
    110. )){
    111. alll.checked=true
    112. }else{
    113. alll.checked=false
    114. }
    115. render(bb)
    116. }
    117. // 全选
    118. function quan(){
    119. let bb=JSON.parse(localStorage.getItem('token'))
    120. if(alll.checked){
    121. bb.forEach((item)=>{ return item.isCheck=true})
    122. }else{
    123. bb.forEach((item)=>{ return item.isCheck=false})
    124. }
    125. localStorage.setItem('token',JSON.stringify(bb) )
    126. render(bb)
    127. }
    128. // 总计
    129. function total(){
    130. let bb=JSON.parse(localStorage.getItem('token'))
    131. let list=bb.filter((item)=>{
    132. return item.isCheck === true
    133. })
    134. let sum=0
    135. list.map((item,index)=>{
    136. sum+=item.price*item.num
    137. })
    138. // 获取span标签的dom节点
    139. let total=document.getElementById('total')
    140. total.innerHTML=sum
    141. }
    142. script>

    反选全选思路

    反选:我们传入每行数据的id,通过id获取每行数据的选中状态,使用every方法,如果每一行数据都为true,全选状态也为true

    全选:绑定一个onchange事件,如果全选按钮状态为true,那么数据循环状态变为true

    数量加减思路

    绑定onclick事件,传递id值,从本地获取到数据的数量,然后对数据进行加减操作,最后再保存到本地

    选中删除按钮

    从本地获取数据,过滤数据,然后返回选中状态为false的数据,保存到本地,rander一下数据

    总价计算

    获取本地数据,筛选出来状态为true的数据,定义一个变量,循环数据数量相加,获取总价的dom节点,使用innerHTML对数据进行重写,总价就会随数据的变化而变化

  • 相关阅读:
    [MICROSAR Adaptive] --- 开发环境准备
    SiO2-NH2/Fe3O4表面氨基化的Fe3O4/SiO2复合磁性纳米粒子(齐岳试剂)
    Jackson 化学发光免疫印迹解决方案
    Leveldb学习笔记:leveldb的使用与原理探究
    助力企业降本增效,「WorkPlus SE专业版」正式发布!
    Hive工作原理
    jxTMS设计思想之兴趣点
    wordpress制作主题步骤
    文件描述符--Linux
    OpenTelemetry 实践指南:历史、架构与基本概念
  • 原文地址:https://blog.csdn.net/qq_60976312/article/details/126487066