问题是cloneMethod不克隆事件监听器:
克隆一个节点会复制它的所有属性和它们的值,包括内在(在线)监听器。它不会复制使用 addEventListener() 添加的事件侦听器或分配给元素属性的事件侦听器。
你可以这样做:
https://jsfiddle.net/q3Lz997m/2/
const clickBtn = document.querySelector('#addingPerson');
const field = document.querySelector('#inputPerson');
let i = 0;
const deleteField = document.querySelector('.deletePerson');
function deleteDiv(e) {
e.preventDefault();
d = e.target.parentNode.parentNode.parentNode.parentNode;
d.parentNode.removeChild(d);
}
function cloneDiv(event) {
event.preventDefault();
const cloneField = field.cloneNode(true);
cloneField.id = i++;
e = cloneField.querySelector('#addingPerson');
e.addEventListener('click', cloneDiv);
e = cloneField.querySelector('.deletePerson');
e.addEventListener('click', deleteDiv);
field.parentNode.appendChild(cloneField);
}
clickBtn.addEventListener('click', cloneDiv);
deleteField.addEventListener('click', deleteDiv);
还有一个更短的版本https://jsfiddle.net/q3Lz997m/3/:
function addEventListeners(e) {
e.querySelector('#addingPerson').addEventListener('click', cloneDiv);
e.querySelector('.deletePerson').addEventListener('click', deleteDiv);
}
function deleteDiv(e) {
e.preventDefault();
d = e.target.parentNode.parentNode.parentNode.parentNode;
d.parentNode.removeChild(d);
}
function cloneDiv(e) {
e.preventDefault();
p = e.target.parentNode.parentNode.parentNode.parentNode;
cloneField = p.cloneNode(true);
addEventListeners(cloneField);
p.parentNode.appendChild(cloneField);
}
addEventListeners(document.querySelector('#inputPerson'));
另外,我认为您不需要 preventDefault() ,除非您的按钮位于表单内。