基础购物车(Javascript)

简介: 基础购物车(Javascript)

使用Javascript写一个基础购物车,其中包含商品数量加加减减,下面的总价和总数量跟着商品数量变动,还可以自己添加需要的商品。


基础购物车的结构样式如下:



HTML代码:

<body>
    <table border="1px" cellpadding="20px" style="border-collapse: collapse;">
      <thead>
        <tr>
          <th>商品名称</th>
          <th>商品价格</th>
          <th>商品数量</th>
          <th>商品操作</th>
        </tr>
      </thead>
      <tbody id="goods">
        <tr>
          <td>风扇</td>
          <td>24.8¥</td>
          <td><button>-</button> 0 <button>+</button></td>
          <td><button>修改</button> <button>删除</button></td>
        </tr>
      </tbody>
      <footer id="total">
        <tr>
          <td>总价</td>
          <td id="gross"></td>
          <td>总数量</td>
          <td id="qty"></td>
        </tr>
      </footer>
    </table>
    <button class="addition">添加</button>
    <br />
    <!-- 点击添加显示 -->
    <div class="inp" style="display: none;">
      <input class="des" type="text" placeholder="请输入商品名称" />
      <input class="cost" type="number" placeholder="请输入商品价格" />
      <input class="mag" type="number" placeholder="请输入商品数量" />
      <br />
      <button class="append">添加</button>
      <button class="cancel">取消</button>
    </div>
    <!-- 点击修改显示 -->
    <div class="amend" style="display: none;">
      <input class="dess" type="text" placeholder="请输入商品名称" />
      <input class="costs" type="number" placeholder="请输入商品价格" />
      <input class="mags" type="number" placeholder="请输入商品数量" />
      <br />
      <button onclick="appends()">确定</button>
      <button onclick="cancels()">取消</button>
    </div>
    <script src="js/basics.js"></script>
  </body>

css代码:

<style>
      tr,
      td {
        text-align: center;
      }
    </style>

js代码:

// let声明一个变量 为data
let data;
// 声明一个最大的id
let maxid;
// 声明一个变量 为内容下标的id
let a;
// 创建 XMLHttpRequest 对象
let xhr = new XMLHttpRequest();
// 使用 open 方法指定要请求的地址、类型和方式
xhr.open('get', 'js/basics.json', true);
// 发送数据
xhr.send();
// 绑定 onreadystatechange 事件,判断 readyState 和 status 的状态
xhr.onreadystatechange = function() {
  // 第一个判断到哪一步,交互流程,有 5 个阶段 从0开始 4表示交互流程完毕 200是状态请求成功
  if (xhr.readyState == 4 && xhr.status == 200) {
    let text = xhr.responseText;
    console.log(text);
    // 将JSON中的数据转化为对象 接收服务器数据 一般为字符串
    data = JSON.parse(text);
    console.log(data);
    // 调用函数
    basic(data);
    // for循环遍历数组
    for (let i = 0; i < data.length; i++) {
      // 判断 当最大的id大于商品最大的id时 最大的id=商品的id
      if (maxid > data[i].id) {
        maxid = data[i].id
      }
    }
  }
};
// 封装函数
function basic(d) {
  let str = '';
  // let 声明一个变量 total为总价 总价从零开始
  let total = 0;
  // let 声明一个变量 amount为总数量 总数量从零开始
  let amount = 0;
  // let声明变量为gross 通过id名在文档中找到gross
  let gross = document.getElementById('gross');
  // let声明变量为qty 通过id名在文档中找到qty
  let qty = document.getElementById('qty');
  for (let i = 0; i < data.length; i++) {
    // +=是先算在等于
    // 总价等于元素的数量*所对应的价格相加
    total += data[i].num * data[i].price;
    // 总数量等于所有数据的数量 并转为整数
    amount += parseInt(data[i].num);
    // str拼接
    str += `<tr>
          <td>${data[i].name}</td>
          <td>${data[i].price}</td>
          <td><button onclick="minus(${i})">-</button> ${data[i].num} <button onclick="add(${i})">+</button></td>
          <td><button onclick="alter(${i})">修改</button> <button onclick="del(${i})">删除</button></td>
        </tr>`;
  }
  // 元素.innerHTML=内容 改变总价的内容 
  gross.innerHTML = total;
  // 元素.innerHTML=内容 改变总数量的内容
  qty.innerHTML = amount;
  // 渲染数据
  document.getElementById('goods').innerHTML = str;
};
 
