Создайте входные данные и метку для каждого объекта в массиве

#javascript #arrays #html

#javascript #массивы #HTML

Вопрос:

Я заполнил массив списком ингредиентов. Мне нужно динамически создавать комбинацию флажков и меток для каждого объекта (только объект «Name») в массиве

вот код, который я пытаюсь создать для каждого объекта в массиве

 <div class="column">
<label for="Doughnuts">Doughnuts</label>
<input type="checkbox" name = "Doughnuts">
</div>
  

Мне нужно скопировать этот фрагмент кода для каждого объекта в массиве

Также, как бы я поместил значения флажков в массив для последующего использования

https://codepen.io/humzaysf/pen/QozzXE

Комментарии:

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 .