#javascript #html #button #onclick
Вопрос:
У меня есть форма с двумя полями ввода:
<form id="import-products-form">
<div class="form-row">
<select></select>
<input>
</div>
</form>
И пуговица:
<button id="add-input-button"><strong> </strong></button>
Каждый раз при нажатии на кнопку в форму будут добавляться два поля ввода:
document.getElementById("add-input-button").onclick = () => {
const input = `
<div class="form-row">
<select></select>
<input>
</div>
`;
document.getElementById("import-products-form").innerHTML = input;
};
Проблема здесь в том, что при каждом нажатии кнопки значения существующих полей будут сброшены до значений по умолчанию. Войдя DevTools
, я увидел, что вся форма была перезагружена при нажатии кнопки.
Можно ли в любом случае сохранить значения существующих полей при добавлении новых полей в форму?
Комментарии:
1. Используйте
type="button"
, чтобы кнопка не отправляла форму.2. кнопка не является дочерним элементом элемента формы
Ответ №1:
Не назначайте на innerHTML
. Это приводит к тому, что все элементы внутри формы воссоздаются с нуля, и любое динамическое состояние теряется.
Используйте insertAdjacentHTML
вместо этого. Это анализирует новый HTML и добавляет элементы DOM, не нарушая исходные элементы.
document.getElementById("import-products-form").insertAdjacentHTML('beforeend', input);
Комментарии:
1. Хорошо, это отлично работает. И я только что исправил синтаксис кода. Спасибо!
Ответ №2:
x.innerHTML = input
эффективно работает x.innerHTML = (x.innerHTML input)
, и вы теряете состояние
Вы должны создать новый элемент и добавить его.
document.getElementById("add-input-button").onclick = (e) => {
const input = `
<select></select>
<input>
`;
let div = document.createElement('div')
div.classList.add('form-row')
div.innerHTML=input
document.getElementById("import-products-form").appendChild(div)
};
<form id="import-products-form">
<div class="form-row">
<select></select>
<input>
</div>
</form>
<button id="add-input-button"><strong> </strong></button>
Для этого конкретного случая использования не нужно каждый раз создавать элемент из текста.
{
const input = `
<select></select>
<input>
`;
let div = document.createElement('div')
div.classList.add('form-row')
div.innerHTML=input
document.getElementById("add-input-button").onclick = (e) => {
document.getElementById("import-products-form").appendChild(div.cloneNode(true))
};
}
<form id="import-products-form">
<div class="form-row">
<select></select>
<input>
</div>
</form>
<button id="add-input-button"><strong> </strong></button>
Ответ №3:
Попробуйте использовать appendChild
вместо innerHTML
.
document.getElementById("add-input-button").onclick = () => {
var div = document.createElement('div');
var select = document.createElement('select');
var input = document.createElement('input');
div.classList.add('form-row');
div.appendChild(select);
div.appendChild(input);
document.getElementById("import-products-form").appendChild(div);
};
<form id="import-products-form">
<div class="form-row">
<select></select>
<input>
</div>
</form>
<button id="add-input-button"><strong> </strong></button>