#javascript #arrays #html
#javascript #массивы #HTML
Вопрос:
Я заполнил массив списком ингредиентов. Мне нужно динамически создавать комбинацию флажков и меток для каждого объекта (только объект «Name») в массиве
вот код, который я пытаюсь создать для каждого объекта в массиве
<div class="column">
<label for="Doughnuts">Doughnuts</label>
<input type="checkbox" name = "Doughnuts">
</div>
Мне нужно скопировать этот фрагмент кода для каждого объекта в массиве
Также, как бы я поместил значения флажков в массив для последующего использования
Комментарии:
1. Вы забыли опубликовать свою попытку решения или объяснить, каким образом ваш код терпит неудачу. Также для того, чтобы связать
<label>
с<input>
for
значением атрибута,id
значение должно быть равноname
значению атрибута, а не в,,.2. Я новичок в программировании на javascript. Я использовал следующий код, чтобы извлечь объекты из массива, однако я не знаю, как использовать этот объект.keys(доступные опции).forEach(функция (ключ) { console.log(ключ, доступные опции [ключ]); });
Ответ №1:
var AvailableToppings = [
{Name: "Pepperoni",ExtraPrice: 0.75},
{Name: "Tomatoes", ExtraPrice: 0.70},
{Name: "Anchovies", ExtraPrice: 0.60},
{Name: "Mushroom", ExtraPrice: 0.50},
{Name: "Garlic", ExtraPrice: 0.80},
{Name: "Pinapple", ExtraPrice: 1.00},
{Name: "Turkey Ham", ExtraPrice: 1.00},
{Name: "Spicy Beef", ExtraPrice: 1.50},
{Name: "Spicy Chicken", ExtraPrice: 1.50},
{Name: "Jalapenos", ExtraPrice: 0.50}
];
var ingreChkboxes = document.getElementById('ingre-chkboxes');
AvailableToppings.map((AvailableTopping, index) => {
var Name = AvailableTopping.Name;
var parentDiv = document.createElement('div');
parentDiv.setAttribute('class', 'column');
var Label = document.createElement('label');
Label.setAttribute('for', Name);
var Node = document.createTextNode(Name " ");
Label.appendChild(Node);
var Input = document.createElement('input');
Input.setAttribute('type', 'checkbox');
Input.setAttribute('name', Name);
parentDiv.appendChild(Label).appendChild(Input);
ingreChkboxes.appendChild(parentDiv);
});
function submitToppings() {
var chosenOptions = [];
var options = document.querySelectorAll("#ingre-chkboxes input[type=checkbox]");
options.forEach((option) => {
if(option.checked) {
chosenOptions.push(option.getAttribute('name'));
}
});
alert(chosenOptions);
}
/* CSS Document */
*{
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: 'Permanent Marker', cursive;
}
body {
height: 100vh;
}
h1{
font-family: 'Alfa Slab One', cursive;
letter-spacing: 5px
}
.grid {
display: flex;
flex-wrap: wrap;
text-align: center;
margin: -1em 0 1em -1em;
}
.grid-item {
flex: 1;
padding: 1em 0 0 1em;
margin-top: auto;
margin-bottom: auto;
}
/*Ignore above*/
.modal-bb {
position: relative;
height: 100%;
}
.modal-bb-contents {
width: 90%;
height: 80%;
overflow: auto;
margin: auto;
position: absolute;
top: 0; left: 0; bottom: 0; right: 0;
border: solid black;
text-align: center;
padding: 3vh 3vh;
}
#button-container {
display: flex;
justify-content: right; /* align horizontal */
align-items: center; /* align vertical */
border: thin #6A2021 groove;
padding-left: 2%;
}
#Ingrediants-button {
background: none;
border: none;
color: rgb(196, 19, 19);
font-size: 8vh;
font-family: 'Permanent Marker', cursive;
cursor: pointer;
}
.expander-toggle {
font-size: 10vh;
padding: 0vh 10vw;
cursor: pointer;
}
/* Create three equal columns that floats next to each other */
.column {
float: left;
width: 33.33%;
padding: 10vh;
height: auto;
}
/* Clear floats after the columns */
.row:after {
display: table;
clear: both;
}
.ingre-chkbox {
display: block;
}
<div class="modal-bb"> <!-- Container for modal-box -->
<div class="modal-bb-contents"> <!-- modal-box -->
<div id = "button-container">
<p class="expander-toggle"> </p>
<button id="Ingrediants-button">Choose Bread</button>
</div>
<div class="ingre-chkbox" id="ingre-chkboxes">
</div>
<button onClick="submitToppings();">Submit toppings</button>
</div>
</div>
Комментарии:
1. Как бы я поместил все проверенные входные данные в массив?
2. @HumzaYusuf если эти данные также доступны в объекте, вы можете добавить
Input.setAttribute('checked', 'checked');
послеInput.setAttribute('name', Name);
. Вы можете обернуть это в инструкцию, чтобы проверить, следует ли предварительно проверять входные данные, например:if(AvailableTopping.isChecked) { Input.setAttribute('checked', 'checked'); }
3. Привет. Я хочу сохранить параметры, отмеченные пользователями, в массиве, на который я смогу ссылаться позже. Мое намерение состоит в том, чтобы показать начинки, которые человек выбрал в счете
4. Вы могли бы сделать это, например, с помощью события отправки. Я добавил некоторый код к JS и HTML здесь выше, чтобы нарисовать картину
5. Значение атрибута
for
элементаlabel
должно быть единичнымid
.
Ответ №2:
В библиотеке AngularJS выполняется ng-repeat для отображения массива. Но в чистой Java вам нужно обновить DOM для вашего массива объектов.
Комментарии:
1. не Java, а javascript
Ответ №3:
Вы можете сделать что-то вроде этого:
const AvailableToppings = [
{Name: "Pepperoni",ExtraPrice: 0.75},
{Name: "Tomatoes", ExtraPrice: 0.70},
{Name: "Anchovies", ExtraPrice: 0.60},
{Name: "Mushroom", ExtraPrice: 0.50},
{Name: "Garlic", ExtraPrice: 0.80},
{Name: "Pinapple", ExtraPrice: 1.00},
{Name: "Turkey Ham", ExtraPrice: 1.00},
{Name: "Spicy Beef", ExtraPrice: 1.50},
{Name: "Spicy Chicken", ExtraPrice: 1.50},
{Name: "Jalapenos", ExtraPrice: 0.50}
];
let inputs = document.createElement("span");
inputs.innerHTML = AvailableToppings.map(item => `<div class="column">
<label for="${item.Name}">${item.Name}</label>
<input type="checkbox" name="${item.Name}" value="${item.ExtraPrice}">
</div>`).join('');
document.getElementById('checkBoxContainer').appendChild(inputs);
/* CSS Document */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: 'Permanent Marker', cursive;
}
body {
height: 100vh;
}
h1 {
font-family: 'Alfa Slab One', cursive;
letter-spacing: 5px
}
.grid {
display: flex;
flex-wrap: wrap;
text-align: center;
margin: -1em 0 1em -1em;
}
.grid-item {
flex: 1;
padding: 1em 0 0 1em;
margin-top: auto;
margin-bottom: auto;
}
/*Ignore above*/
.modal-bb {
position: relative;
height: 100%;
}
.modal-bb-contents {
width: 90%;
height: 80%;
overflow: auto;
margin: auto;
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
border: solid black;
text-align: center;
padding: 3vh 3vh;
}
#button-container {
display: flex;
justify-content: right;
/* align horizontal */
align-items: center;
/* align vertical */
border: thin #6A2021 groove;
padding-left: 2%;
}
#Ingrediants-button {
background: none;
border: none;
color: rgb(196, 19, 19);
font-size: 8vh;
font-family: 'Permanent Marker', cursive;
cursor: pointer;
}
.expander-toggle {
font-size: 10vh;
padding: 0vh 10vw;
cursor: pointer;
}
/* Create three equal columns that floats next to each other */
.column {
float: left;
width: 33.33%;
padding: 10vh;
height: auto;
}
/* Clear floats after the columns */
.row:after {
display: table;
clear: both;
}
.ingre-chkbox {
display: block;
}
<div class="modal-bb">
<!-- Container for modal-box -->
<div class="modal-bb-contents">
<!-- modal-box -->
<div id="button-container">
<p class="expander-toggle"> </p>
<button id="Ingrediants-button">Choose Bread</button>
</div>
<!-- Should probably have an ID -->
<div id="checkBoxContainer" class="ingre-chkbox"></div>
</div>
</div>
Надеюсь, это поможет,
Комментарии:
1. Значение атрибута
for
элементаlabel
должно быть единичнымid
.