0

这篇文章是对上一篇文章的跟进,该应用程序在 jQuery 1.4 上运行,但感谢任何版本的建议:

当前的问题是甚至使用

rowTemplate = j('.form-denomination:first-child').clone();

var newRow = rowTemplate.clone().attr('id', newRowId);

newRow无论我从网页中选择什么,我都可以看到仍然使用 firebug 将旧数据保存在列表中的第一个子项中。

例如,如果要克隆的列表的第一个子节点是 node[0]

<select id="_denominations[0].id.denominationId" class="removableDenom" name="denominations[0].id.denominationId">
    <option value="100">100</option>
    <option value="1000">1000</option>
    <option value="10000">10000</option>
    <option value="500">500</option>
    <option value="5000">5000</option>
    <option value="50000" selected="selected">50000</option>
</select>

我在节点 [2] 之后添加了一个新行,它看起来像

<select id="_denominations[3].id.denominationId" class="removableDenom" name="denominations[3].id.denominationId">
    <option value="100">100</option>
    <option value="1000">1000</option>
    <option value="10000">10000</option>
    <option value="500">500</option>
    <option value="5000">5000</option>
    <option value="50000" selected="selected">50000</option>
</select>

看到它仍然显示 50000 作为下拉框的选择,即使它在网页上显示 100 那么这是怎么回事?

4

2 回答 2

3

它仍然显示50000作为下拉框的选择,即使它在网页上显示100

您看到的是 HTML 源代码。50000 不是页面上显示的当前值,而是页面加载时显示的(或者更确切地说在这种情况下)显示的值。

于 2013-03-22T17:40:59.587 回答
1

.clone()恐怕你要求的比它所能提供的要多。它不会为您更新 id;它不会为您更新名称;它不会为您清除表单数据。您将不得不自己完成所有这些事情 - 您可以在模板上清除的表单数据,但是您在插入时必须设置的 id。

rowTemplate = j('.form-denomination:first-child').clone();
rowTemplate.find("input[value], textarea").val("");
rowTemplate.find("select").each(function() { this.selectedIndex = 0; });

如果我们能够假设第一行总是有类似的 id 和名称,[0]那么在插入之前的更新会更容易一些:

var rowId = "[" + j('.form-denomination').length + "]";
var newRow = rowTemplate.clone();
newRow.find("[id]").each(function() { var $t = $(this); $t.attr("id", $t.attr("id").replace("[0]", rowId)); });
newRow.find("[name]").each(function() { var $t = $(this); $t.attr("name", $t.attr("name").replace("[0]", rowId)); });
于 2013-03-22T17:45:50.183 回答