Home  >  Article  >  Web Front-end  >  Example code sharing using JavaScript to implement Taobao-like shopping cart effects

Example code sharing using JavaScript to implement Taobao-like shopping cart effects

黄舟
黄舟Original
2017-03-17 15:03:391835browse

This article mainly introduces relevant information on JavaScript to implement shopping cart special effects. The article introduces in detail through sample code how to use Javascript to implement single selection, all selection, and delete similar to the products in Taobao shopping cart. , modification and other functions, friends in need can refer to it, let’s take a look below.

Preface

I believe everyone is familiar with the function of the shopping cart. Whenever we purchase goods on a certain website, , whichever product you like will be added to the shopping cart and finally settled. The shopping cart function facilitates consumers to manage products. They can add products, delete products, select one or several products in the shopping cart, and the final total price of the products will also change with the consumer's operations. This article introduces the use of Javascript to achieve a shopping cart effect similar to Taobao, including single selection, all selection, deletion, quantity modification, price calculation, quantity calculation, preview and other functions of products.

The functions are as follows

1. Implement the getElementsByClassName() method that is compatible with lower versions of IE

2. JSTable operation

3. Convert the string into Number 4. Format the number into a specified number of decimal places through toFixed()

5. EventUse of agent

Rendering:

##border-collapse has two values ​​​​to choose from, namely collapse and separate, which is to merge Border and separated border. Under the separated border, you can set the spacing and border style

Example code sharing using JavaScript to implement Taobao-like shopping cart effectsborder-spacing:2em 4em; (set the right spacing and bottom spacing)


border -style:none solid dashed dotted; (Set the styles for the top, right, bottom and left respectively)


html structure:

<table id="cartTable">
 <thead>
 <tr>
 <th><label><input class="check-all check" type="checkbox"/> 全选</label></th>
 <th>商品</th>
 <th>单价</th>
 <th>数量</th>
 <th>小计</th>
 <th>操作</th>
 </tr>
 </thead>
 <tbody>
 <tr>
 <td class="checkbox"><input class="check-one check" type="checkbox" /></td>
 <td class="goods"><img src="images/1.jpg" alt="" /><span>Casio/卡西欧 EX-TR350</span></td>
 <td class="price">5999.88</td>
 <td class="count"><span class="reduce"></span><input class="count-input" type="text" value="1"/>
 <span class="add">+</span></td>
 <td class="subtotal">5999.88</td>
 <td class="operation"><span class="delete">删除</span></td>
 </tr>
 <tr>
 <td class="checkbox"><input class="check-one check" type="checkbox" /></td>
 <td class="goods"><img src="images/2.jpg" alt="" /><span>Canon/佳能 PowerShot SX50 HS</span></td>
 <td class="price">3888.50</td>
 <td class="count"><span class="reduce"></span><input class="count-input" type="text" value="1"/>
 <span class="add">+</span></td>
 <td class="subtotal">3888.50</td>
 <td class="operation"><span class="delete">删除</span></td>
 </tr>
 <tr>
 <td class="checkbox"><input class="check-one check" type="checkbox" /></td>
 <td class="goods"><img src="images/3.jpg" alt="" /><span>Sony/索尼 DSC-WX300</span></td>
 <td class="price">1428.50</td>
 <td class="count"><span class="reduce"></span><input class="count-input" type="text" value="1"/>
 <span class="add">+</span></td>
 <td class="subtotal">1428.50</td>
 <td class="operation"><span class="delete">删除</span></td>
 </tr>
 <tr>
 <td class="checkbox"><input class="check-one check" type="checkbox" /></td>
 <td class="goods"><img src="images/4.jpg" alt="" /><span>Fujifilm/富士 instax mini 25</span></td>
 <td class="price">640.60</td>
 <td class="count"><span class="reduce"></span><input class="count-input" type="text" value="1"/>
 <span class="add">+</span></td>
 <td class="subtotal">640.60</td>
 <td class="operation"><span class="delete">删除</span></td>
 </tr>
 </tbody>
