购物车难度中的选定列表动态计算

CSGuy94

我正在开发一个程序,其中将商品添加到购物车,并且随着商品的添加和删除,我可以动态地计算总数。我的问题是,当我用选定的列表更改总数时。现在,只有购物车的数量选择器中的第一项起作用。

另外,当我向购物车中添加新商品时,数量会切换回1。仍然要巩固我的数量值吗?

我将非常感谢可以提供的任何帮助。我一直在看这段代码好几个小时,试图弄清为什么我无法使所有功能正常工作。

这是我围绕购物车进行操作的代码:

//Activates "Add" button so cart can be populated
$('#item-list').on('click', '.addme', function(){ 

// 1. Read the item index using data- attribute
var index = $(this).data('index');

if(!inCart(index)){
  cart.push(index);
} 

// 3. Update the cart list and total credits
displayCartItems();
checkCart();

// update price
calculateTotalPrice();
});

//function to check if items are in cart
function inCart(index){
for (var i=0; i<cart.length; i++){
if (cart[i] == index)
  return true;
}
return false;
}

//Displays the shopping cart items
function displayCartItems(){
// create a table row for each item in cart array
var itemInfo = '';
for (var i=0; i<cart.length; i++){
  var index = cart[i];
  itemInfo += createTableRow(index);
}
$('#selected-list').html(itemInfo);
}

//Constructs the shopping cart table
function createTableRow(index){
  var trow = '';

  trow += "<tr><td>"+item_list[index].title + "</td>>";
  trow += "<td id='itemsprice'>"+item_list[index].price + "</td>";
  trow += "<td><select class='item-quantity' data-quantity='"+index+"'><option value='1'>1</option><option value='2'>2</option><option value='3'>3</option><option value='4'>4</option><option value='5'>5</option><option value='6'>6</option><option value='7'>7</option><option value='8'>8</option><option value='9'>9</option><option value='10'>10</option></td>";
  trow += "<td id='tc-item'>"+item_list[index].price+"</td>"
  trow += "<td><button type='button' class='delete-item' value='"+index+"'>Delete</button></td></tr>";
  return trow;
}

//When quantity is changed change the value and compute new totals
$('#selected-list').on('change', '.item-quantity', function(){

  calculateTotalPrice();

});


//If delete button is pressed in cart, the item is removed from the cart
$('#selected-list').on('click', '.delete-item', function(){
var index = $(this).val();

removeItemFromCart(index);
calculateTotalPrice();
checkCart();

});

function checkCart(){
 if(cart.length == 0){
  $('#empty-cart').html("Your cart is empty!");
} else {
  $('#empty-cart').html("");
}
}

//function to remove items from the shopping cart
function removeItemFromCart(index){
// identify and remove the index from the cart and redisplay cart table
var pos = -1;
for (var i=0; i<cart.length; i++){
  if (index == cart[i]){
    pos = i;
    break;
  }
  }
if (pos>-1){
  cart.splice(pos, 1);
  // reset the cart table
  displayCartItems();
} else {
  alert("Could not find!");
}
}

function calculateTotalPrice(){
var quantity = $('.item-quantity').val();
var subtotal = 0;
var tax = 0;
var shipping = 0;
var total = 0;

//for loop to calculate the subtotal
for(var i = 0; i < cart.length; i++){
  var productPrice = item_list[cart[i]].price;
  subtotal += productPrice * quantity; 
  }

//Percent taxed is 6%
var taxPerc = .06;

//Calculating taxes
tax = subtotal * taxPerc;

//Percent for shipping is 2%
var shippingPerc = .02;

//Calculating shipping
shipping = subtotal * shippingPerc;

//Calculating total
total = subtotal + tax + shipping;

//Displaying totals
//$('#tc-item').html(totalItemPrice.toFixed(2));
$('#subtotal').html(subtotal.toFixed(2));
$('#tax').html(tax.toFixed(2));
$('#shipping').html(shipping.toFixed(2));
$('#total').html(total.toFixed(2));
}

//Activates the Display cart and Hide cart buttons in shopping cart
$('#show-cart').on('click', function(){
$('#selected-list').show();
});
$('#hide-cart').on('click', function(){
$('#selected-list').hide();
});

我很肯定我的calculateTotalPrice()功能需要一些调整,但是到目前为止,我一直无法弄清楚如何解决它。如果有人需要,这是我的其余代码:

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"     "http://www.w3.org/TR/html4/strict.dtd"> <html>
<head>
<meta charset="utf-8">
 <!-- Set the viewport so this responsive site displays correctly on mobile     devices -->
 <meta name="viewport" content="width=device-width, initial-scale=1">
 <title>Sam's Discount Store </title>
 <!-- Include bootstrap CSS -->
 <link rel="stylesheet"     href="http://netdna.bootstrapcdn.com/bootstrap/3.1.0/css/bootstrap.min.css">
