Я пытаюсь создать список отображаемых элементов, используя данные, введенные в текстовое поле. Моя проблема в том, что когда я хочу добавить второй элемент списка, первый просто обновляется. Я пробовал несколько разных вещей, и я застрял.
function addToList() {
let food = document.getElementById("food").value;
let amount = document.getElementById("amount").value;
let unit = document.getElementById("unit").value;
document.getElementById("foodlist").innerHTML =
(food + ' ' + amount + ' ' + unit + '.')
};<input type = "text" name = "" value = "food" id = "food"><br>
<input type = "text" name = "" value = "amount" id = "amount"><br>
<select id = "unit">
<option value = "oz">ounces</option>
<option value = "lb">pounds</option>
<option value = "servings">servings</option>
</select><br>
<button onclick = "addToList()" type = "button" name = "button" id = "addButton">add</button><br>
<li id = "foodlist"></li>Я хочу, чтобы данные из текстовых полей создавали новый элемент списка и добавляли данные в объект при каждом нажатии кнопки. все, что я получил до сих пор, это элемент списка, который постоянно обновляется.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вам нужно будет создать элемент ul и динамически создать элементы li, а затем добавить их как дочерние элементы этого ul. См. код ниже:
function addToList() {
let food = document.getElementById("food").value;
let amount = document.getElementById("amount").value;
let unit = document.getElementById("unit").value;
let li = document.createElement("li");
li.textContent = food + ' ' + amount + ' ' + unit + '.';
document.getElementById("foodlist").appendChild(li);
}<input type = "text" name = "" value = "food" id = "food">
<br>
<input type = "text" name = "" value = "amount" id = "amount">
<br>
<select id = "unit">
<option value = "oz">ounces</option>
<option value = "lb">pounds</option>
<option value = "servings">servings</option>
</select>
<br>
<button onclick = "addToList()" type = "button" name = "button" id = "addButton">add</button>
<br>
<ul id = "foodlist"></ul>Это потому, что вы заменяете все, используя innerHTML. Вы можете просто повторно использовать существующий HTML-код (используя += вместо +):
function addToList() {
let food = document.getElementById("food").value;
let amount = document.getElementById("amount").value;
let unit = document.getElementById("unit").value;
document.getElementById("foodlist").innerHTML +=
('<li>' + food + ' ' + amount + ' ' + unit + '.' + '</li>')
};<input type = "text" name = "" value = "food" id = "food">
<br>
<input type = "text" name = "" value = "amount" id = "amount">
<br>
<select id = "unit">
<option value = "oz">ounces</option>
<option value = "lb">pounds</option>
<option value = "servings">servings</option>
</select>
<br>
<button onclick = "addToList()" type = "button" name = "button" id = "addButton">add</button>
<br>
<ul id = "foodlist"></ul>Это добавляет тексты к тому же элементу списка.
Уже нет. :)
Причина в том, что вы не создали новый элемент списка, когда хотите добавить новый элемент, поэтому он продолжает заменять исходное значение и обновлять исходный элемент.
Просто нужно добавить новый узел списка в DOM со следующим кодом, когда вы добавляете новый элемент, и все готово.
function addToList() {
let food = document.getElementById("food").value;
let amount = document.getElementById("amount").value;
let unit = document.getElementById("unit").value;
var node = document.createElement("LI");
var textnode = document.createTextNode(food + ' ' + amount + ' ' + unit + '.');
node.appendChild(textnode);
document.getElementById("foodlist").appendChild(node)
};<input type = "text" name = "" value = "food" id = "food">
<br>
<input type = "text" name = "" value = "amount" id = "amount">
<br>
<select id = "unit">
<option value = "oz">ounces</option>
<option value = "lb">pounds</option>
<option value = "servings">servings</option>
</select>
<br>
<button onclick = "addToList()" type = "button" name = "button" id = "addButton">add</button>
<br>
<ul id = "foodlist"></ul>Попробуйте добавить содержимое.
пожалуйста, измените эту строку document.getElementById("foodlist").innerHTML = на document.getElementById("foodlist").innerHTML +=
и измените <li id = "foodlist"></li> на <ul id = "foodlist"></ul>
и (food + ' ' + amount + ' ' + unit + '.') к ('<li>'+food + ' ' + amount + ' ' + unit + '.</li>')
function addToList() {
let food = document.getElementById("food").value;
let amount = document.getElementById("amount").value;
let unit = document.getElementById("unit").value;
document.getElementById("foodlist").innerHTML +=
('<li>'+food + ' ' + amount + ' ' + unit + '.</li>')
};<input type = "text" name = "" value = "food" id = "food">
<br>
<input type = "text" name = "" value = "amount" id = "amount">
<br>
<select id = "unit">
<option value = "oz">ounces</option>
<option value = "lb">pounds</option>
<option value = "servings">servings</option>
</select>
<br>
<button onclick = "addToList()" type = "button" name = "button" id = "addButton">add</button>
<br>
<ul id = "foodlist"></ul>Вы не можете добавлять элементы li к элементу li — родительский элемент должен быть одним из UL или OL
Каждое нажатие кнопки должно вызывать функцию для добавления нового элемента DOM в родительский узел — в этом случае он добавит новый элемент li по мере необходимости с содержимым из других элементов формы.
<!DOCTYPE html>
<html>
<head>
<style>
form{width:60%;font-family:calibri,verdana,arial}
label{display:block;width:90%;clear:both;float:none;margin:1rem auto;padding:1rem 0 }
label > input, label > select{float:right;width:80%;padding:1rem;margin:-1rem;}
label:before{content:attr(for);text-transform:capitalize}
button{padding:1rem;width:100%;}
</style>
<script>
document.addEventListener('DOMContentLoaded',e=>{
let form=document.querySelector('form');
let food=document.querySelector('input[type = "text"][name = "food"]');
let amount=document.querySelector('input[type = "text"][name = "amount"]');
let list=document.querySelector('ul[id = "foodlist"]');
let bttn=document.querySelector('button[name = "button"]');
let unit=document.querySelector('select[name = "unit"]');
bttn.addEventListener('click', e=>{
let li=document.createElement('li');
li.innerText = [
food.value,
amount.value,
unit.value
].join(' ');
list.appendChild( li );
form.reset();
})
});
</script>
</head>
<body>
<form method='post'>
<label for='food'><input type='text' name='food' placeholder='Food - eg: Venison' /></label>
<label for='amount'><input type='text' name='amount' placeholder='Amount - eg: 45' /></label>
<label for='unit'>
<select name='unit'>
<option selected hidden disabled>Please select
<optgroup label='Weight'>
<option value='oz'>Ounces
<option value='lb'>Pounds
<option value='gr'>Grams
</optgroup>
<optgroup label='Volume'>
<option value='ml'>Millilitre
<option value='l'>Litres
<option value='gall'>Gallons
</optgroup>
<optgroup label='Misc'>
<option value='servings'>Servings
<option value='items'>Items
</optgroup>
</select>
</label>
<button type='button' name='button'>Add</button>
</form>
<!-- LI elements are added to a UL, OL or DL -->
<ul id='foodlist'></ul>
</body>
</html>
Возможный дубликат как добавить новый <li> в <ul> по клику с помощью javascript