</table>
<p class="foot" id="foot">
 <label class=" fl select-all"><input type="checkbox" class="check-all check" /> 全选</label>
 <a class="fl delete" id="deleteAll" href="javascript:;" rel="external nofollow" >删除</a>
 <p class="fr closing">结 算</p>
 <p class="fr total">合计:¥<span id="priceTotal">0.00</span></p>
 <p class="fr select" id="selected">已选商品<span id="selectedTotal">0</span>件<span class="arrow up">︽</span><span class="arrow down">︾</span></p>
 <p class="selected-view">
 <p id="selectedViewList" class="clearfix">
 <p><img src="images/1.jpg"><span>取消选择</span></p>
 </p>
 <span class="arrow">◆<span>◆</span></span>
 </p>
</p>
css code:

*{
 margin: 0;
 padding: 0;
 }
 a{
 color: #666;
 text-decoration: none;
 }
 body{
 padding:20px;
 color: #666;
 }
 .fl{
 float: left;
 }
 .fr{
 float: right;
 }
 table{
 border-collapse: collapse;
 border-spacing: 0;
 border: 0;
 text-align: center;
 width: 937px;
 }
 th,td{
 border: 1px solid #cadeff;
 }
 th{
 background: #e2f2ff;
 border-top: 3px solid #a7cbff;
 height: 30px;
 }
 td{
 padding: 10px;
 color: #444;
 }
 tbody tr:hover{
 background: RGB(238,246,255);
 }
 .checkbox{width: 60px;}
 .goods{width: 300px;}
 .goods span{
 width: 180px;
 margin-top: 20px;
 text-align: left;
 float: left;
 }
 .price{width: 130px;}
 .count{width: 90px;}
 .count .add, .count input, .count .reduce{
 float: left;
 margin-left: -1px;
 position: relative;
 z-index: 0;
 }
 .count .add, .count .reduce{
 height: 23px;
 width: 17px;
 border: 1px solid #e5e5e5;
 background: #f0f0f0;
 text-align: center;
 line-height: 23px;
 color: #444;
 }
 .count .add:hover, .count .reduce:hover{
 color: #f50;
 z-index: 3;
 border-color: #f60;
 cursor: pointer;
 }
 .count input{
 width: 50px;
 height: 15px;
 line-height: 15px;
 border: 1px solid #aaa;
 color: #343434;
 text-align: center;
 padding: 4px 0;
 background-color: #fff;
 z-index: 2;
 }
 .subtotal{
 width: 150px;
 color: red;
 font-weight: bold;
 }
 .operation{width: 80px;}
 .operation span:hover, .a:hover{
 cursor: pointer;
 color: red;
 text-decoration: underline;
 }
 img{
 width: 100px;
 height: 80px;
 margin-right: 10px;
 float: left;
 }
 .foot{
 width: 935px;
 margin-top: 10px;
 color: #666;
 height: 48px;
 border: 1px solid #c8c8c8;
 background-image: linear-gradient(RGB(241,241,241),RGB(226,226,226));
 position: relative;
 z-index: 8;
 }
 .foot p, .foot a{
 line-height: 48px;
 height: 48px;
 }
 .foot .select-all{
 width: 100px;
 height: 48px;
 line-height: 48px;
 padding-left: 5px;
 color: #666;
 }
 .foot .closing{
 border-left: 1px solid #c8c8c8;
 width: 100px;
 text-align: center;
 color: #000;
 font-weight: bold;
 background: RGB(238,238,238);
 cursor: pointer;
 }
 .foot .total{
 margin: 0 20px;
 cursor: pointer;
 }
 .foot #priceTotal, .foot #selectedTotal{
 color: red;
 font-family: "微软雅黑";
 font-weight: bold;
 }
 .foot .select{
 cursor: pointer;
 }
 .foot .select .arrow{
 position: relative;
 top: -3px;
 margin-left: 3px;
 }
 .foot .select .down{
 position: relative;
 top: 3px;
 display: none;
 }
 .show .select .down{
 display: inline;
 }
 .show .select .up{
 display: none;
 }
 .foot .select:hover .arrow{
 color: red;
 }
 .foot .selected-view{
 width: 935px;
 border: 1px solid #c8c8c8;
 position: absolute;
 height: auto;
 background: #fff;
 z-index: 9;
 bottom: 48px;
 left: -1px;
 display: none;
 }
 .show .selected-view{display: block;}
 .foot .selected-view p{height: auto;}
 .foot .selected-view .arrow{
 font-size: 16px;
 line-height: 100%;
 color: #c8c8c8;
 position: absolute;
 right: 330px;
 bottom: -9px;
 }
 .foot .selected-view .arrow span{
 color: #fff;
 position: absolute;
 left: 0;
 bottom: 1px;
 }
 #selectedViewList{
 padding: 20px;
 margin-bottom: -20px;
 }
 #selectedViewList p{
 display: inline-block;
 position: relative;
 width: 100px;
 height: 80px;
 border: 1px solid #ccc;
 margin: 10px;
 }
 #selectedViewList p span{
 display: none;
 color: #fff;
 font-size: 12px;
 position: absolute;
 top: 0;
 right: 0;
 width: 60px;
 height: 18px;
 line-height: 18px;
 text-align: center;
 background: RGBA(0,0,0,.5);
 cursor: pointer;
 }
 #selectedViewList p:hover span{
 display: block;
 }
