#javascript #arrays #constructor
Вопрос:
Я пытаюсь связать выбранные параметры в раскрывающемся списке в форме в html с объектами, созданными с помощью конструктора классов в JS. Я изо всех сил пытаюсь связать их, и мне удается отобразить только некоторые имена, и все в одной строке таблицы html.
В идеале я хотел бы связать элементы в моей функции display() и отображать значения из моих объектов, а не использовать значения непосредственно из формы.
Это мой полный код:
/* See/add options, remove options,
see overview of options and price
*/
// VARIABLES
let button = document.getElementById("submit");
let choice = document.getElementById("choice");
let optionChosen = document.getElementById("option");
let optionPrice = document.getElementById("optionPrice");
// OPTIONS CLASS CONSTRUCTOR
class CarOptions {
constructor(optionName, price) {
this.optionName = optionName;
this.price = price;
}
}
// create 6 options
let option = new CarOptions("", 0);
let vac = new CarOptions("vac", 150);
let trunk = new CarOptions("trunk", 2000);
let seat = new CarOptions("seat", 550);
let night = new CarOptions("night", 360);
let wifi = new CarOptions("wifi", 1200);
let park = new CarOptions("park", 600);
// Array of all objects
let allOptions = [option, vac, trunk, seat, night, wifi, park];
// Array of all object names
let allOptionsName = [option.optionName, vac.optionName, trunk.optionName, seat.optionName, night.optionName, wifi.optionName, park.optionName];
// EVENTS
// On submit event
button.addEventListener("click", (e) => {
e.preventDefault();
const selected = document.querySelectorAll('#choice option:checked');
// Displaying options names in the table
// CURRENTLY ALL DISPLAYS IN ONE ROW
allOptionsName.forEach(function () {
for (let i = 0; i < allOptionsName.length; i ) {
const values = Array.from(selected).map(el => el.value);
optionChosen.innerHTML = values;
console.log(values);
console.log("this value: " values);
display();
}
});
})
function display(element) {
if (values.value != "") {
optionChosen.innerHTML = element.optionName;
optionPrice.innerHTML = element.price;
}
return;
}
body {
background-color: black;
color: white;
font-family:'Lucida Sans', 'Lucida Sans Regular', 'Lucida Grande', 'Lucida Sans Unicode', Geneva, Verdana, sans-serif
}
#form {
display: flex;
flex-direction: column;
width: 250px;
align-items: center;
}
#choice {
height: 120px;
}
.results {
width: 300px;
border: 2px dotted green;
margin: 10px;
text-align: center;
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="style.css">
<title>Car Selection</title>
</head>
<body>
<h1>Car Choice</h1>
<h2>Ready to buy your dream car?</h2>
<div class="select">
<!-- Selection of food or drink -->
<form class="flexColumn" id="form">
<select name="choice" id="choice" multiple="true">
<option value="" name="">--Please choose an option--</option>
<option id="vac" value="vac" name="vac">Built-in Vacuum (€150)</option>
<option value="trunk" name="trunk">Automatic Opening Trunk (€2000)</option>
<option value="seat" name="seat">Massaging Seats (€550)</option>
<option value="night" name="night">Nightvision Dashboard System (€360)</option>
<option value="wifi" name="wifi">WiFi/Entertainment/Navigation (€1200)</option>
<option value="park" name="park">Self-Parking System (€600)</option>
</select>
<button id="submit" class="submit" submit>SUBMIT</button>
</form>
<p>Your current selected options:</p>
<div id="selection" class="selection">
<table class="results" style="width:200px">
<tr>
<th>Option</th>
<th>Price (€)</th>
</tr>
<tr id="emptyRow">
<td id="option"></td>
<td id="optionPrice"></td>
</tr>
<tr>
<td>TOTAL:</td>
<td id="totalPrice"></td>
</tr>
</table>
</div>
</div>
<script type="text/javascript" src="script.js"></script>
</body>
</html>
Комментарии:
1. Вы ожидаете аргумента,
function display(element)
но когда вы вызываете его в прослушивателе событий «щелчок», вы не предоставили никаких аргументов. Также вы пытаетесь получить доступ к «значениям» вdisplay
функции, которая не определена вdisplay
, но вclick
функции. Что вы пытаетесь передатьdisplay
функции? Сначала исправьте эти проблемы, отредактируйте свой код и опубликуйте правильный.
Ответ №1:
Попробуйте, как в следующем фрагменте:
/* See/add options, remove options,
see overview of options and price
*/
// VARIABLES
let button = document.querySelector("#submit");
let choice = document.querySelector("#choice");
// OPTIONS CLASS CONSTRUCTOR
class CarOptions {
constructor(optionName, price) {
this.optionName = optionName;
this.price = price;
}
}
// create 6 options
let option = new CarOptions("", 0);
let vac = new CarOptions("vac", 150);
let trunk = new CarOptions("trunk", 2000);
let seat = new CarOptions("seat", 550);
let night = new CarOptions("night", 360);
let wifi = new CarOptions("wifi", 1200);
let park = new CarOptions("park", 600);
// Array of all objects
let allOptions = [option, vac, trunk, seat, night, wifi, park];
// Array of all object names
let allOptionsName = [option.optionName, vac.optionName, trunk.optionName, seat.optionName, night.optionName, wifi.optionName, park.optionName];
// EVENTS
// On submit event
button.addEventListener("click", (e) => {
e.preventDefault();
const selected = document.querySelectorAll('#choice option:checked');
const values = Array.from(selected).map(el => el.value);
const res = allOptions.filter(a => values.includes(a.optionName))
const total = res.reduce((acc, v) => acc = v.price, 0 )
display(res, total);
})
function createTr() {
let tbodyRef = document.querySelectorAll("#cars");
let newRow = tbodyRef[0].insertRow();
return newRow
}
function createTd(el, newTr) {
let newel = document.createElement('td');
let elementid = document.querySelectorAll("td").length
newel.setAttribute('id',elementid);
newel.innerHTML = el
newTr.appendChild(newel);
}
function display(element, total) {
element.forEach(e => {
const newTr = createTr()
createTd(e.optionName, newTr)
createTd(e.price, newTr)
})
const tot = document.querySelector("#totalPrice")
tot.innerHTML = total
}
body {
background-color: black;
color: white;
font-family:'Lucida Sans', 'Lucida Sans Regular', 'Lucida Grande', 'Lucida Sans Unicode', Geneva, Verdana, sans-serif
}
#form {
display: flex;
flex-direction: column;
width: 250px;
align-items: center;
}
#choice {
height: 120px;
}
.results {
width: 300px;
border: 2px dotted green;
margin: 10px;
text-align: center;
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="style.css">
<title>Car Selection</title>
</head>
<body>
<h1>Car Choice</h1>
<h2>Ready to buy your dream car?</h2>
<div class="select">
<!-- Selection of food or drink -->
<form class="flexColumn" id="form">
<select name="choice" id="choice" multiple="true">
<option value="" name="">--Please choose an option--</option>
<option id="vac" value="vac" name="vac">Built-in Vacuum (€150)</option>
<option value="trunk" name="trunk">Automatic Opening Trunk (€2000)</option>
<option value="seat" name="seat">Massaging Seats (€550)</option>
<option value="night" name="night">Nightvision Dashboard System (€360)</option>
<option value="wifi" name="wifi">WiFi/Entertainment/Navigation (€1200)</option>
<option value="park" name="park">Self-Parking System (€600)</option>
</select>
<button id="submit" class="submit" submit>SUBMIT</button>
</form>
<p>Your current selected options:</p>
<div id="selection" class="selection">
<table class="results" style="width:200px">
<tr>
<th>Option</th>
<th>Price (€)</th>
</tr>
<tbody id="cars">
<tbody>
<tfoot>
<tr>
<td>TOTAL:</td>
<td id="totalPrice"></td>
</tr>
</tfoot>
</table>
</div>
</div>
<script type="text/javascript" src="script.js"></script>
</body>
</html>
Комментарии:
1. Сделали, отлично. Мне просто нужно выяснить, как сделать его реактивным, когда я выбираю или отменяю выбор (в настоящее время он просто добавляет элементы), и добавить кнопку удаления 🙂
2. Вы можете создать другой список, заполненный выбранными элементами, и прикрепить событие в этот новый список, чтобы при нажатии удалить выбранный элемент
3. Хорошо, я попробую. На данный момент я справился с кнопкой сброса формы:
4. Кнопка сброса.addEventListener(«щелчок», () => { Форма ввода.сброс(); })
Ответ №2:
Параметры отображаются в одной строке, потому что вы выбрали только одну строку таблицы и вставили в нее все свои значения. Вам нужно будет создать строку таблицы для каждого из ваших значений. Чтобы отобразить значения в строках, попробуйте сделать следующее: —
/* See/add options, remove options,
see overview of options and price
*/
// VARIABLES
let button = document.getElementById("submit");
let choice = document.getElementById("choice");
let row = document.getElementById('emptyRow');
let totalPriceElement = document.getElementById('totalPrice');
// OPTIONS CLASS CONSTRUCTOR
class CarOptions {
constructor(optionName, price) {
this.optionName = optionName;
this.price = price;
}
}
// create 6 options
let option = new CarOptions("", 0);
let vac = new CarOptions("vac", 150);
let trunk = new CarOptions("trunk", 2000);
let seat = new CarOptions("seat", 550);
let night = new CarOptions("night", 360);
let wifi = new CarOptions("wifi", 1200);
let park = new CarOptions("park", 600);
// Array of all objects
let allOptions = [option, vac, trunk, seat, night, wifi, park];
// Array of all object names
let allOptionsName = [option.optionName, vac.optionName, trunk.optionName, seat.optionName, night.optionName, wifi.optionName, park.optionName];
// EVENTS
// On submit event
button.addEventListener("click", (e) => {
e.preventDefault();
const selected = document.querySelectorAll('#choice option:checked');
// Displaying options names in the table
// CURRENTLY ALL DISPLAYS IN ONE ROW
for(let i = 0; i < selected.length;i ){
const values = Array.from(selected).map(el => el.value);
const element = allOptions.filter(option => {
return option.optionName == values[i];
});
var tableRow = document.createElement('TR');
var tableCellName = document.createElement('TD');
var tableCellPrice = document.createElement('TD');
tableCellName.setAttribute('class','option');
tableCellName.innerText = values[i];
tableCellPrice.setAttribute('class','price');
tableCellPrice.innerText = element[0].price;
tableRow.appendChild(tableCellName);
tableRow.appendChild(tableCellPrice);
row.appendChild(tableRow);
if(i == selected.length - 1){
display(values);
}
}
})
function display(values) {
const elements = allOptions.filter(option => {
for(let i = 0; i < values.length; i ){
if(option.optionName == values[i]){
return option;
}
else{
continue;
}
}
})
let totalPrice = 0;
for(let i = 0; i<elements.length;i ){
totalPrice = elements[i].price;
}
totalPriceElement.innerText = totalPrice;
return;
}
body {
background-color: black;
color: white;
font-family:'Lucida Sans', 'Lucida Sans Regular', 'Lucida Grande', 'Lucida Sans Unicode', Geneva, Verdana, sans-serif
}
#form {
display: flex;
flex-direction: column;
width: 250px;
align-items: center;
}
#choice {
height: 120px;
}
.results {
width: 300px;
border: 2px dotted green;
margin: 10px;
text-align: center;
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="style.css">
<title>Car Selection</title>
</head>
<body>
<h1>Car Choice</h1>
<h2>Ready to buy your dream car?</h2>
<div class="select">
<!-- Selection of food or drink -->
<form class="flexColumn" id="form">
<select name="choice" id="choice" multiple="true">
<option value="" name="">--Please choose an option--</option>
<option id="vac" value="vac" name="vac">Built-in Vacuum (€150)</option>
<option value="trunk" name="trunk">Automatic Opening Trunk (€2000)</option>
<option value="seat" name="seat">Massaging Seats (€550)</option>
<option value="night" name="night">Nightvision Dashboard System (€360)</option>
<option value="wifi" name="wifi">WiFi/Entertainment/Navigation (€1200)</option>
<option value="park" name="park">Self-Parking System (€600)</option>
</select>
<button id="submit" class="submit" submit>SUBMIT</button>
</form>
<p>Your current selected options:</p>
<div id="selection" class="selection">
<table class="results" style="width:200px">
<tr>
<th>Option</th>
<th>Price (€)</th>
</tr>
<tbody id="emptyRow">
</tbody>
<tr>
<td>TOTAL:</td>
<td id="totalPrice"></td>
</tr>
</table>
</div>
</div>
<script type="text/javascript" src="script.js"></script>
</body>
</html>
Этот код заставит ваши опции отображаться в нескольких строках вместе с ценой и общей ценой.