Вам вообще не нужно id
с.
Минимальное изменение - передать this
в remove
из onclick
(и, поскольку вы не хотитечтобы отправить форму, присвойте ей type
):
<button onclick="remove(this)" type="button">Next</button>
Затем в remove
используйте переданный элемент кнопки, чтобы найти форму, в которой он находится:
function remove(button) {
var form = button.closest("form");
form.parentNode.removeChild(form);
}
Вы можете внести аналогичные изменения в duplicate
:
function duplicate(button) {
var form = button.closest("form").cloneNode(true);
document.body.appendChild(form);
}
Обязательно удалите id
из формы, так как он не нужен и будет дублирован указанным выше.
Live Пример:
function remove(button) {
var form = button.closest("form");
form.parentNode.removeChild(form);
}
function duplicate(button) {
var form = button.closest("form").cloneNode(true);
document.body.appendChild(form);
}
<form class="f0" action="action.php">
<input type="text" name="name" id="name" required="">
<button onclick="duplicate(this)" type="button">Duplicate</button>
<button onclick="remove(this)" type="button">Next</button>
</form>
Но еще лучше было бы вообще не использовать атрибут onclick
, потому что когда вам приходится использовать глобальные функции и глобальные переменныелучше избегатьВместо этого используйте современную обработку событий (addEventListener
):
function remove() {
var form = this.closest("form");
form.parentNode.removeChild(form);
}
function duplicate() {
var form = this.closest("form").cloneNode(true);
setupHandlers(form);
document.body.appendChild(form);
}
function setupHandlers(form) {
form.querySelector(".form-duplicate").addEventListener("click", duplicate);
form.querySelector(".form-remove").addEventListener("click", remove);
}
// Setup handlers on any initially-present forms
document.querySelectorAll(".f0").forEach(setupHandlers);
<form class="f0" action="action.php">
<input type="text" name="name" id="name" required="">
<button class="form-duplicate" type="button">Duplicate</button>
<button class="form-remove" type="button">Next</button>
</form>
Другой вариант - использовать делегирование событий, обрабатывая щелчки на элементе контейнера, в котором находятся все эти формы (body
в вашем примере):
document.body.addEventListener("click", function(e) {
var btn = e.target.closest(".form-duplicate");
if (btn && this.contains(btn)) {
duplicate(btn);
return;
}
btn = e.target.closest(".form-remove");
if (btn && this.contains(btn)) {
remove(btn);
return;
}
});
function remove(btn) {
var form = btn.closest("form");
form.parentNode.removeChild(form);
}
function duplicate(btn) {
var form = btn.closest("form").cloneNode(true);
document.body.appendChild(form);
}
<form class="f0" action="action.php">
<input type="text" name="name" id="name" required="">
<button class="form-duplicate" type="button">Duplicate</button>
<button class="form-remove" type="button">Next</button>
</form>
Обратите внимание, что closest
является относительно новым, вам потребуется polyfill для IE.