我正在动态地向表单添加新元素,使用JavaScript在用户点击&#34时克隆现有元素;添加新元素"输入按钮。这适用于第一个深度级别,但是当我尝试第二个级别时遇到问题:我点击"添加新字段",这使得一组新的表单字段出现,除了按钮& #34;添加新的子字段"。单击"添加新子字段"甚至没有调用它应该调用的函数,这应该在动态添加的字段中添加新字段。在另一个项目中,我记得我在将JavaScript应用到新的DOM元素时遇到了麻烦,我认为这可能是问题所在。有办法吗?怎么样?
我的代码:(来自http://www.quirksmode.org/dom/domform.html的js)
<form>
<span id="writeroot_field"></span>
<input type="button" id="more_fields" value="Add more fields">
<input type="submit">
</form>
<div id="readroot_field" style="display:none">
<span id='writeroot_subfield'></span>
<input type='button' value='Add subfield' id='more_subfields'></input>
<!-- more fields -->
</div>
<div id='readroot_subfield' style='display:none'>
<!-- form fields -->
</div>
<script>
// main fields
var counter = 0;
function moreFields() {
counter++;
var newFields = document.getElementById('readroot_field').cloneNode(true);
newFields.id = '';
newFields.style.display = 'block';
var newField = newFields.childNodes;
for (var i=0;i<newField.length;i++) {
var theName = newField[i].name
if (theName)
newField[i].name = theName + counter;
}
var insertHere = document.getElementById('writeroot_field');
insertHere.parentNode.insertBefore(newFields,insertHere);
}
window.onload = moreFields;
document.getElementById('more_fields').onclick = moreFields;
// subfields
var counter2 = 0;
function moreSubfields() {
console.log('entering here? no?');
counter2++;
var newFields = document.getElementById('readroot_subfield').cloneNode(true);
newFields.id = '';
newFields.style.display = 'block';
var newField = newFields.childNodes;
for (var i=0;i<newField.length;i++) {
var theName = newField[i].name
if (theName)
newField[i].name = theName + counter2;
}
var insertHere = document.getElementById('writeroot_subfield');
insertHere.parentNode.insertBefore(newFields,insertHere);
}
document.getElementById('more_subfields').onclick = moreSubfields;
</script>
答案 0 :(得分:0)
使用已设置为
的cloneNode()
事件处理程序时
element.onclick = function() { ... }
或
element.addEventListener("click", function() { ... })
不会被克隆(参见MDN: Node.cloneNode)。
您的问题的解决方案是在每次复制时为新节点设置事件处理程序:
<form>
<span id="writeroot_field"></span>
<input type="button" id="more_fields" value="Add more fields">
<input type="submit">
</form>
<div id="readroot_field" style="display:none">
<span id='writeroot_subfield'></span>
<input type='button' value='Add subfield' id='more_subfields'></input>
<!-- more fields -->
</div>
<div id='readroot_subfield' style='display:none'>
<!-- form fields -->
</div>
<script>
// main fields
var counter = 0;
function moreFields() {
counter++;
var newFields = document.getElementById('readroot_field').cloneNode(true);
newFields.id = '';
newFields.style.display = 'block';
//set event handler
newFields.onclick = moreFields;
var newField = newFields.childNodes;
for (var i=0;i<newField.length;i++) {
var theName = newField[i].name
if (theName)
newField[i].name = theName + counter;
}
var insertHere = document.getElementById('writeroot_field');
insertHere.parentNode.insertBefore(newFields,insertHere);
}
window.onload = moreFields;
document.getElementById('more_fields').onclick = moreFields;
// subfields
var counter2 = 0;
function moreSubfields() {
console.log('entering here? no?');
counter2++;
var newFields = document.getElementById('readroot_subfield').cloneNode(true);
newFields.id = '';
newFields.style.display = 'block';
//set event handler
newFields.onclick = moreSubfields;
var newField = newFields.childNodes;
for (var i=0;i<newField.length;i++) {
var theName = newField[i].name
if (theName)
newField[i].name = theName + counter2;
}
var insertHere = document.getElementById('writeroot_subfield');
insertHere.parentNode.insertBefore(newFields,insertHere);
}
document.getElementById('more_subfields').onclick = moreSubfields;
</script>