<script type="text/javascript"     src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js">    </script>
<style type="text/css">
 .courselist { cursor: pointer;}
 .t-head { color: #fff; background-color: #333366; font-size: 20px; line-    height: 20px; }
 #top-box, #footer { background-color: #330066; color: #fff; text-align:     center;}
 #content {border: 1px solid #330099;}
</style>
<script>
$(function(){
/* The following  function defines a constructor for creating an array of     objects with four properties.
The keyword "this" refers to the instance of the object
*/
function Item(type,title,description,price){
  this.type = type;
  this.title = title;
  this.description = description;
  this.price = price;

}

//create an array to store items
var item_list = [];
var cart = []; //store index of elements in the shopping cart

//add items
//add baseballgear items
item_list.push(new Item('baseballgear','Louisville Slugger', 'The finest craftsmanship and finest materials ensure stepping to the plate with the Louisville Slugger® M9 Maple M110 Bat will allow you to swing what the pros swing.', 79.99 ));
item_list.push(new Item('baseballgear','Marucci Bat', 'Named for one of the most lethal hitters in the game, the Marucci® CUTCH22 Pro Model Baseball Bat features the same cut and finish swung by MLB® center fielder, Andrew McCutchen. The "Cutch" features a large, powerful, balanced barrel with a sleek cherry red and grey finish to deliver maximum performance at the plate. This adult wooden bat is also handcrafted and bone-rubbed to ensure superior quality and surface hardness.', 139.99));
item_list.push(new Item('baseballgear', 'Rawlings Glove', "Unrivaled quality season after season, the Rawlings® 11.25'' Pro Preferred® Series Glove returns to provide elite craftsmanship and superior performance for elite middle infielders.",349.99));
item_list.push(new Item('baseballgear', 'Wilson Glove', "Enhance your field performance with unrivaled dependability with the Wilson® 11.5 A2000™ Series Glove. Made with Pro Stock® leather for long-lasting performance, this glove's construction is preferred by professionals for its top-notch quality. Dri-Lex® technology in the wrist lining transfers moisture away from the skin to keep you cool and dry. The advanced design has been improved upon by the Wilson&Reg; Advisory Staff.",249.99 ));
item_list.push(new Item('baseballgear', 'Easton Baseball Helmet', 'Give your favorite player maximum protection at the plate with the Easton® Junior Z5 Elite Baseball Helmet. The ABS shell withstands impact and disperses energy away from the head, with a stylish Digi-Camo design. Featuring dual density foam liner for advanced comfort, this helmet boasts BioDri™ padded inner liner to wick moisture away from the skin to keep them cool and dry. Wrapped ear pads provide enhanced coverage around the head.', 54.99));
item_list.push(new Item('baseballgear', 'Rawlings Batting Gloves', 'Get the most out of your batting gloves this season with the Rawlings® Adult Workhorse 950 Batting Gloves. These gloves feature an Oiltac® leather palm pad to provide better grip and softness. Equipped with a Dura-Plus™ pad for added protection in the palm, the Dynamic Fit System™ provides greater comfort, flex, and feel during every play. The adjustable wrist closure is reinforced to provide a more secure fit', 34.99));

//add soccergear items
item_list.push(new Item('soccergear', 'Nike Ordem Soccer Ball', 'Hit the back of the net with the The Nike® Ordem 3 PL Soccer Ball. The Ordem 3 is the official match ball of the English Premier League for the 2015-2016 season. This FIFA® approved ball features Aerowtrac grooves and a micro-textured casing for accurate flight. The carbon latex bladder and fuse-welded construction allow for an exceptional touch while the vivid visual Power Graphics allow you to track the ball so you can react quickly.', 150.00));
item_list.push(new Item('soccergear', 'Wilson Shinguard', 'Maximize your protection for practice or game day with the Wilson® NCAA® Forte ll Soccer Shinguard. This high impact shinguard is constructed of a removable inner shell for adjustable protection to diffuse impact during elite-level play. Its Lycra® sleeve contains power band enhancements for added compression and blood circulation. Focus on your game with the Wilson® NCAA® Forte ll Soccer Shinguard.', 24.99 ));
item_list.push(new Item('soccergear', 'Adidas Goalie Gloves', 'Protect the goal line with intensity when you sport the adidas® Ace Zones Pro Soccer Goalie Gloves. Evo Zone Technology delivers superior catching and control so you can dominate the game from the net. The negative cut ensures a snug feel while seamless touch features deliver breathability through the latex and foam construction. A stretch-strap wraps your hand to complete the gloves with a comfortable fit.', 114.99));
item_list.push(new Item('soccergear', 'Storelli Exoshield Goalie Jersey', 'Block kicks to the net with maximum mobility in the Storelli® Exoshield GK Adult Goalie Gladiator Jersey. This jersey withstands impact between the posts with polyurethane foam protection at the elbows. For increased comfort, the compression material wicks moisture away to keep the skin cool and dry. Dive and defend without distraction in the lightweight Storelli® Exoshield GK Adult  Goalie Gladiator Jersey.', 64.99));
item_list.push(new Item('soccergear', 'Storelli BodyShield Slider Shorts', "Enjoy superior protection with the classic fit of the Storelli® sliders. Lightweight foam padding delivers high-performance protection to keep you safe from impact, swelling and cuts, while the unique design lets you freely move while the pads stay in place. Stay safe on the field with the antimicrobial technology and lightweight padding of the Storelli® Men's Slider Shorts.", 59.99));
item_list.push(new Item('soccergear', 'Adidas Estadio Teamp Backpack', 'Transport your gear to and from the field in style with the adidas® Estadio Team Backpack II. Built with soccer in mind, this backpack is constructed with multiple compartments to conveniently organize and store all of your gear. LoadSpring™ technology adds comfort to the shoulder straps so you can carry more equipment. FreshPAK™ shoe compartment keeps gear fresh throughout the season.', 55.00));

//add videogames
item_list.push(new Item('videogames', 'Star Wars Battlefront', 'Visit classic planets from the original Star Wars™ trilogy, detailed with an unprecedented amount of realism and sense of authenticity that will transport you to a galaxy far, far away', 59.99));
item_list.push(new Item('videogames', 'Just Cause 3', "The Mediterranean republic of Medici is suffering under the brutal control of General Di Ravello, a dictator with an insatiable appetite for power. Enter Rico Rodriguez, a man on a mission to destroy the general's ambitions by any means necessary. With more than 400 square miles of complete freedom from sky to seabed, and a huge arsenal of weaponry, gadgets and vehicles, prepare to unleash chaos in the most creative and explosive ways you can imagine.", 59.99));
item_list.push(new Item('videogames', 'Call of Duty Black Ops III', 'Call of Duty: black Ops III is the ultimate 3-games-in-1 experience. The Campaign you must navigate the hot spots of a new Cold War to find your missing brothers. Multiplayer features a new momentum-based chained movement system, allowing players to fluidly move through the environment with finesse. No Treyarch title would be complete without its signature Zombies offering "Shadows of Evil" has its own distinct storyline right out of the box.', 59.99));
item_list.push(new Item('videogames', 'Fallout 4', 'The epic storylines, adrenaline-pumping action and explosive thrills are back. The Fallout franchise returns with Fallout 4. Grab your controller and get ready to dive back into  the enveloping storyline of this legendary series.', 59.99));
item_list.push(new Item('videogames', 'Halo 5: Guardians', 'A mysterious and unstoppable force threatens the galaxy, the Master Chief is missing and his loyalty questioned. Experience the most dramatic Halo story to date in a 4-player cooperative epic that spans three worlds. Challenge friends and rivals  in new multiplayer modes: Warzone, massive 24-player battles, and Arena, pure    4-vs-4 competitive combat.*', 59.99));
 item_list.push(new Item('videogames', "Assassin's Creed Syndicate", "WELCOME TO  THE FAMILY — London, 1868. The Industrial Revolution fattens the purses of the privileged while the working class struggles to survive — until two Assassins  rise to lead the world's first organized crime family. Conquer the streets of   London. Bring the ruling class to their knees. Make history in a visceral    adventure unlike any game you've played before.", 59.99));


// display item list
 displayAll();

 //When a new category is chosen it will correct and display items of that     category type
 $('#category').on('change', function(){
  // read the selected category using 'value' attribute
  var category = $(this).val();
  if (category == '0')
    displayAll(); // display all items
  else
   displaySelectedItems(category); // display selected items

 });

 //When category is chosen, items with the same type will be displayed
 function displaySelectedItems(category){
  var itemInfo = '';
   /* display data: 
  use a for loop to go through each element in the item_list array 
 */
  for (var i=0; i<item_list.length; i++){

    // display only selected items
    if (item_list[i].type == category){
      itemInfo += createItemData(item_list[i], i); 
    }
    // add each item to the table
     $('#item-list').html(itemInfo);
  }
 }

 //Displays the item list
  function displayAll(){ 
   var itemInfo = '';
   /* display data: 
  use a for loop to go through each element in the item_list array 
   Each element is an object.  
 */
  for (var i=0; i<item_list.length; i++){

  // use each item to create HTML content
  itemInfo += createItemData(item_list[i], i); 

  // add each item to the table
  $('#item-list').html(itemInfo); 
}
}

//Creates the item's data
function createItemData(item, index){

  var trow = "<tr class='itemlist  data-index='" +index+ "' >";
      trow +=  "<td class=item-title'>"+item.title + "</td>";
      trow += "<td class='item-description'>"+item.description + "</td>";
      trow += "<td class='price'>$"+item.price + "</td>";
      trow += "<td class='adding'><button type='button' class='addme' data-    index='"+index+"'>Add</td></tr>";
  return trow;
}

//Activates "Add" button so cart can be populated
$('#item-list').on('click', '.addme', function(){ 

// 1. Read the item index using data- attribute
var index = $(this).data('index');

if(!inCart(index)){
  cart.push(index);
} 

// 3. Update the cart list and total credits
displayCartItems();
checkCart();

// update price
calculateTotalPrice();
});

//function to check if items are in cart
function inCart(index){
for (var i=0; i<cart.length; i++){
if (cart[i] == index)
  return true;
}
return false;
}

//Displays the shopping cart items
function displayCartItems(){
// create a table row for each item in cart array
var itemInfo = '';
for (var i=0; i<cart.length; i++){
  var index = cart[i];
  itemInfo += createTableRow(index);
}
$('#selected-list').html(itemInfo);
}

//Constructs the shopping cart table
function createTableRow(index){
  var trow = '';

  trow += "<tr><td>"+item_list[index].title + "</td>>";
  trow += "<td id='itemsprice'>"+item_list[index].price + "</td>";
  trow += "<td><select class='item-quantity' data-quantity='"+index+"'><option value='1'>1</option><option value='2'>2</option><option value='3'>3</option><option value='4'>4</option><option value='5'>5</option><option value='6'>6</option><option value='7'>7</option><option value='8'>8</option><option value='9'>9</option><option value='10'>10</option></td>";
  trow += "<td id='tc-item'>"+item_list[index].price+"</td>"
  trow += "<td><button type='button' class='delete-item' value='"+index+"'>Delete</button></td></tr>";
  return trow;
}

//When quantity is changed change the value and compute new totals
$('#selected-list').on('change', '.item-quantity', function(){

  calculateTotalPrice();

});


//If delete button is pressed in cart, the item is removed from the cart
$('#selected-list').on('click', '.delete-item', function(){
var index = $(this).val();

removeItemFromCart(index);
calculateTotalPrice();
checkCart();

});

function checkCart(){
 if(cart.length == 0){
  $('#empty-cart').html("Your cart is empty!");
} else {
  $('#empty-cart').html("");
}
}

//function to remove items from the shopping cart
function removeItemFromCart(index){
// identify and remove the index from the cart and redisplay cart table
var pos = -1;
for (var i=0; i<cart.length; i++){
  if (index == cart[i]){
    pos = i;
    break;
  }
  }
if (pos>-1){
  cart.splice(pos, 1);
  // reset the cart table
  displayCartItems();
} else {
  alert("Could not find!");
}
}

function calculateTotalPrice(){
var quantity = $('.item-quantity').val();
var subtotal = 0;
var tax = 0;
var shipping = 0;
var total = 0;

//for loop to calculate the subtotal
for(var i = 0; i < cart.length; i++){
  var productPrice = item_list[cart[i]].price;
  subtotal += productPrice * quantity; 
  }

//Percent taxed is 6%
var taxPerc = .06;

//Calculating taxes
tax = subtotal * taxPerc;

//Percent for shipping is 2%
var shippingPerc = .02;

//Calculating shipping
shipping = subtotal * shippingPerc;

//Calculating total
total = subtotal + tax + shipping;

//Displaying totals
//$('#tc-item').html(totalItemPrice.toFixed(2));
$('#subtotal').html(subtotal.toFixed(2));
$('#tax').html(tax.toFixed(2));
$('#shipping').html(shipping.toFixed(2));
$('#total').html(total.toFixed(2));
}

//Activates the Display cart and Hide cart buttons in shopping cart
$('#show-cart').on('click', function(){
$('#selected-list').show();
});
$('#hide-cart').on('click', function(){
$('#selected-list').hide();
    });

    });
</script>
</head>
<body>
<div class='container'>
  <div class='row' id='top-box' >
  <div class='col-sm-12'>
    <h2>Sam's Discount Store</h2>
    <h3>Variety of Items!</h3>
  </div>
  </div>

  <div class='row' id='content'>
  <div class='col-sm-8'>
    <h3 class='title'>Discounted Items</h3>
    <h4>
      <select id='category'>
      <option value='0' >All</option>
      <option value='baseballgear' >Baseball Items</option>
      <option value='soccergear' >Soccer Items</option>
      <option value='videogames'>Video Games</option>
     </select>
    </h4>
    <table class='table table-bordered clmlabels' >
        <tr class='t-head'><td >Product</td>
          <td >Description</td>
          <td >Cost</td>
        </tr>
      <tbody id='item-list'>
      </tbody>


    </table>
  </div>
  <div class='col-sm-4'>
    <h2>Cart Items</h2>

 <p><button class='btn btn-primary' id='show-cart'>Display cart</button>
   <button class='btn' id='hide-cart'>Hide cart</button></p>
    <table class='table selected-list' id='selected-list'>
   </table>
  </div>
  <table class='cart-table'>
    <tr>
      <td id='empty-cart'></td>
    <tr>
     <td>Subtotal:  </td>
      <td><span id='subtotal'>0</td>
    </tr>
    <tr>
      <td>Tax:  </td>
      <td><span id='tax'>0</td>
    </tr>
    <tr>
      <td>Shipping:  </td>
     <td><span id='shipping'>0</td>
    </tr>
     <tr>
      <td>Total:  </td>
      <td><span id='total'>0</td>
    </tr>
  </table>

</div>
   </div>
   <div class='row' id='footer'
   <div class='col-sm-12'> <p>Sam's Discount Store</p></div>
   </div>
</div>
</body>
</html>
维杰

我已经更新了您的代码。现在,我认为它的工作符合预期。请看看。

我所做的主要更改是现在不再将索引仅推入cart数组;而是 我现在也像这样插入数量:

cart.push({"index": index, "qty": 1});

同样,每当我们通过select更改数量时我们正在更新号码。并且在总金额计算中使用了相同的值。

我建议将以下代码与您的本地副本进行比较,以查看所做的所有更改。希望对您有帮助。

 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"     "http://www.w3.org/TR/html4/strict.dtd"> <html>
<head>
<meta charset="utf-8">
 <!-- Set the viewport so this responsive site displays correctly on mobile     devices -->
 <meta name="viewport" content="width=device-width, initial-scale=1">
 <title>Sam's Discount Store </title>
 <!-- Include bootstrap CSS -->
 <link rel="stylesheet"     href="http://netdna.bootstrapcdn.com/bootstrap/3.1.0/css/bootstrap.min.css">
<script type="text/javascript"     src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js">    </script>
<style type="text/css">
 .courselist { cursor: pointer;}
 .t-head { color: #fff; background-color: #333366; font-size: 20px; line-    height: 20px; }
 #top-box, #footer { background-color: #330066; color: #fff; text-align:     center;}
 #content {border: 1px solid #330099;}
</style>
<script>
$(function(){
/* The following  function defines a constructor for creating an array of     objects with four properties.
The keyword "this" refers to the instance of the object
*/
function Item(type,title,description,price){
  this.type = type;
  this.title = title;
  this.description = description;
  this.price = price;

}

//create an array to store items
var item_list = [];
var cart = []; //store index of elements in the shopping cart

//add items
//add baseballgear items
item_list.push(new Item('baseballgear','Louisville Slugger', 'The finest craftsmanship and finest materials ensure stepping to the plate with the Louisville Slugger® M9 Maple M110 Bat will allow you to swing what the pros swing.', 79.99 ));
item_list.push(new Item('baseballgear','Marucci Bat', 'Named for one of the most lethal hitters in the game, the Marucci® CUTCH22 Pro Model Baseball Bat features the same cut and finish swung by MLB® center fielder, Andrew McCutchen. The "Cutch" features a large, powerful, balanced barrel with a sleek cherry red and grey finish to deliver maximum performance at the plate. This adult wooden bat is also handcrafted and bone-rubbed to ensure superior quality and surface hardness.', 139.99));
item_list.push(new Item('baseballgear', 'Rawlings Glove', "Unrivaled quality season after season, the Rawlings® 11.25'' Pro Preferred® Series Glove returns to provide elite craftsmanship and superior performance for elite middle infielders.",349.99));
item_list.push(new Item('baseballgear', 'Wilson Glove', "Enhance your field performance with unrivaled dependability with the Wilson® 11.5 A2000™ Series Glove. Made with Pro Stock® leather for long-lasting performance, this glove's construction is preferred by professionals for its top-notch quality. Dri-Lex® technology in the wrist lining transfers moisture away from the skin to keep you cool and dry. The advanced design has been improved upon by the Wilson&Reg; Advisory Staff.",249.99 ));
item_list.push(new Item('baseballgear', 'Easton Baseball Helmet', 'Give your favorite player maximum protection at the plate with the Easton® Junior Z5 Elite Baseball Helmet. The ABS shell withstands impact and disperses energy away from the head, with a stylish Digi-Camo design. Featuring dual density foam liner for advanced comfort, this helmet boasts BioDri™ padded inner liner to wick moisture away from the skin to keep them cool and dry. Wrapped ear pads provide enhanced coverage around the head.', 54.99));
item_list.push(new Item('baseballgear', 'Rawlings Batting Gloves', 'Get the most out of your batting gloves this season with the Rawlings® Adult Workhorse 950 Batting Gloves. These gloves feature an Oiltac® leather palm pad to provide better grip and softness. Equipped with a Dura-Plus™ pad for added protection in the palm, the Dynamic Fit System™ provides greater comfort, flex, and feel during every play. The adjustable wrist closure is reinforced to provide a more secure fit', 34.99));

//add soccergear items
item_list.push(new Item('soccergear', 'Nike Ordem Soccer Ball', 'Hit the back of the net with the The Nike® Ordem 3 PL Soccer Ball. The Ordem 3 is the official match ball of the English Premier League for the 2015-2016 season. This FIFA® approved ball features Aerowtrac grooves and a micro-textured casing for accurate flight. The carbon latex bladder and fuse-welded construction allow for an exceptional touch while the vivid visual Power Graphics allow you to track the ball so you can react quickly.', 150.00));
item_list.push(new Item('soccergear', 'Wilson Shinguard', 'Maximize your protection for practice or game day with the Wilson® NCAA® Forte ll Soccer Shinguard. This high impact shinguard is constructed of a removable inner shell for adjustable protection to diffuse impact during elite-level play. Its Lycra® sleeve contains power band enhancements for added compression and blood circulation. Focus on your game with the Wilson® NCAA® Forte ll Soccer Shinguard.', 24.99 ));
item_list.push(new Item('soccergear', 'Adidas Goalie Gloves', 'Protect the goal line with intensity when you sport the adidas® Ace Zones Pro Soccer Goalie Gloves. Evo Zone Technology delivers superior catching and control so you can dominate the game from the net. The negative cut ensures a snug feel while seamless touch features deliver breathability through the latex and foam construction. A stretch-strap wraps your hand to complete the gloves with a comfortable fit.', 114.99));
item_list.push(new Item('soccergear', 'Storelli Exoshield Goalie Jersey', 'Block kicks to the net with maximum mobility in the Storelli® Exoshield GK Adult Goalie Gladiator Jersey. This jersey withstands impact between the posts with polyurethane foam protection at the elbows. For increased comfort, the compression material wicks moisture away to keep the skin cool and dry. Dive and defend without distraction in the lightweight Storelli® Exoshield GK Adult  Goalie Gladiator Jersey.', 64.99));
item_list.push(new Item('soccergear', 'Storelli BodyShield Slider Shorts', "Enjoy superior protection with the classic fit of the Storelli® sliders. Lightweight foam padding delivers high-performance protection to keep you safe from impact, swelling and cuts, while the unique design lets you freely move while the pads stay in place. Stay safe on the field with the antimicrobial technology and lightweight padding of the Storelli® Men's Slider Shorts.", 59.99));
item_list.push(new Item('soccergear', 'Adidas Estadio Teamp Backpack', 'Transport your gear to and from the field in style with the adidas® Estadio Team Backpack II. Built with soccer in mind, this backpack is constructed with multiple compartments to conveniently organize and store all of your gear. LoadSpring™ technology adds comfort to the shoulder straps so you can carry more equipment. FreshPAK™ shoe compartment keeps gear fresh throughout the season.', 55.00));

//add videogames
item_list.push(new Item('videogames', 'Star Wars Battlefront', 'Visit classic planets from the original Star Wars™ trilogy, detailed with an unprecedented amount of realism and sense of authenticity that will transport you to a galaxy far, far away', 59.99));
item_list.push(new Item('videogames', 'Just Cause 3', "The Mediterranean republic of Medici is suffering under the brutal control of General Di Ravello, a dictator with an insatiable appetite for power. Enter Rico Rodriguez, a man on a mission to destroy the general's ambitions by any means necessary. With more than 400 square miles of complete freedom from sky to seabed, and a huge arsenal of weaponry, gadgets and vehicles, prepare to unleash chaos in the most creative and explosive ways you can imagine.", 59.99));
item_list.push(new Item('videogames', 'Call of Duty Black Ops III', 'Call of Duty: black Ops III is the ultimate 3-games-in-1 experience. The Campaign you must navigate the hot spots of a new Cold War to find your missing brothers. Multiplayer features a new momentum-based chained movement system, allowing players to fluidly move through the environment with finesse. No Treyarch title would be complete without its signature Zombies offering "Shadows of Evil" has its own distinct storyline right out of the box.', 59.99));
item_list.push(new Item('videogames', 'Fallout 4', 'The epic storylines, adrenaline-pumping action and explosive thrills are back. The Fallout franchise returns with Fallout 4. Grab your controller and get ready to dive back into  the enveloping storyline of this legendary series.', 59.99));
item_list.push(new Item('videogames', 'Halo 5: Guardians', 'A mysterious and unstoppable force threatens the galaxy, the Master Chief is missing and his loyalty questioned. Experience the most dramatic Halo story to date in a 4-player cooperative epic that spans three worlds. Challenge friends and rivals  in new multiplayer modes: Warzone, massive 24-player battles, and Arena, pure    4-vs-4 competitive combat.*', 59.99));
 item_list.push(new Item('videogames', "Assassin's Creed Syndicate", "WELCOME TO  THE FAMILY — London, 1868. The Industrial Revolution fattens the purses of the privileged while the working class struggles to survive — until two Assassins  rise to lead the world's first organized crime family. Conquer the streets of   London. Bring the ruling class to their knees. Make history in a visceral    adventure unlike any game you've played before.", 59.99));


// display item list
 displayAll();

 //When a new category is chosen it will correct and display items of that     category type
 $('#category').on('change', function(){
  // read the selected category using 'value' attribute
  var category = $(this).val();
  if (category == '0')
    displayAll(); // display all items
  else
   displaySelectedItems(category); // display selected items

 });

 //When category is chosen, items with the same type will be displayed
 function displaySelectedItems(category){
  var itemInfo = '';
   /* display data: 
  use a for loop to go through each element in the item_list array 
 */
  for (var i=0; i<item_list.length; i++){

    // display only selected items
    if (item_list[i].type == category){
      itemInfo += createItemData(item_list[i], i); 
    }
    // add each item to the table
     $('#item-list').html(itemInfo);
  }
 }

 //Displays the item list
  function displayAll(){ 
   var itemInfo = '';
   /* display data: 
  use a for loop to go through each element in the item_list array 
   Each element is an object.  
 */
  for (var i=0; i<item_list.length; i++){

  // use each item to create HTML content
  itemInfo += createItemData(item_list[i], i); 

  // add each item to the table
  $('#item-list').html(itemInfo); 
}
}

//Creates the item's data
function createItemData(item, index){

  var trow = "<tr class='itemlist  data-index='" +index+ "' >";
      trow +=  "<td class=item-title'>"+item.title + "</td>";
      trow += "<td class='item-description'>"+item.description + "</td>";
      trow += "<td class='price'>$"+item.price + "</td>";
      trow += "<td class='adding'><button type='button' class='addme' data-index='"+index+"'>Add</td></tr>";
  return trow;
}

//Activates "Add" button so cart can be populated
$('#item-list').on('click', '.addme', function(){ 

// 1. Read the item index using data- attribute
var index = $(this).data('index');

if(!inCart(index)){
  cart.push({"index": index, "qty": 1});
} 

// 3. Update the cart list and total credits
displayCartItems();
checkCart();

// update price
calculateTotalPrice();
});

//function to check if items are in cart
function inCart(index){
for (var i=0; i<cart.length; i++){
if (cart[i].index == index)
  return true;
}
return false;
}

//Displays the shopping cart items
function displayCartItems(){
// create a table row for each item in cart array
var itemInfo = '';
for (var i=0; i<cart.length; i++){
  var index = cart[i].index;
  itemInfo += createTableRow(index);
}
$('#selected-list').html(itemInfo);
for (var i=0; i<cart.length; i++){
  var index = cart[i].index;
  var qty = cart[i].qty;
  $("select#quantity_"+index).val(qty);
  }
}

//Constructs the shopping cart table
function createTableRow(index){
  var trow = '';

  trow += "<tr><td>"+item_list[index].title + "</td>>";
  trow += "<td id='itemsprice'>"+item_list[index].price + "</td>";
  trow += "<td><select id='quantity_"+index+"' class='item-quantity' data-quantity='"+index+"'><option value='1'>1</option><option value='2'>2</option><option value='3'>3</option><option value='4'>4</option><option value='5'>5</option><option value='6'>6</option><option value='7'>7</option><option value='8'>8</option><option value='9'>9</option><option value='10'>10</option></td>";
  trow += "<td id='tc-item'>"+item_list[index].price+"</td>"
  trow += "<td><button type='button' class='delete-item' value='"+index+"'>Delete</button></td></tr>";
  return trow;
}

//When quantity is changed change the value and compute new totals
$('#selected-list').on('change', '.item-quantity', function(){
	var index = $(this).data("quantity");
	for (var i=0; i<cart.length; i++){
		if (index == cart[i].index){
			cart[i].qty = parseInt($(this).val(),10);
		}
	}
  calculateTotalPrice();

});


//If delete button is pressed in cart, the item is removed from the cart
$('#selected-list').on('click', '.delete-item', function(){
var index = $(this).val();

removeItemFromCart(index);
calculateTotalPrice();
checkCart();

});

function checkCart(){
 if(cart.length == 0){
  $('#empty-cart').html("Your cart is empty!");
} else {
  $('#empty-cart').html("");
}
}

//function to remove items from the shopping cart
function removeItemFromCart(index){
// identify and remove the index from the cart and redisplay cart table
var pos = -1;
for (var i=0; i<cart.length; i++){
  if (index == cart[i].index){
    pos = i;
    break;
  }
  }
if (pos>-1){
  cart.splice(pos, 1);
  // reset the cart table
  displayCartItems();
} else {
  alert("Could not find!");
}
}

function calculateTotalPrice(){

var subtotal = 0;
var tax = 0;
var shipping = 0;
var total = 0;

//for loop to calculate the subtotal
for(var i = 0; i < cart.length; i++){
  var productPrice = item_list[cart[i].index].price;
  var quantity = cart[i].qty;
  subtotal += productPrice * quantity; 
  }

//Percent taxed is 6%
var taxPerc = .06;

//Calculating taxes
tax = subtotal * taxPerc;

//Percent for shipping is 2%
var shippingPerc = .02;

//Calculating shipping
shipping = subtotal * shippingPerc;

//Calculating total
total = subtotal + tax + shipping;

//Displaying totals
//$('#tc-item').html(totalItemPrice.toFixed(2));
$('#subtotal').html(subtotal.toFixed(2));
$('#tax').html(tax.toFixed(2));
$('#shipping').html(shipping.toFixed(2));
$('#total').html(total.toFixed(2));
}

//Activates the Display cart and Hide cart buttons in shopping cart
$('#show-cart').on('click', function(){
$('#selected-list').show();
});
$('#hide-cart').on('click', function(){
$('#selected-list').hide();
    });

    });
</script>
</head>
<body>
<div class='container'>
  <div class='row' id='top-box' >
  <div class='col-sm-12'>
    <h2>Sam's Discount Store</h2>
    <h3>Variety of Items!</h3>
  </div>
  </div>

  <div class='row' id='content'>
  <div class='col-sm-8'>
    <h3 class='title'>Discounted Items</h3>
    <h4>
      <select id='category'>
      <option value='0' >All</option>
      <option value='baseballgear' >Baseball Items</option>
      <option value='soccergear' >Soccer Items</option>
      <option value='videogames'>Video Games</option>
     </select>
    </h4>
    <table class='table table-bordered clmlabels' >
        <tr class='t-head'><td >Product</td>
          <td >Description</td>
          <td >Cost</td>
        </tr>
      <tbody id='item-list'>
      </tbody>


    </table>
  </div>
  <div class='col-sm-4'>
    <h2>Cart Items</h2>

 <p><button class='btn btn-primary' id='show-cart'>Display cart</button>
   <button class='btn' id='hide-cart'>Hide cart</button></p>
    <table class='table selected-list' id='selected-list'>
   </table>
  </div>
  <table class='cart-table'>
    <tr>
      <td id='empty-cart'></td>
    <tr>
     <td>Subtotal:  </td>
      <td><span id='subtotal'>0</td>
    </tr>
    <tr>
      <td>Tax:  </td>
      <td><span id='tax'>0</td>
    </tr>
    <tr>
      <td>Shipping:  </td>
     <td><span id='shipping'>0</td>
    </tr>
     <tr>
      <td>Total:  </td>
      <td><span id='total'>0</td>
    </tr>
  </table>

</div>
   </div>
   <div class='row' id='footer'
   <div class='col-sm-12'> <p>Sam's Discount Store</p></div>
   </div>
</div>
</body>
</html>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

购物车难度中的选定列表动态计算

来自分类Dev

AngularJS中的购物车计算

来自分类Dev

如何计算购物车中商品的动态价格并输出总价

来自分类Dev

Magento-动态更改购物车中的折扣成本

来自分类Dev

Magento-动态更改购物车中的折扣成本

来自分类Dev

购物车中的会话

来自分类Dev

使用jQuery计算购物车总计

来自分类Dev

购物车 PLUS & MINUS 计算总数

来自分类Dev

如何根据用户输入菜单计算购物车到字典列表的总和?

来自分类Dev

Laravel中的购物车ORM支票

来自分类Dev

OpenCart从购物车中删除选项

来自分类Dev

JavaEE中的购物车困境

来自分类Dev

检查项目在购物车中

来自分类Dev

购物车中的Rails:ActiveRecord :: RecordNotFound

来自分类Dev

购物车验证中的最大物品

来自分类Dev

购物车中的下拉数量菜单

来自分类Dev

如何显示购物车中的产品?

来自分类Dev

在phpmailer中列出购物车

来自分类Dev

在购物车中获取产品尺寸

来自分类Dev

在Woocommerce中删除购物车小计

来自分类Dev

在购物车中添加İtems

来自分类Dev

Laravel中的购物车ORM支票

来自分类Dev

OpenCart从购物车中删除选项

来自分类Dev

Magento:购物车中的问题

来自分类Dev

打开购物车中的用户权限

来自分类Dev

如何禁用woocommerce中的购物车?

来自分类Dev

不从购物车中移除物品

来自分类Dev

Laravel中的购物车更新

来自分类Dev

购物车中的Woocommerce风格产品