【发布时间】:2021-11-20 10:43:59
【问题描述】:
我正在尝试在表单中克隆一个 div,同时还为每个输入提供一个唯一的 ID。我已经复制了相当多的代码,但这是为了全面了解我正在尝试创建的内容。
下面是我的html代码:
<div class="form-step">
<div id="readroot">
<div class="checkbox">
<label for="LegalEntity">Legal Entity</label>
<input type="radio" name="choice2" id="legalEntity2" value="legalEntity" onclick="filterForm2()" />
<label for="Individual">Individual</label>
<input type="radio" name="choice2" id="Individual2" value="Individual" onclick="filterForm2()" />
</div>
<div id="lec2" class="legal-entity-content">
<div class="input-group">
<label for="CompanyName">Company Name</label>
<input type="text" name="CompanyName" id="CompanyName" placeholder="Ex. MyPocketCounsel" />
</div>
<div class="input-group">
<label for="RegisteredAddress">Registered Address</label>
<input type="text" name="RegisteredAddress" id="RegisteredAddress" placeholder="Ex. MyPocketCounsel" />
</div>
<div class="input-group">
<label for="RegistrationNumber">Registration Number</label>
<input type="text" name="RegistrationNumber" id="RegistrationNumber" placeholder="Ex. MyPocketCounsel" />
</div>
<div class="input-group">
<label for="Definedas">Defined as...</label>
<input type="text" name="Definedas" id="Definedas" placeholder="Ex. MyPocketCounsel" />
</div>
</div>
<div id="ic2" class="individual-content hide">
<div class="input-group">
<label for="First Name">First Name</label>
<input type="text" name="First Name" id="First Name" placeholder="Ex. MyPocketCounsel" />
</div>
<div class="input-group">
<label for="Last Name">Last Name</label>
<input type="text" name="Last Name" id="Last Name" placeholder="Ex. MyPocketCounsel" />
</div>
<div class="input-group">
<label for="Address">Address</label>
<input type="text" name="Address" id="Address" placeholder="Ex. MyPocketCounsel" />
</div>
<div class="input-group">
<label for="Defined as">Defined as...</label>
<input type="text" name="Defined as" id="Defined as" placeholder="Ex. MyPocketCounsel" />
</div>
</div>
<input type="button" value="Remove Lender" class="btn btn-remove-lender"
onclick="if (counter >= 1){
counter --;
this.parentNode.parentNode.removeChild(this.parentNode);
}else{alert('you must have at least one Lender');}">
</div>
<span id="writeroot"></span>
<div class="btns-group">
<input type="button" id="morefields" value="Add Lender" class="btn btn-add-lender" onclick="moreFields()">
<a href="#" class="btn btn-prev">Previous</a>
<a href="#" class="btn btn-next">Next</a>
</div>
下面是我的javascript:
const prevBtns = document.querySelectorAll(".btn-prev");
const nextBtns = document.querySelectorAll(".btn-next");
const progress = document.getElementById("progress");
const formSteps = document.querySelectorAll(".form-step");
const progressSteps = document.querySelectorAll(".progress-step");
let formStepsNum = 0;
nextBtns.forEach((btn) => {
btn.addEventListener("click", () => {
formStepsNum++;
updateFormSteps();
updateProgressbar();
});
});
prevBtns.forEach((btn) => {
btn.addEventListener("click", () => {
formStepsNum--;
updateFormSteps();
updateProgressbar();
});
});
function updateFormSteps() {
formSteps.forEach((formStep) => {
formStep.classList.contains("form-step-active") &&
formStep.classList.remove("form-step-active");
});
formSteps[formStepsNum].classList.add("form-step-active");
}
function updateProgressbar() {
progressSteps.forEach((progressStep, idx) => {
if (idx < formStepsNum + 1) {
progressStep.classList.add("progress-step-active");
} else {
progressStep.classList.remove("progress-step-active");
}
});
const progressActive = document.querySelectorAll(".progress-step-active");
progress.style.width =
((progressActive.length - 1) / (progressSteps.length - 1)) * 100 + "%";
}
const IndividualContent = document.getElementById("ic");
IndividualContent.classList.add("hide");
function filterForm() {
if(document.getElementById('legalEntity').checked) {
//hide individual contnet
const IndividualContent = document.getElementById("ic");
IndividualContent.classList.add("hide");
const legalEntityContent = document.getElementById("lec");
legalEntityContent.classList.remove("hide");
console.log('AAA')
}else {
const legalEntityContent = document.getElementById("lec");
legalEntityContent.classList.add("hide");
const IndividualContent = document.getElementById("ic");
IndividualContent.classList.remove("hide");
console.log('BBB')
}
}
function filterForm2() {
if(document.getElementById('legalEntity2').checked) {
//hide individual contnet
const IndividualContent = document.getElementById("ic2");
IndividualContent.classList.add("hide");
const legalEntityContent = document.getElementById("lec2");
legalEntityContent.classList.remove("hide");
console.log('YYY');
}else {
const legalEntityContent = document.getElementById("lec2");
legalEntityContent.classList.add("hide");
const IndividualContent = document.getElementById("ic2");
IndividualContent.classList.remove("hide");
console.log('NNN');
}
if(document.getElementById('legalEntity3').checked) {
//hide individual contnet
const IndividualContent = document.getElementById("ic2");
IndividualContent.classList.add("hide");
const legalEntityContent = document.getElementById("lec2");
legalEntityContent.classList.remove("hide");
console.log('YYY');
}else {
const legalEntityContent = document.getElementById("lec2");
legalEntityContent.classList.add("hide");
const IndividualContent = document.getElementById("ic2");
IndividualContent.classList.remove("hide");
console.log('NNN');
}
}
let counter = 0;
function moreFields() {
counter ++;
let newFields = document.getElementById('readroot').cloneNode(true);
newFields.id = '';
newFields.style.display = 'block';
let newField = newFields.childNodes;
for (let i=0;i<newField.length;i++) {
let theName = newField[i].name;
if (theName)
newField[i].name = theName + counter;
}
let insertHere = document.getElementById('writeroot');
insertHere.parentNode.insertBefore(newFields,insertHere);
console.log('is not'+ counter);
console.log("more fields worked");
}
function showContent() {
var temp = document.getElementsByTagName("template")[0];
var clon = temp.content.cloneNode(true);
document.body.appendChild(clon);
}
function updateSymbol(e){
var selected = $(".currency-selector option:selected");
$(".currency-symbol").text(selected.data("symbol"))
$(".currency-amount").prop("placeholder", selected.data("placeholder"))
$('.currency-addon-fixed').text(selected.text())
}
$(".currency-selector").on("change", updateSymbol)
updateSymbol()
有没有办法用id 'readroot' 克隆div,同时将两个无线电输入的ID 更改为legalEntity3 和Individual3。
对不起,我是新手,任何帮助将不胜感激
【问题讨论】:
-
"同时还给每个输入一个唯一的 id" - 为什么?只需使用一个通用类。编号的 id 是一种代码味道(恕我直言)
-
谢谢@Andreas。我使用唯一的 ID,因为克隆的 div 每个都有两个无线电输入来根据需要切换特定的表单。使用一个类,它将切换具有相同类名的所有表单
-
您在
onclick事件处理程序中有两个不在您发布的代码中的函数,您在JavaScriptgetElementById('writeroot')调用中有一个元素,它不会出现在您的HTML 中。哪个元素应该触发/调用 moreFields() 函数?您能否将您的代码编辑为“minimal reproducible example”代码,以便我们更准确地重现您的问题? -
“有了一个类,它会切换所有具有相同类名的表单” - 仅当您认为“全局”时。相对于触发事件的元素执行您需要执行的操作。使用
.addEventListener()而不是内联JS,this将是单选按钮之一。然后只需遍历 DOM 以获取您需要的元素 - 相对于单选按钮。使用readroot作为一个类,您可以使用this.closest(".readroot").querySelectorAll("input")获取所有相关的输入元素。不需要 id... -
非常感谢@Andreas
标签: javascript html css clonenode