js part:

1) Implement the function of selecting all products And calculation of quantity and price

var cartTable = document.getElementById(&#39;cartTable&#39;);
 var tr = cartTable.children[1].rows;//获取table下的tbody下的每一行
 var checkInputs = document.getElementsByClassName(&#39;check&#39;);
 var checkAllInputs = document.getElementsByClassName(&#39;check-all&#39;);
 var selectedTotal = document.getElementById(&#39;selectedTotal&#39;);
 var priceTotal = document.getElementById(&#39;priceTotal&#39;);
 //计算总数和价格
 function getTotal(){
 var selected = 0;
 var price = 0;
 for(var i=0;i < tr.length; i++){
 if(tr[i].getElementsByTagName(&#39;input&#39;)[0].checked){
  selected += parseInt(tr[i].getElementsByTagName(&#39;input&#39;)[1].value);
  price += parseFloat(tr[i].cells[4].innerHTML);//cells属性为获得tr下面的td
 }
 }
 selectedTotal.innerHTML = selected;
 priceTotal.innerHTML = price.toFixed(2);//保留两位小数
 }
 for(var i=0;i<checkInputs.length;i++){
 checkInputs[i].onclick = function(){
 if(this.className === &#39;check-all check&#39;){//如果点击的是全选按钮,则使所有按钮的状态和它相同
  for(var j=0;j<checkInputs.length;j++){
  checkInputs[j].checked = this.checked;
  }
 }
 if(this.checked == false){//如果其中一个变为未选中状态,则使全选按钮取消选中
  for(var i=0;i<checkAllInputs.length;i++){
  checkAllInputs[i].checked = false;
  }
 }
 getTotal();
 }
 }

2) Click on the selected product to realize the function of product preview floating layer

When you click on the selected product, the selected product will be displayed. Select the list of products

At the same time, add the newly created p

js code in

getTotal()

function:

function getTotal(){
 var selected = 0;
 var price = 0;
 var HTMLstr = &#39;&#39;;
 for(var i=0;i < tr.length; i++){
 if(tr[i].getElementsByTagName(&#39;input&#39;)[0].checked){
  tr[i].className = &#39;on&#39;;
  selected += parseInt(tr[i].getElementsByTagName(&#39;input&#39;)[1].value);
  price += parseFloat(tr[i].cells[4].innerHTML);//cells属性为获得tr下面的td
  HTMLstr += &#39;<p><img src="&#39;+ tr[i].getElementsByTagName(&#39;img&#39;)[0].src + &#39;"><span>取消选择</span></p>&#39;;
 }
 else{
  tr[i].className = &#39;&#39;;
 }
 }
 selectedTotal.innerHTML = selected;
 priceTotal.innerHTML = price.toFixed(2);//保留两位小数
 selectedViewList.innerHTML = HTMLstr;
 if(selected == 0){
 foot.className = &#39;foot&#39;;
 }
 }
 for(var i=0;i<checkInputs.length;i++){
 checkInputs[i].onclick = function(){
 if(this.className === &#39;check-all check&#39;){//如果点击的是全选按钮,则使所有按钮的状态和它相同
  for(var j=0;j<checkInputs.length;j++){
  checkInputs[j].checked = this.checked;
  }
 }
 if(this.checked == false){//如果其中一个变为未选中状态,则使全选按钮取消选中
  for(var i=0;i<checkAllInputs.length;i++){
  checkAllInputs[i].checked = false;
  }
 }
 getTotal();
 }
 }

 selected.onclick = function(){
 if(foot.className == &#39;foot&#39;){
 if(selectedTotal.innerHTML != 0){
  foot.className = &#39;foot show&#39;;
 }
 }else{
 foot.className = &#39;foot&#39;;
 }
 }
3) Deselection and event proxy in the product list

When there is no appendChild in the selected product list, neither p nor span exists, so an event proxy must be used.

selectedViewList.onclick = function(e){
  var el = e.srcElement;
  if(el.className == &#39;del&#39;){
  var index = el.getAttribute(&#39;index&#39;);
  var input = tr[index].getElementsByTagName(&#39;input&#39;)[0];
  input.checked = false;
  input.onclick();
  }
 }
4) Realize the calculation of increasing or decreasing product quantity and subtotal price

//增减商品数量事件代理
 for(var i=0;i<tr.length;i++){
  tr[i].onclick = function(e){
  e = e|| window.event;
  var el = e.srcElement;
  var cls = el.className;
  var input = this.getElementsByTagName(&#39;input&#39;)[1];
  var val = parseInt(input.value);
  var reduce = this.getElementsByTagName(&#39;span&#39;)[1];
  switch (cls){
   case &#39;add&#39;:
   input.value = val + 1;
   reduce.innerHTML = &#39;-&#39;;
    getsubTotal(this);
   break;
   case &#39;reduce&#39;:
   if(val > 1){
    input.value = val - 1;
    getsubTotal(this);
   }else{
    reduce.innerHTML = &#39;&#39;;
   }
  }
  getTotal();
  }
  tr[i].getElementsByTagName(&#39;input&#39;)[1].onkeyup = function(){
  var val = parseInt(this.value);
  var tr = this.parentNode.parentNode;//this指的是当前的input,其父节点的父节点就是当前的tr
  var reduce = tr.getElementsByTagName(&#39;span&#39;)[1];
  if(isNaN(val) || val < 1){
   val = 1;
  }
  this.value = val;//保证输入框中都是大于1的纯数字
  if(val <= 1){
   reduce.innerHTML = &#39;&#39;;
  }
  else{
   reduce.innerHTML = &#39;-&#39;;
  }
  getsubTotal(tr);
  getTotal();
  }
 }

5) Realizing the function of deleting products

Learn to use

for loopWhen deleting some data in the array

, you must reset the subscript i.

//删除商品
 deleteAll.onclick = function(){
  if(selectedTotal.innerHTML != &#39;0&#39;){
  var conf = confirm("确定要删除所选商品吗");
  if(conf){
   for(var i=0;i<tr.length;i++){
   var input = tr[i].getElementsByTagName(&#39;input&#39;)[0];
   if(input.checked){
    tr[i].parentNode.removeChild(tr[i]);
    i --;//因为删除数组中的一个后,后面的索引就会向前移,此时要让i也向前移一个,回置下标i
   }
   }
   getTotal();
  }
  }
 }
Summary

The above is the detailed content of Example code sharing using JavaScript to implement Taobao-like shopping cart effects. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn