根据用户选择显示表格

时间:2019-12-08 22:06:57

标签: javascript drop-down-menu

我想在下拉列表中显示与用户选择相对应的汽车列表。假设,如果他们选择SUV,那么SUV汽车表就会出现。不知何故,我的代码似乎无法正常工作。当我全部选择时,就可以了-除此之外,它什么也没显示。

我做错了什么?我怀疑调用displayListing时在事件处理程序中出错了。

//step-1: add jQuery ready method to hold entire js code in this script 
$(document).ready(function(){

// Define a car object using a constructor function
function Car(id, car_make, car_model, car_year, car_type, car_color, car_price, car_mileage) {
	this.stockid = id;
	this.make = car_make;
	this.model = car_model;
	this.year = car_year;
	this.type = car_type;
	this.color = car_color;
	this.price = car_price;
	this.mileage = car_mileage;
	this.qty = 0; 
	this.display = function(){
		var this_str = "<td>" + this.stockid + "</td><td>" + this.make + "</td>";
		this_str += "<td>" + this.model + "</td><td>" + this.year + "</td><td>" + this.type + "</td>";
		this_str += "<td>" + this.color + "</td><td>$" + this.price + "</td>";
		this_str += "<td>" + this.mileage + "</td>";
		
		return this_str;
	}
}

// Declare an array of objects
var car_list = [];  // var car_list = new Array();

// Create an instance of the Car object and add it to the car_list array
car_list.push(new Car(1001, "Toyota", "Camry", 2011, "Sedan", "Gray", 17555, 55060));
car_list.push(new Car(1002, "Volvo", "s40", 2013, "Sedan", "Black", 15575, 20350));
car_list.push(new Car(1251, "Toyota", "Sienna", 2008, "Minivan", "Gray", 15775, 70000));
car_list.push(new Car(1321, "Porsche", "Panamera", 2012, "SUV", "Red", 104250, 10567));
car_list.push(new Car(1904, "Honda", "Accord", 2009, "Sedan", "White", 13370, 35000));
car_list.push(new Car(1855, "Toyota", "Highlander", 2008, "SUV", "Silver", 18555, 55060));
car_list.push(new Car(1543, "Ford", "Fusion", 2011, "Sedan", "Black", 13575, 90350));
car_list.push(new Car(1345, "Toyota", "Sienna", 2011, "Minivan", "Gray", 25775, 70000));
car_list.push(new Car(2133, "Dodge", "Caravan", 2012, "Minivan", "Red", 30250, 17567));
car_list.push(new Car(2999, "Lexus", "LFA", 2012, "coupe", "Red", 381370, 3500));
car_list.push(new Car(3001, "Ferrari", "Rubino", 2012, "coupe", "Red", 354370, 5500));
car_list.push(new Car(4002, "Audi", "R8", 2012, "SUV", "Black", 181370, 4500));


//Step-2 (a): call displayDropdown() function to set up the drop down selection list
displayDropdown();

//Step-2 (d): use jQuery event method .on() to add an event handler to the drop down list
//so that when users change selection option based on car type, 
//then only that type of cars will be displayed in the car list table in the web page.
$('#car-category').on('change', function(){
	var cat = $(this).val();
	console.log(cat);
	displayListing(cat);
} );


/*****************************/
/* displayDropdown()         */
/*****************************/ 
function displayDropdown(){
	var currentCat = 'select';
	var output = "<option value=\'"+ currentCat + "\'>Select a category to display</option>";
	var addedCats = [];

//Step-3 (a): add script code here to add options to the drop down list
	for(var i = 0; i < car_list.length; i++) {
		currentCat = car_list[i].type;
		//check whether the car's type has been included in the drop down list, if not, then add that category to the list
		//Array.indexOf(currentItem) is used to check whether currentItem is in the array, if not, then -1 will be returned.
		if (addedCats.indexOf(currentCat)==-1) { //did not find currentCat in addedCats array
			addedCats.push(currentCat); //add currentCat to addedCats array, and then create
			//an <option> element for that category
			output += "<option value='" + currentCat + "'  class='cat-select'>" + currentCat + "</option>";
//console.log("added " + currentCat);
		} 
//console.log(addedCats);
	} // end for loop
	//add one more category as an <option> element which is used to display all products	
	currentCat = "All";
	output += "<option value='" + currentCat + "'  class='cat-select'>" + currentCat + "</option>";
// output is a string used to hold all new <option> elements	
	$('#car-category').html(output);

 }
 
/*****************************/
/* displayListing()          */
/*****************************/  
 function displayListing(cat){
	//Step-2 (b): Add jQuery code in this function to remove class "hide" from car list table.  
	$('#car-list').removeClass('hide');
	var displayAll = false;
	if (cat == "All") {
		displayAll = true;
	} 
	if (cat == "select") {
	  $('#car-list tbody').html("");
	}
	var body="";
	
   //add table body	
   //step-2 (c):add js code to complete the for loop and if statement  to display car list in the web page according to 
   //users’ selection on car type
   for(var i = 0; i < car_list.length; i++) {
		if(car_list[i].category == cat || displayAll == true) {
			console.log("add table list: " + cat);
			body += "<tr class='car-item' id='l-"+ i + "'>";		
			body += car_list[i].display();
			body += "<td><button type='button' value='" + 
			i + "' class='btn btn-primary add-item'>Add</button></td>";		
			body += "</tr>";
		}
	}
	$('#car-list tbody').html(body);
 }

//define an array (global variable) to store indices of the items added to the shopping cart*/
 var cart = [];
 

//Step-3 (a): Apply jQuery event delegation technique to add event handler so that when users click Add buttons, 
//the selected cars will be added to the shopping cart without any duplication, 
//the selected cars’ information including stockid, make, model, price, quantity and type will be displayed 
//in the shopping cart list on the web page, the number of items in the shopping cart as well as the Checkout 
//invoice information including subtotal, tax, registration fee, and total amount will be updated.
 $('#car_list').on('click', '.add-item', function(){
							var index = $(this).val(); 
							if (cart.indexOf(index)== -1)
							{  cart.push(index); 
//console.log("Cart array is currently: " + cart);
							}
							addQty(index); 
							updateShoppingCart();} );
/****************/
/* addQty()     */
/****************/
function addQty(index) {
	car_list[index].qty++;
}


/*****************************/
/* updateShoppingCart()      */
/*****************************/
 function updateShoppingCart(){
//step 3(b): Add jQuery code in this function to remove class "hide" from shopping cart table, 
//and also from check out table. 
    $('#cart table').removeClass('hide');
	$('#checkout table').removeClass('hide');
 
//console.log("Cart array is currently: " + cart);
	//display shopping cart	
	displayCartItems();

	// update total items
	updateItemTotal();

	//Update final checkout data
	calculateCheckoutCost();

 }
 
 /**************************/
/* displayCartItems()     */
/**************************/
function displayCartItems(){
	/* use this method to display items in the shopping cart.
	This method should  redisplay the 'shopping cart'
	table when we add or delete items.*/
	// add each product to shopping cart
	var runError = true;
	var elm='';
	for (var i=0; i<cart.length; i++){
			//create a table row and add stockId, make, cost, quantity, and type info of the selected cars to the cart table
			elm += "<tr><td class=\'col-xs-1\'>"+ car_list[cart[i]].stockid + "</td>";
			elm += "<td class=\'col-xs-1\'>"+ car_list[cart[i]].make + "</td>";
			elm += "<td class=\'col-xs-1\'>"+ car_list[cart[i]].model + "</td>";
			elm += "<td class=\'col-xs-1\'>"+ car_list[cart[i]].price + "</td>";
			elm += "<td class=\'col-xs-1\'><input  type=\'text\' id=\'" + cart[i] + "\' name=\'qty-" + i +
			"\' size=\'1\' value=\'"+ car_list[cart[i]].qty + "\'></td>";
			elm += "<td class=\'col-xs-1\'>"+ car_list[cart[i]].type + "</td>";
			elm += "<td class=\'col-xs-1\'><button type=\'button\' value=\'" + i + "\' class=\'delete-item\'>Delete</button></td></tr>";
			runError = false; // = cart is not empty
	}
	if (runError) { //if cart is empty
		elm += "Your cart is empty.";
	}
	//step 3(d): add a jQuery selector 
//console.log(elm);	
	$('#mycart tbody').html(elm); // modify the table
}


/*****************************/
/* updateItemTotal()         */
/*****************************/
 function updateItemTotal(){
	// update the total items
	var total = cart.length;
	$('#items').text(total);
 } 

/*******************************/
/* calculateCheckoutCost()     */
/*******************************/
function calculateCheckoutCost(){

	//Display total number of cars in the cart 
	var taxRate = 0.06;
	var feeRate = 0.05;
	var subtotal = 0;
	var tax = 0;
	var fee = 0;
	var total = 0;
	
	//Calculate subtotal 
	var subtotal = 0;
	//step 6: add js code here to calculat subtotal, tax, fee, and total amount
	//display those information to web page by using jQuery selector, jQuery .text() method.
	 
}
//Step-4: Apply jQuery event delegation technique to add event handler so that when users click Delete buttons 
//the selected cars will be removed from the shopping cart and removed from the shopping cart list in the web page as well. 
//Meanwhile, the number of items in the shopping cart as well as the Checkout invoice information including subtotal, tax, 
//registration fee, and total amount will be updated.





/*****************************/
/* deleteItemFromCart()      */
/*****************************/
 function deleteItemFromCart(index){
	/*  remove the element with a given index from the cart array and update shopping cart
	 use splice() method, Syntax: array_name.splice(start, how many elements)
	The splice() method removes elements starting from 'start' positions. The second arguments defines the number of elements to be removed.
	*/
   //step 3(f): add script to update the ordering quantity of selected car and use splice method to 
   //remove that selected car from the shopping cart.
    car_list[cart[index]].qty = 0;
	cart.splice(index, 1);
}

//Step-5: Apply jQuery event delegation technique to add event handler so that when users change the ordering 
//quantities of selected cars in the shopping list in the web page, 
//the ordering quantities of selected cars the Checkout invoice information including subtotal, tax, registration fee,
// and total amount will be updated. 





/*****************************/
/* updateCartItemQty()       */
/*****************************/
 function updateCartItemQty(input) {
	var value = 0;
	value = parseInt($("#" + input.id).val());

	var index = parseInt(input.id); 
	car_list[index].qty = value;
	
 }

 


 
});
<!doctype html>
<html>
<head>
	<meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Auto Shop - Used Cars</title>
    <!--Include bootstrap CSS -->
    <link rel="stylesheet" href="http://netdna.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
	
	<!-- Include JQuery library -->	
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
	 
	<!-- Include external js file (JQuery_auto_shop.js) here -->
<script src="JQuery_auto_shop.js"></script>

	<style>
		 td{ padding: 5px; margin: 5px;}
		.addme { height: 28px; width: 80px; padding: 0; }
		.clm-label { background: #333; color: #fff;}
		.hide {display: none}	
	</style>
	
</head>
<body class='container'>
	<div class='col-md-9' >
    <h2>Choose a car type </h2> <!--drop down list -->
	<select id="car-category" name="car-category">
		<option value='null'>Loading....</option>
	</select>
	</div>
	<div class='col-md-9'>
	   <h2>Car List</h2> <!-- car list -->
		<table class='table hide' id='car-list'>
		<thead><!--car list table header -->
		<tr class='clm-label'> 
		   <th class='clm-label'>Stock ID</th>
		   <th class='clm-label'>Make</th>
		   <th class='clm-label'>Model</th>
		   <th class='clm-label'>Year</th>
		   <th class='clm-label'>Type</th>
		   <th class='clm-label'>Color</th>
		   <th class='clm-label'>Price</th>
		   <th class='clm-label'>Mileage</th>
		   <th class='clm-label'>Select</th>
		 </tr>  
		 </thead>
		 <tbody id='car-list'><!--car list table body -->
		 </tbody>
		</table>
	</div>
	<div class='col-md-3' id="cart">
		<h2>Shopping Cart</h2>
		<div>You have <span id="items">0</span>  items in your Shopping Cart</div>
		<table class='table hide' id='mycart'><!--Shopping Cart list table -->
		<thead><!--table header -->
			<tr>
				<th class='clm-label'>Stock Id</th>
				<th class='clm-label'>Make</th>
				<th class='clm-label'>Model</th>
				<th class='clm-label'>Price</th>
				<th class='clm-label'>Quantity</th>
				<th class='clm-label'>Type</th>
				<th class='clm-label'></th>
			</tr>
		</thead>
		<tbody><!--table body -->
		</tbody>
		</table>
	</div>
</div>

<div class='col-md-9' id="checkout">
    <h2>Check Out</h2>
	<table class='table hide' ><!--Check Out table -->
		<tr><th class='col-xs-4'>Subtotal: </th><td class='col-xs-2' id='sub-total'>0</td></tr>
		<tr><th class='col-xs-4'>Taxes (6%): </th><td class='col-xs-2' id='taxes'>0</td></tr>
		<tr><th class='col-xs-4'>Registration fee (5%): </th><td class='col-xs-2' id='registration'>0</td></tr>
		<tr><th class='col-xs-4'>Total due: </th><td class='col-xs-2' id='total'>0</td></tr>
	</table>
</div>

</body>
</html>

1 个答案:

答案 0 :(得分:1)

问题是您在displayListing()函数中使用了错误的属性。

此行:

.observe()

您在使用car_list [i] .category时应使用car_list [i] .type。

Car对象没有名为category的属性。您应该将行更改为如下所示:

if(car_list[i].category == cat || displayAll == true) {

这是完整的代码段:

if(car_list[i].type == cat || displayAll == true) {
//step-1: add jQuery ready method to hold entire js code in this script 
$(document).ready(function(){

// Define a car object using a constructor function
function Car(id, car_make, car_model, car_year, car_type, car_color, car_price, car_mileage) {
	this.stockid = id;
	this.make = car_make;
	this.model = car_model;
	this.year = car_year;
	this.type = car_type;
	this.color = car_color;
	this.price = car_price;
	this.mileage = car_mileage;
	this.qty = 0; 
	this.display = function(){
		var this_str = "<td>" + this.stockid + "</td><td>" + this.make + "</td>";
		this_str += "<td>" + this.model + "</td><td>" + this.year + "</td><td>" + this.type + "</td>";
		this_str += "<td>" + this.color + "</td><td>$" + this.price + "</td>";
		this_str += "<td>" + this.mileage + "</td>";
		
		return this_str;
	}
}

// Declare an array of objects
var car_list = [];  // var car_list = new Array();

// Create an instance of the Car object and add it to the car_list array
car_list.push(new Car(1001, "Toyota", "Camry", 2011, "Sedan", "Gray", 17555, 55060));
car_list.push(new Car(1002, "Volvo", "s40", 2013, "Sedan", "Black", 15575, 20350));
car_list.push(new Car(1251, "Toyota", "Sienna", 2008, "Minivan", "Gray", 15775, 70000));
car_list.push(new Car(1321, "Porsche", "Panamera", 2012, "SUV", "Red", 104250, 10567));
car_list.push(new Car(1904, "Honda", "Accord", 2009, "Sedan", "White", 13370, 35000));
car_list.push(new Car(1855, "Toyota", "Highlander", 2008, "SUV", "Silver", 18555, 55060));
car_list.push(new Car(1543, "Ford", "Fusion", 2011, "Sedan", "Black", 13575, 90350));
car_list.push(new Car(1345, "Toyota", "Sienna", 2011, "Minivan", "Gray", 25775, 70000));
car_list.push(new Car(2133, "Dodge", "Caravan", 2012, "Minivan", "Red", 30250, 17567));
car_list.push(new Car(2999, "Lexus", "LFA", 2012, "coupe", "Red", 381370, 3500));
car_list.push(new Car(3001, "Ferrari", "Rubino", 2012, "coupe", "Red", 354370, 5500));
car_list.push(new Car(4002, "Audi", "R8", 2012, "SUV", "Black", 181370, 4500));


//Step-2 (a): call displayDropdown() function to set up the drop down selection list
displayDropdown();

//Step-2 (d): use jQuery event method .on() to add an event handler to the drop down list
//so that when users change selection option based on car type, 
//then only that type of cars will be displayed in the car list table in the web page.
$('#car-category').on('change', function(){
	var cat = $(this).val();
	console.log(cat);
	displayListing(cat);
} );


/*****************************/
/* displayDropdown()         */
/*****************************/ 
function displayDropdown(){
	var currentCat = 'select';
	var output = "<option value=\'"+ currentCat + "\'>Select a category to display</option>";
	var addedCats = [];

//Step-3 (a): add script code here to add options to the drop down list
	for(var i = 0; i < car_list.length; i++) {
		currentCat = car_list[i].type;
		//check whether the car's type has been included in the drop down list, if not, then add that category to the list
		//Array.indexOf(currentItem) is used to check whether currentItem is in the array, if not, then -1 will be returned.
		if (addedCats.indexOf(currentCat)==-1) { //did not find currentCat in addedCats array
			addedCats.push(currentCat); //add currentCat to addedCats array, and then create
			//an <option> element for that category
			output += "<option value='" + currentCat + "'  class='cat-select'>" + currentCat + "</option>";
//console.log("added " + currentCat);
		} 
//console.log(addedCats);
	} // end for loop
	//add one more category as an <option> element which is used to display all products	
	currentCat = "All";
	output += "<option value='" + currentCat + "'  class='cat-select'>" + currentCat + "</option>";
// output is a string used to hold all new <option> elements	
	$('#car-category').html(output);

 }
 
/*****************************/
/* displayListing()          */
/*****************************/  
 function displayListing(cat){
	//Step-2 (b): Add jQuery code in this function to remove class "hide" from car list table.  
	$('#car-list').removeClass('hide');
	var displayAll = false;
	if (cat == "All") {
		displayAll = true;
	} 
	if (cat == "select") {
	  $('#car-list tbody').html("");
	}
	var body="";
	
   //add table body	
   //step-2 (c):add js code to complete the for loop and if statement  to display car list in the web page according to 
   //users’ selection on car type
   for(var i = 0; i < car_list.length; i++) {
   //cahnge this to type instead of category
		if(car_list[i].type == cat || displayAll == true) {
			console.log("add table list: " + cat);
			body += "<tr class='car-item' id='l-"+ i + "'>";		
			body += car_list[i].display();
			body += "<td><button type='button' value='" + 
			i + "' class='btn btn-primary add-item'>Add</button></td>";		
			body += "</tr>";
		}
	}
	$('#car-list tbody').html(body);
 }

//define an array (global variable) to store indices of the items added to the shopping cart*/
 var cart = [];
 

//Step-3 (a): Apply jQuery event delegation technique to add event handler so that when users click Add buttons, 
//the selected cars will be added to the shopping cart without any duplication, 
//the selected cars’ information including stockid, make, model, price, quantity and type will be displayed 
//in the shopping cart list on the web page, the number of items in the shopping cart as well as the Checkout 
//invoice information including subtotal, tax, registration fee, and total amount will be updated.
 $('#car_list').on('click', '.add-item', function(){
							var index = $(this).val(); 
							if (cart.indexOf(index)== -1)
							{  cart.push(index); 
//console.log("Cart array is currently: " + cart);
							}
							addQty(index); 
							updateShoppingCart();} );
/****************/
/* addQty()     */
/****************/
function addQty(index) {
	car_list[index].qty++;
}


/*****************************/
/* updateShoppingCart()      */
/*****************************/
 function updateShoppingCart(){
//step 3(b): Add jQuery code in this function to remove class "hide" from shopping cart table, 
//and also from check out table. 
    $('#cart table').removeClass('hide');
	$('#checkout table').removeClass('hide');
 
//console.log("Cart array is currently: " + cart);
	//display shopping cart	
	displayCartItems();

	// update total items
	updateItemTotal();

	//Update final checkout data
	calculateCheckoutCost();

 }
 
 /**************************/
/* displayCartItems()     */
/**************************/
function displayCartItems(){
	/* use this method to display items in the shopping cart.
	This method should  redisplay the 'shopping cart'
	table when we add or delete items.*/
	// add each product to shopping cart
	var runError = true;
	var elm='';
	for (var i=0; i<cart.length; i++){
			//create a table row and add stockId, make, cost, quantity, and type info of the selected cars to the cart table
			elm += "<tr><td class=\'col-xs-1\'>"+ car_list[cart[i]].stockid + "</td>";
			elm += "<td class=\'col-xs-1\'>"+ car_list[cart[i]].make + "</td>";
			elm += "<td class=\'col-xs-1\'>"+ car_list[cart[i]].model + "</td>";
			elm += "<td class=\'col-xs-1\'>"+ car_list[cart[i]].price + "</td>";
			elm += "<td class=\'col-xs-1\'><input  type=\'text\' id=\'" + cart[i] + "\' name=\'qty-" + i +
			"\' size=\'1\' value=\'"+ car_list[cart[i]].qty + "\'></td>";
			elm += "<td class=\'col-xs-1\'>"+ car_list[cart[i]].type + "</td>";
			elm += "<td class=\'col-xs-1\'><button type=\'button\' value=\'" + i + "\' class=\'delete-item\'>Delete</button></td></tr>";
			runError = false; // = cart is not empty
	}
	if (runError) { //if cart is empty
		elm += "Your cart is empty.";
	}
	//step 3(d): add a jQuery selector 
//console.log(elm);	
	$('#mycart tbody').html(elm); // modify the table
}


/*****************************/
/* updateItemTotal()         */
/*****************************/
 function updateItemTotal(){
	// update the total items
	var total = cart.length;
	$('#items').text(total);
 } 

/*******************************/
/* calculateCheckoutCost()     */
/*******************************/
function calculateCheckoutCost(){

	//Display total number of cars in the cart 
	var taxRate = 0.06;
	var feeRate = 0.05;
	var subtotal = 0;
	var tax = 0;
	var fee = 0;
	var total = 0;
	
	//Calculate subtotal 
	var subtotal = 0;
	//step 6: add js code here to calculat subtotal, tax, fee, and total amount
	//display those information to web page by using jQuery selector, jQuery .text() method.
	 
}
//Step-4: Apply jQuery event delegation technique to add event handler so that when users click Delete buttons 
//the selected cars will be removed from the shopping cart and removed from the shopping cart list in the web page as well. 
//Meanwhile, the number of items in the shopping cart as well as the Checkout invoice information including subtotal, tax, 
//registration fee, and total amount will be updated.





/*****************************/
/* deleteItemFromCart()      */
/*****************************/
 function deleteItemFromCart(index){
	/*  remove the element with a given index from the cart array and update shopping cart
	 use splice() method, Syntax: array_name.splice(start, how many elements)
	The splice() method removes elements starting from 'start' positions. The second arguments defines the number of elements to be removed.
	*/
   //step 3(f): add script to update the ordering quantity of selected car and use splice method to 
   //remove that selected car from the shopping cart.
    car_list[cart[index]].qty = 0;
	cart.splice(index, 1);
}

//Step-5: Apply jQuery event delegation technique to add event handler so that when users change the ordering 
//quantities of selected cars in the shopping list in the web page, 
//the ordering quantities of selected cars the Checkout invoice information including subtotal, tax, registration fee,
// and total amount will be updated. 





/*****************************/
/* updateCartItemQty()       */
/*****************************/
 function updateCartItemQty(input) {
	var value = 0;
	value = parseInt($("#" + input.id).val());

	var index = parseInt(input.id); 
	car_list[index].qty = value;
	
 }

 


 
});