jQuery.clone(false)仍然从原始源复制数据

时间:2013-03-22 17:23:03

标签: javascript jquery html dom

这篇文章是对previous post的跟进,应用程序在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 那是怎么回事?

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分: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; });

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

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)); });