我想制作一个组输入列表,允许用户动态地让用户添加/删除组行:
<div id="div-form-denominations" class="form-denominations">
<div id="row-0" class="form-denomination">
<div class="form-field">
<div class="form-field">
<div class="form-field">
<input id="_denominations[0].id.reference" class="removableHiddenOrder" type="hidden" name="denominations[0].id.reference" value="87-070329-034COP-4444">
<input id="_denominations[0].denomination" class="removableHiddenDenom" type="hidden" name="denominations[0].denomination" value="10000">
<a id="deleteBtn-[0]" class="action-link delete-denomination" href="#">
<div class="spacer"></div>
</div>
<div id="row-1" class="form-denomination">
<div class="form-field">
<div class="form-field">
<div class="form-field">
<input id="_denominations[1].id.reference" class="removableHiddenOrder" type="hidden" name="denominations[1].id.reference" value="87-070329-034COP-4444">
<input id="_denominations[1].denomination" class="removableHiddenDenom" type="hidden" name="denominations[1].denomination" value="">
<a id="deleteBtn-[1]" class="action-link delete-denomination" href="#">
<div class="spacer"></div>
</div>
<div id="row-2" class="form-denomination">
<div class="form-field">
<div class="form-field">
<div class="form-field">
<input id="_denominations[2].id.reference" class="removableHiddenOrder" type="hidden" name="denominations[2].id.reference" value="">
<input id="_denominations[2].denomination" class="removableHiddenDenom" type="hidden" name="denominations[2].denomination" value="">
<a id="deleteBtn-[2]" class="action-link delete-denomination" href="#">
<div class="spacer"></div>
</div>
<div id="row-3" class="form-denomination">
.......
</div>
因此,每一行都包含一组表单字段,其中包括一个输入或选择组件(未在上面的代码中显示)和一些隐藏字段和一个删除链接,用于从视图中删除当前行。
我还创建了一个链接以动态将新行添加到该部分
var rowTemplate = null;
j(document).ready(function() {
// Save the row template
rowTemplate = j('.form-denomination:first-child').clone();
j("#add_link").click(function() {
add_denomination();
});
});
add_denomination
这是克隆第一行并将任何克隆的 id 替换为新索引的函数的内容,并将克隆的行附加到列表的最后一行之后。
function add_denomination() {
var index = j('.form-denomination').length;
// set the new row id
var newRowId = 'row-' + index;
var newRow = rowTemplate.clone().attr('id', newRowId);
// Replace the id/name attribute of each input control
newRow.find('div, input, select, a').each(function() {
replaceAttribute(j(this), 'id', index);
replaceAttribute(j(this), 'name', index);
j(this).val('');
});
// add new element to the DOM
newRow.appendTo('.form-denominations');
alert("new list size = " + j(".delete-denomination").length);
console.log("DONE!");
}
每次单击add-link
弹出警报都会显示新的列表大小(j(".delete-denomination").length 增加 1),据我了解,新行已成功添加。
问题是以下方法
// delete denomination row
j('.delete-denomination').click(function () {
j(this).parent().remove();
}
仅适用于非克隆行!使用萤火虫我可以清楚地看到附加的行成功地附加了与原始行相同的结构和相同的元素,但唯一的区别是 id。
但是,每次单击时deleteBtn-[i]
,其中 i 是cloned/appended
行的索引,代码甚至没有进入j('.delete-denomination').click()
函数,据我了解,Dom 或 jquery 无法识别新行,因此无法通过 jQuery 识别链接. 这与之前告诉列表大小已经增长的警报消息有点矛盾。
但是当我点击deleteBtn-[i]
我所在的non-cloned
行时,一切正常......
所以问题是:如何追加/添加新的dom并让它们被jQuery或Dom识别?上述处理有什么问题?有没有办法刷新列表,以便 Dom/jQuery 从各个角度理解附加的行?