Maison > interface Web > js tutoriel > le corps du texte

Exemple de partage de code utilisant JavaScript pour implémenter des effets de panier de type Taobao

黄舟
Libérer: 2017-03-17 15:03:39
original
1889 Les gens l'ont consulté

Cet article présente principalement des informations pertinentes sur JavaScript pour implémenter les effets spéciaux du panier d'achat. L'article présente en détail, à travers un exemple de code, comment utiliser JavaScript pour implémenter la sélection unique, toutes les sélections et la suppression similaire aux produits. dans le panier Taobao, la modification et d'autres fonctions, les amis dans le besoin peuvent s'y référer, jetons un coup d'œil ci-dessous.

Avant-propos

Je pense que tout le monde connaît la fonction de panier d'achat de produits chaque fois que nous achetons des produits sur e-commerce.com, quel que soit le produit. que vous aimez sera ajouté au panier et finalement réglé. La fonction de panier permet aux consommateurs de gérer les produits. Ils peuvent ajouter des produits, supprimer des produits, sélectionner un ou plusieurs produits dans le panier, et le prix total final des produits changera également en fonction des opérations du consommateur. Cet article présente l'utilisation de Javascript pour obtenir un effet de panier similaire à celui de Taobao, comprenant la sélection unique, toutes les sélections, la suppression, la modification de la quantité, le calcul du prix, le calcul de la quantité, l'aperçu et d'autres fonctions des produits.

fonctionne comme suit

1. Implémentez la méthode getElementsByClassName() compatible avec les versions inférieures d'IE

2 . JS Opération de table

3. Utilisez parseInt() et parseFloat() pour convertir la chaîne en un nombre

4. Utilisez toFixed() pour formater le nombre dans le nombre décimal de chiffres spécifié

5. Utilisation de événementproxy

Rendu :

Exemple de partage de code utilisant JavaScript pour implémenter des effets de panier de type Taobao

border-collapse a deux valeurs parmi lesquelles choisir, à savoir effondrement et séparation, qui servent à fusionner les bordures et à séparer les bordures. Sous les bordures séparées, vous pouvez définir l'espacement. et style de bordure

border-spacing:2em 4em; (Définissez l'espacement correct et l'espacement inférieur)

border-style:none solid dashed dotted (Définissez les styles) du haut, à droite, en bas et à gauche respectivement)

structure html :

<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>
Copier après la connexion

code css :

*{
 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;
 }
Copier après la connexion

partie js :

1) Implémenter la fonction de sélection complète des marchandises et le calcul de la quantité et du prix

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();
 }
 }
Copier après la connexion

2) Cliquez sur le produit sélectionné pour réaliser la fonction de superposition d'aperçu du produit

Lorsque vous cliquez sur le produit sélectionné produit, la liste des produits sélectionnés sera affichée

En même temps, getTotal() Ajoutez le code p

js nouvellement créé à la fonction

:

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;;
 }
 }
Copier après la connexion

3) Annuler la sélection et le proxy d'événement dans la liste de produits

Lorsqu'il n'y a pas d'appendChild dans la liste de produits sélectionnée, ni p ni span n'existent, donc un proxy d'événement doit être utilisé.

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();
  }
 }
Copier après la connexion

4) Réaliser le calcul de la quantité de produit augmentée ou diminuée et du prix du sous-total

//增减商品数量事件代理
 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();
  }
 }
Copier après la connexion

5) Réaliser la fonction de suppression de produits

Apprenez à utiliser la boucle for pour réinitialiser l'indice i lors de la suppression de certaines données dans le tableau.

//删除商品
 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();
  }
  }
 }
Copier après la connexion

Résumé

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!