先来介绍一下都有哪些功能叭

  1. 添加购物车,清单库存数量会对应减少,库存不足会警告
  2. 从购物车删除,库存将返回清单,总价相应变化
  3. 点击"-",数量会返回到清单库存
  4. 点击"+",清单中库存会减少,库存不足会警告
  5. 勾选或取消勾选商品总价会相应变化
  6. 总价默认计算被选中的商品,添加商品到购物车时默认被选中
  7. 可以进行全选和反选,并一键删除,库存返回清单,总价改变

好嘞,由于代码的注释已经非常的详细了,在此不再做过多的解释了,没用任何框架了,看着注释代码很易懂!

先上HTML5的代码

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>购物车案例</title>
  <style>
    *{
      padding: 0;
      margin: 0;
    }
    .left{
      width: 55%;
      margin: 25px;
      float: left;
    }
    .right{
      float: left;
      margin-top: 60px;
    }
    ul li{
      color: red;
      font-weight: bold;
    }
    h1{
      text-align: center;
      color: red;
    }
    table{
      border: 2px solid #aaa;
      width: 100%;
      border-collapse: collapse;
    }
    th,td{
      border: 2px solid #bbb;
      padding: 6px;
    }
    tr td:last-child{
      text-align: center;
    }
    tr td:nth-child(1) img{
      vertical-align: middle;
    }
    .num{
      text-align: center;
    }
    #allchoose{
      margin-left: 10px;
    }
    #car{
      width: 100%;
      border-collapse: collapse;
    }
    #car table{
      border: 2px solid #aaa;
      width: 100%;
      border-collapse: collapse;
    }
  </style>
</head>
<body>
<div class="left">
  <h1>购书清单</h1>
  <table>
    <thead>
      <tr>
        <th>书名</th>
        <th>单价</th>
        <th>作者</th>
        <th>出版社</th>
        <th>库存</th>
        <th>操作</th>
      </tr>
    </thead>
    <tbody id="items">
      <tr>
        <td><img src="book-images/dl.jpg">深度学习</td>
        <td>100</td>
        <td>赵老师</td>
        <td>科学出版社</td>
        <td>129</td>
        <td><input type="button" value="加入购物车" onclick="add_book(this)"></td>
      </tr>
      <tr>
        <td><img src="book-images/ml.jpg">机器学习</td>
        <td>120</td>
        <td>周老师</td>
        <td>清华大学出版社</td>
        <td>6</td>
        <td><input type="button" value="加入购物车" onclick="add_book(this)"></td>
      </tr>
      <tr>
        <td><img src="book-images/cv.jpg">计算机视觉</td>
        <td>130</td>
        <td>李老师</td>
        <td>国防工业出版社</td>
        <td>666</td>
        <td><input type="button" value="加入购物车" onclick="add_book(this)"></td>
      </tr>
      <tr>
        <td><img src="book-images/dip.jpg">数字图像处理</td>
        <td>140</td>
        <td>彭老师</td>
        <td>人民邮电出版社</td>
        <td>450</td>
        <td><input type="button" value="加入购物车" onclick="add_book(this)"></td>
      </tr>
      <tr>
        <td><img src="book-images/webgl.jpg">webGL编程指南</td>
        <td>150</td>
        <td>吴老师</td>
        <td>清华大学出版社</td>
        <td>99</td>
        <td><input type="button" value="加入购物车" onclick="add_book(this)"></td>
      </tr>
      <tr>
        <td><img src="book-images/unity.jpg">Unity3D游戏开发</td>
        <td>200</td>
        <td>骆老师</td>
        <td>浙江大学出版社</td>
        <td>300</td>
        <td><input type="button" value="加入购物车" onclick="add_book(this)"></td>
      </tr>
    </tbody>
  </table>
  <h1>购物车</h1>
  <div id="car">
    <div id="allchoose">
      <input type="button" id="allSelected" value="全选">
      <input type="button" id="_Selected" value="反选">
      <input type="button" id="delete" value="删除商品">
    </div><br>
    <table>
    <thead>
      <tr>
        <th>书名</th>
        <th>单价</th>
        <th>数量</th>
        <th>金额</th>
        <th>删除</th>
      </tr>
    </thead>
    <tbody id="goods"></tbody>
    <tfoot>
      <tr>
        <td colspan="3" align='center'>总计</td>
        <td id="total" colspan="2">0</td>
      </tr>
    </tfoot>
  </table>
  </div>
</div>
<div class="right">
  <ul>
    <li>功能介绍:</li>
    <li>添加购物车,清单库存数量会对应减少,库存不足会警告</li>
    <li>从购物车删除,库存将返回清单,总价相应变化</li>
    <li>点击"-",数量会返回到清单库存</li>
    <li>点击"+",清单中库存会减少,库存不足会警告</li>
    <li>勾选或取消勾选商品总价会相应变化</li>
    <li>总价默认计算被选中的商品,添加商品到购物车时默认被选中</li>
    <li>可以进行全选和反选,并一键删除,库存返回清单,总价改变</li>

  </ul>
</div>
  <script src="goods.js"></script>
</body>

</html>

然后是JS的代码,代码文件名为“goods.js

//控制全选
var targets=document.getElementsByName('choose')
document.getElementById('allSelected').onclick=function(){   //全选
  for (var i=0;i<targets.length;i++){
    targets[i].checked=true;
  }
  total()   //更新总价格
}
document.getElementById('_Selected').onclick=function(){    // 反选
  for (var i=0;i<targets.length;i++){
    targets[i].checked=!targets[i].checked;//取反操作
  }
  total()    //更新总价格
}

document.getElementById('delete').onclick=function(){       //删除
  var sign=targets.length    //targets的起始长度
  var _length=0
  for(var i=0;i<targets.length;i++){
    if(targets[i].checked===true){
      _length++   //被选中的targets的长度
    }
  }
  var leftL=sign-_length    //除去被选中后剩余的targets长度
  console.log(_length)
  console.log(leftL)

  while(targets.length>leftL){    //删除一行,targets长度会减少1,而i++导致每次执行删除操作只能删除一半,故再套一层循环

    // console.log("targets: "+targets.length)
    for(var i=0;i<targets.length;i++){//执行循环后,targets长度会减半
      if(targets[i].checked===true){
        del(targets[i])    //调用删除函数
      }
    }
  }
}

//将商品添加购物车
function add_book(btn){
  var tr=btn.parentNode.parentNode
  var tds=tr.getElementsByTagName('td')
  var inner_name=tds[0].innerHTML   //带上HTML标签
  var name=tds[0].innerText    //书的名字,不带HTML标签
  // console.log(inner_name)
  // console.log(name)
  var price=tds[1].innerHTML  //书的价格
  var leftAm=parseInt(tds[4].innerHTML)
  if (leftAm===0){
    alert('库存不足!')
    return //如果库存不足函数运行到这里会退出
  }
  //如果库存充足继续向下执行
  else{
    tds[4].innerHTML=leftAm-1
  }
  var tbody=document.getElementById('goods')
  var trs=tbody.getElementsByTagName('tr')
  // var row=tbody.insertRow(-1)
  //不能在此定义row,因为它会默认添加一个新的空行,会导致str的起始length是1而不是0,而且innerText获取不到任何东西就会报错,找了很久的bug原来是它!!!
  // console.log(trs.length)
  var flag=0 //定义flag来判断在购物车中是否已经存在相同书籍
  for(var i=0;i<trs.length;i++){
    var tds=trs[i].getElementsByTagName('td')
    var book_name=tds[0].innerText    //获取书的名字
    if(book_name===name){//在购物车中找到了相同的书
      flag=1
      // var input=trs[i].getElementById('num')    如果把num设置成id,获取不到内容,故改成class
      var input=trs[i].getElementsByClassName('num')[0]
      // console.log(input)
      var value=parseInt(input.value)
      // console.log(value)
      input.value=value+1
      money=parseFloat(tds[3].innerHTML)
      tds[3].innerHTML=price*(value+1)    //更新该书的总价格
    }
  }
  if(flag===0){
    var row=tbody.insertRow(-1)//-1表在当前行后插入行
    row.innerHTML="<td>"+"<input type='checkbox' name='choose' checked='true' onclick='total()'/>"+inner_name+"</td>"+
    "<td>"+price+"</td>"+
    "<td>"+
      "<input type=button value='-' onclick=change(this,-1) style='width: 20px'/>"+
      "<input type=text class=num value='1' size=1 readonly'/>"+
      "<input type=button value='+' onclick=change(this,+1) style='width: 20px'/>"+
    "</td>"+
    "<td>"+price+"</td>"+
    "<td>"+"<input type=button value='删除' onclick='del(this)'/>"+"</td>"
  }
  total()
}


//增加或者减少n本书
function change(btn,n){
  var inputs=btn.parentNode.getElementsByTagName('input')
  var amount=parseInt(inputs[1].value)
  var tds=btn.parentNode.parentNode.getElementsByTagName('td')
  // var money=parseFloat(tds[3].innerHTML)    //总价
  var price=parseFloat(tds[1].innerHTML)    //单价
  if(amount<=0 && n<0){ //数量为0时不能再减少数量
    return
  }
  var name=tds[0].innerText
  var item_trs=document.getElementById('items').getElementsByTagName('tr')
  for (var i=0;i<item_trs.length;i++){
    var item_tds=item_trs[i].getElementsByTagName('td')
    // console.log(item_tds[0].innerText)
    if(item_tds[0].innerText===name){
      var item_amount=parseInt(item_tds[4].innerHTML)
      // console.log(item_amount)
      if(n>0 && item_amount<=0){
        alert("库存不足!")
        return
      }
      item_tds[4].innerHTML=item_amount-n
    }
  }
  inputs[1].value=amount+n
  tds[3].innerHTML=price*(amount+n)
  total()
}

//点击每行的删除
function del(btn){
  var tr=btn.parentNode.parentNode
  var tds=tr.getElementsByTagName('td')
  var inputs=tds[2].getElementsByTagName('input')
  var amount=parseInt(inputs[1].value)    //获取书的数量
  var name=tds[0].innerText
  var trs=document.getElementById('items').getElementsByTagName('tr')
  for (var i=0;i<trs.length;i++){
    var tds=trs[i].getElementsByTagName('td')
    var item_name=tds[0].innerText    //清单中该书的数名字
    if(name===item_name){
      var item_amount=parseInt(tds[4].innerHTML)    //清单中该书的数量
      tds[4].innerHTML=item_amount+amount
    }
  }

  tr.remove()//移除该行
  total()

}

//计算总金额
function total(){
  var tbody=document.getElementById('goods')
  var trs=tbody.getElementsByTagName('tr')
  var sum=0   //总价
  for (var i=0;i<trs.length;i++){
    var tds=trs[i].getElementsByTagName('td')
    var input=tds[0].children[0]    //获取到input标签
    // console.log(tds[0].innerHTML)
    // console.log(input)
    var money=parseFloat(tds[3].innerHTML)
    if(input.checked===true){    //只有当商品被勾选时才会被计入总价
      sum+=money
    }
  }
  var total=document.getElementById('total')
  total.innerHTML=sum
}

最后的效果就是这样的啦^_^