// 数量按钮减1
// 减号事件绑定点击事件 传参
function minus(i) {
  // 当商品数量大于0时
  if (data[i].num > 0) {
    // 商品数量减一
    data[i].num--;
  } else {
    // 否则弹窗提示不能为空
    alert("商品数量不能为负")
  };
  // 调用函数
  basic(data);
};
 
// 数量加1
function add(i) {
  data[i].num++;
  // 调用函数
  basic(data);
};
 
// 商品删除
// 点击删除按钮 传参 
function del(i) {
  data.splice(i, 1)
  // 调用函数
  basic(data);
};
 
// 获取添加按钮
let addition = document.getElementsByClassName('addition')[0];
console.log('addition');
// 获取下面的输入框
let inp = document.getElementsByClassName('inp')[0];
console.log('inp');
// 给添加按钮绑定点击事件
addition.onclick = function() {
  // 当点击添加按钮时,下面的输入框出现
  inp.style = "display:block"
};
 
// 点击取消按钮输入框隐藏
// 获取取消按钮
let cancel = document.getElementsByClassName('cancel')[0];
console.log('cancel');
// 给取消按钮绑定点击事件
cancel.onclick = function() {
  // 点击取消按钮 下面的三个输入框隐藏并清空
  inp.style = "display:none";
  des.value = null;
  cost.value = null;
  mag.value = null;
};
 
// 添加事件
// 获取向上添加的添加按钮
let append = document.getElementsByClassName('append')[0];
console.log('append');
// 获取三个输入框
let des = document.getElementsByClassName('des')[0];
console.log('des');
let cost = document.getElementsByClassName('cost')[0];
console.log('cost');
let mag = document.getElementsByClassName('mag')[0];
console.log('mag');
// 给添加绑定点击事件
append.onclick = function() {
  console.log(data);
  // 判断内容都不为空且价格大于零 数量大于等于零 并且数量为整数
  if (des.value != '' && cost.value != '' && mag.value != '' && cost.value > 0 && mag.value >= 0 && mag.value %
    1 === 0) {
    // 通过数组尾部添加添加新的内容
    data.push({
      "id": ++maxid,
      "name": des.value,
      "price": parseFloat(cost.value),
      "num": parseInt(mag.value)
    })
    // 添加上以后下面的输入框隐藏并清空
    inp.style = "display:none";
    des.value = '';
    cost.value = '';
    mag.value = '';
    console.log(data);
    basic(data);
  } else {
    alert("信息填写完整")
  };
};
 
// 修改事件
// 获取修改隐藏的输入框
// 给修改按钮添加点击事件
let amend = document.getElementsByClassName('amend')[0];
// 获取三个输入框
let dess = document.getElementsByClassName('dess')[0];
console.log('dess');
let costs = document.getElementsByClassName('costs')[0];
console.log('costs');
let mags = document.getElementsByClassName('mags')[0];
console.log('mags');
// 给添加绑定点击事件 点击添加出现编辑弹窗
function alter(index) {
  console.log(index);
  amend.style.display = "block";
  // 数据回显
  dess.value = data[index].name;
  costs.value = data[index].price;
  mags.value = data[index].num;
  // a等于数据下标的id
  a = data[index].id;
};
// 编辑添加
// 点击下面输入框里的添加 
function appends() {
  // 判断三个输入框任意一个为空或价格小于0或数量小于0时 提示信息有误
  if (dess.value == '' || costs.value == '' || mags.value == '' || costs.value < 0 || mags.value < 0) {
    alert("信息有误");
    // 否则for循环遍历数组
  } else {
    for (let i = 0; i < data.length; i++) {
      // if判断用户输入的id等于内容的id时 内容修改
      if (data[i].id == a) {
        data[i].name = dess.value;
        data[i].price = costs.value;
        data[i].num = mags.value;
        // 修改完成 输入框隐藏 调用渲染函数
        alert("确认修改");
        amend.style.display = "none";
        basic(data);
        return;
      }
    }
    // 否则提示没有找到相应的数据 输入框隐藏
    amend.style.display = 'none';
  };
};
// 编辑取消
function cancels() {
  // 点击取消,编辑的输入框隐藏,数据重新渲染
  amend.style = "display:none";
  basic(data);
};

