【发布时间】:2021-09-05 08:18:14
【问题描述】:
我有一个 id="add-dependent" 的 div,包括 2 行和一个按钮(添加依赖)在 div 内。单击“添加依赖项”按钮时,将克隆第一行并在(添加依赖项)按钮之前插入。实际上,我在 div 之外还有一个名为(添加申请人)的按钮,通过单击它,整个 div 将被克隆并添加到(添加申请人)按钮之前。我的代码是这样的:
let nextLabel=2
let nextId=1
function addApplicant(){
var elem= document.querySelector("#add-dependent");
var clone=elem.cloneNode(true);
var add= document.getElementById("add-applicant");
clone.id = "add-dependent"+nextLabel;
elem.parentElement.insertBefore(clone,add);
var label = clone.querySelector("label");
label.innerHTML = '<button class="close remove" onClick="$(this).parent().parent().parent().parent().remove()">x</button>' + "Applicant " + (nextLabel++) ;
}
function addDependent(){
var elem= document.querySelector(".dependent");
var clone=elem.cloneNode(true);
var add= document.getElementById("dependent");
elem.parentElement.insertBefore(clone,add);
var label=clone.querySelector('label');
label.innerHTML= '<button id="btn" name="btn" type="button" class="close float-left" style="font-size:12px;" onClick="$(this).parent().parent().parent().remove();" >x</button>';
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="add-dependent">
<div class="form-row dependents">
<div>
<label class="text-left" contenteditable="true">Applicant 1: </label>
</div>
<div >
<input type="number" placeholder="age">
</div>
</div>
<div class="form-row dependent">
<div>
<button id="btn" name="btn" type="button" class="close " onClick="$(this).parent().parent().remove();" >x</button>
</div>
<div>
<input type="number" placeholder="age">
</div>
</div>
<button id="dependent" onClick="addDependent()">Add dependent</button>
</div>
<button id="add-applicant" onClick="addApplicant()">Add applicant</button>
我的问题是当我在克隆的 div 中单击(添加依赖)时,该行被添加到主 div 而不是克隆的一个。 希望你能很快来到这里。 非常感谢
【问题讨论】:
-
像
onclick这样的内联事件处理程序是not recommended。它们是一种obsolete, hard-to-maintain and unintuitive 注册事件的方式。总是useaddEventListener。 -
使用event delegation而不是分配多个事件监听器 — 它更易于维护,并且适用于动态添加的元素。例如,使用event argument 的
target。见the tag info 和What is DOM Event delegation?。 -
Id 必须是唯一的才能正常工作。克隆
#add-dependent并添加克隆后,您现在拥有两个具有相同 id 的元素。使用document.getElementById("dependent")可能会返回第一个实例,因此将新行放在主 div 中。
标签: javascript clonenode