有没有正确的方法在 div 容器中动态添加 "forms",只有 JavaScript?
is there a correct way to add dynamically "forms" in a div-container with just JavaScript?
我正在尝试仅使用 html、css 和 JavaScript(或一点点 JQuery)创建动态表单,所以我的问题是这个:
<div class="form-item">
<label for="form-container">Random Title:</label>
<div id="form-container">
***Here is where I add dynamic "forms"***
</div>
<div>
<button type="button" class="add-form" onclick="AddForm()">Add form</button>
</div>
</div>
而 JavaScript 是(我不知道这是否是最好的解决方案,但至少它有效哈哈):
function addForm(){
let container= document.getElementById('form-container');
if (cnt<5){
cnt+=1;
container.innerHTML += `***the form but write on HTML format***`;
} else {
alert("¡you cant add anymore!");
}
}
我需要类似的东西,但要删除我使用动态添加按钮添加的表单。
(表格在“”之间,因为它实际上不是表格,它只是一个 div,里面有输入,因为它是更大表格的一部分,其他 div 上有其他输入)
通常not a good idea使用内联事件处理程序(<button onclick=...
)。
这里有一个 minimal reproducable example where delegated handling 处理 div#form-container
内最多 5 个动态表单的创建、提交和删除。
Playground 此代码。
const maxForms = 5;
document.addEventListener(`click`, handle);
function createFormHTML(n) {
if (n > maxForms) {
return alert(`No more forms allowed`);
}
return `
<div data-dynamicform="${n}">
<input type="text" placeholder="type something!">
<button class="submit">Submbit</button>
<button class="erase">Delete form</button>
</div>`;
}
function handle(evt) {
console.clear();
if (evt.target.classList.contains(`add-form`)) {
const container = document.querySelector(`#form-container`);
container.dataset.nforms = +container.dataset.nforms + 1;
const newForm = createFormHTML(+container.dataset.nforms);
return newForm && container
.insertAdjacentHTML(`beforeend`, newForm) || true;
}
if( evt.target.classList.contains(`submit`)) {
return console.log(`submitted form #${
evt.target.closest(`[data-dynamicform]`).dataset.dynamicform}`);
}
if (evt.target.classList.contains(`erase`)) {
evt.target.closest(`[data-dynamicform]`).remove();
const dynamicForms = document.querySelectorAll(`[data-dynamicform]`);
dynamicForms.length && dynamicForms
.forEach( (form, i) => form.dataset.dynamicform = i + 1 );
document.querySelector(`#form-container`).dataset.nforms =
dynamicForms.length;
}
}
body {
margin: 1rem;
font: normal 12px/15px verdana,arial;
}
#form-container {
padding: 4px;
}
#form-container [data-dynamicform] {
margin-bottom: 4px;
}
<div class="form-item">
<div>
<button type="button" class="add-form">Add form</button>
</div>
<div id="form-container" data-nforms="0">
<h4>Your forms</h4>
</div>
</div>
我正在尝试仅使用 html、css 和 JavaScript(或一点点 JQuery)创建动态表单,所以我的问题是这个:
<div class="form-item">
<label for="form-container">Random Title:</label>
<div id="form-container">
***Here is where I add dynamic "forms"***
</div>
<div>
<button type="button" class="add-form" onclick="AddForm()">Add form</button>
</div>
</div>
而 JavaScript 是(我不知道这是否是最好的解决方案,但至少它有效哈哈):
function addForm(){
let container= document.getElementById('form-container');
if (cnt<5){
cnt+=1;
container.innerHTML += `***the form but write on HTML format***`;
} else {
alert("¡you cant add anymore!");
}
}
我需要类似的东西,但要删除我使用动态添加按钮添加的表单。
(表格在“”之间,因为它实际上不是表格,它只是一个 div,里面有输入,因为它是更大表格的一部分,其他 div 上有其他输入)
通常not a good idea使用内联事件处理程序(<button onclick=...
)。
这里有一个 minimal reproducable example where delegated handling 处理 div#form-container
内最多 5 个动态表单的创建、提交和删除。
Playground 此代码。
const maxForms = 5;
document.addEventListener(`click`, handle);
function createFormHTML(n) {
if (n > maxForms) {
return alert(`No more forms allowed`);
}
return `
<div data-dynamicform="${n}">
<input type="text" placeholder="type something!">
<button class="submit">Submbit</button>
<button class="erase">Delete form</button>
</div>`;
}
function handle(evt) {
console.clear();
if (evt.target.classList.contains(`add-form`)) {
const container = document.querySelector(`#form-container`);
container.dataset.nforms = +container.dataset.nforms + 1;
const newForm = createFormHTML(+container.dataset.nforms);
return newForm && container
.insertAdjacentHTML(`beforeend`, newForm) || true;
}
if( evt.target.classList.contains(`submit`)) {
return console.log(`submitted form #${
evt.target.closest(`[data-dynamicform]`).dataset.dynamicform}`);
}
if (evt.target.classList.contains(`erase`)) {
evt.target.closest(`[data-dynamicform]`).remove();
const dynamicForms = document.querySelectorAll(`[data-dynamicform]`);
dynamicForms.length && dynamicForms
.forEach( (form, i) => form.dataset.dynamicform = i + 1 );
document.querySelector(`#form-container`).dataset.nforms =
dynamicForms.length;
}
}
body {
margin: 1rem;
font: normal 12px/15px verdana,arial;
}
#form-container {
padding: 4px;
}
#form-container [data-dynamicform] {
margin-bottom: 4px;
}
<div class="form-item">
<div>
<button type="button" class="add-form">Add form</button>
</div>
<div id="form-container" data-nforms="0">
<h4>Your forms</h4>
</div>
</div>