json假数据:

[{
  "id":1,
  "name":"风扇",
  "price":"24.8",
  "num":0
  
},{
  "id":2,
  "name":"南街村拌面",
  "price":"5",
  "num":0
  
},{
  "id":3,
  "name":"甜美风小裙子",
  "price":"99.8",
  "num":0
  
},{
  "id":4,
  "name":"空调",
  "price":"1688",
  "num":0
  
},{
  "id":5,
  "name":"维达纸巾",
  "price":"2.5",
  "num":0
  
},{
  "id":6,
  "name":"衬衣",
  "price":"50",
  "num":0
}]
目录
相关文章
|
2月前
|
JavaScript 前端开发 API
从零开始学表单操作,jQuery 与原生 JavaScript 完全指南,带你轻松掌握网页交互关键!
【8月更文挑战第31天】在网页开发中,表单是实现用户互动的关键元素。无论是收集信息、提交数据还是验证输入,都需要对表单进行有效操作。本文档介绍了如何使用原生 JavaScript 和 jQuery 操作表单,包括获取表单元素、读写表单值、处理表单提交及验证等核心功能。jQuery 提供了更简洁的语法和更好的兼容性,但原生 JavaScript 在性能上有优势。选择合适的方法取决于项目需求和个人偏好。下面通过具体示例展示了两种方式的操作方法。
26 0
|
4月前
|
设计模式 JSON JavaScript
Javascript实现购物车的详细代码
Javascript实现购物车的详细代码
89 3
|
5月前
|
JavaScript 前端开发
JavaScript三级联动功能
JavaScript三级联动功能
|
5月前
|
存储 前端开发 JavaScript
使用JavaScript实现动态生成并管理购物车的深入解析
使用JavaScript实现动态生成并管理购物车的深入解析
|
10月前
|
JSON 前端开发 JavaScript
javascript 实现纯前端将数据导出excel两种方式
<html> <head> <p style="font-size: 20px;color: red;">使用a标签方式将json导出csv文件</p> <button onclick='tableToExcel()'>导出</button> </head> <body> <script> const tableToExcel = () => { // 要导出的json数据 const jsonData = [ { name:'路人甲', ph
69 0
|
前端开发 JavaScript
Javascript知识【BootStrap技术实现商品页面】(下)
Javascript知识【BootStrap技术实现商品页面】
|
前端开发 JavaScript
Javascript知识【BootStrap技术实现商品页面】(上)
Javascript知识【BootStrap技术实现商品页面】
|
JavaScript 前端开发
JavaScript 实现三级联动(简易,通用)
JavaScript 实现三级联动(简易,通用)
186 0
|
数据采集 JavaScript 前端开发
使用JavaScript和Vue.js框架开发的电子商务网站,实现商品展示和购物车功能
使用JavaScript和Vue.js框架开发的电子商务网站,实现商品展示和购物车功能
|
存储 自然语言处理 JavaScript
JavaScript基础系列(6):`this`这六种使用方式,你都理解了吗?
执行发现两个this都指向了全局的window.也就是全局执行上下文中的this和函数执行上下文中的this都指向了全局window.所以默认的情况下,在全局中调用一个函数,函数中执行上下文中的this都是指向window对象的。
111 0