Javascript clone(false)仍然从原始源复制数据
这篇文章是一篇后续文章,应用程序在jQuery 1.4上运行,但欢迎任何版本的建议: 目前的问题甚至是使用Javascript clone(false)仍然从原始源复制数据,javascript,jquery,html,dom,Javascript,Jquery,Html,Dom,这篇文章是一篇后续文章,应用程序在jQuery 1.4上运行,但欢迎任何版本的建议: 目前的问题甚至是使用 rowTemplate = j('.form-denomination:first-child').clone(); 及 我可以看到newRow仍然使用firebug保存列表中第一个孩子的旧数据,无论我从网页中选择了什么 例如,如果要克隆的列表的第一个子节点是节点[0] <select id="_denominations[0].id.denominationId" class="
rowTemplate = j('.form-denomination:first-child').clone();
及
我可以看到newRow
仍然使用firebug保存列表中第一个孩子的旧数据,无论我从网页中选择了什么
例如,如果要克隆的列表的第一个子节点是节点[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>
100
1000
10000
500
5000
50000
我在节点[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>
100
1000
10000
500
5000
50000
看到它仍然显示50000作为下拉框的选择,即使它在网页上显示100
发生了什么事?“下拉框仍然显示50000,甚至在网页上显示100。”
您看到的是HTML源代码。50000不是页面上显示的当前值,而是页面加载时显示的值。“它仍然显示50000作为下拉框的选择,即使它在网页上显示100”
您看到的是HTML源代码。50000不是页面上显示的当前值,而是页面加载时显示的值。您对
.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)); });
恐怕你对
.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)); });
是否将表单数据与jQuery
.data()
合并?您似乎没有使用.data()
,但我在另一个问题中看到了标记中隐藏的字段。withDataAndEvents
参数引用到.clone()
的数据是jQuery类型,而不是表单类型。“面额[3].id.deminationId
显示为null”-您的意思是“null”被发送到服务器吗?@MattW所以我应该在克隆整行之后使用.data()
?但我认为是用户定义数据,这里似乎有一个重复行上的锁阻止用户编辑。当提交具有如此重复行的表单时,出现了一些问题。@Dreamer您似乎不需要.data()
,但没有任何形式的.clone()
会为您清除表单数据。@Dreamer jQuery的.data()
是一种将任意JS数据附加到DOM对象的机制。它与HTML表单无关。如果在要克隆的元素上使用了该功能,.clone(false)
不会将附加的数据复制到克隆,而.clone(true)
会。是否将表单数据与jQuery.data()
合并?您似乎没有使用.data()
,但我在另一个问题中看到了标记中隐藏的字段。withDataAndEvents
参数引用到.clone()
的数据是jQuery类型,而不是表单类型。“面额[3].id.deminationId
显示为null”-您的意思是“null”被发送到服务器吗?@MattW所以我应该在克隆整行之后使用.data()
?但我认为是用户定义数据,这里似乎有一个重复行上的锁阻止用户编辑。当提交具有如此重复行的表单时,出现了一些问题。@Dreamer您似乎不需要.data()
,但没有任何形式的.clone()
会为您清除表单数据。@Dreamer jQuery的.data()
是一种将任意JS数据附加到DOM对象的机制。它与HTML表单无关。如果您在要克隆的元素上使用了该功能,.clone(false)
将不会将附加的数据复制到克隆,而.clone(true)
将默认使用参数为false的.clone()函数。所以真的很好奇克隆(true)能带来什么不同。默认情况下,clone()函数的参数为false。所以真的很好奇克隆(真)能带来什么不同。没错。似乎从firebug中看到的内容并不代表表单中要提交的内容。没错。似乎从firebug中看到的内容并不计入表单中要提交的内容。