我有HTML下列块,其用于收集关于从用户作为一种形式的一部分的项目的信息:
<div class="clone_block">
Name: <input type="text" name="items[0][name]" /><br />
Amount: <input type="text" name="items[0][amount]" /><br />
<button class="delete">Delete</button>
</div>
我可以克隆这个元素(如果用户想增加其他项目),并把它的最后一个实例后div.clone_block
在DOM和一切工作正常,我也可以删除元素。 然而,我最终具有相同名称的,这意味着仅在POST请求(以前的将被覆盖)的最后一个显示出来的文字输入的多个实例。 我想要做的是重号的所有项目,使得第一是item[0]
第二个item[1]
等。
有没有办法在jQuery来做到这一点? 以这种方式创建的名称更容易与PHP处理POST数据,所以我不希望如果可能更改命名方案。
您可以实现像这样重命名每个克隆/删除后的元素:
function renumber_blocks() {
$(".clone_block").each(function(index) {
var prefix = "items[" + index + "]";
$(this).find("input").each(function() {
this.name = this.name.replace(/items\[\d+\]/, prefix);
});
});
}
演示: http://jsfiddle.net/Wzzf2/1/
如果您使用的是PHP作为服务器端语言,你可以这样做:
<div class="clone_block">
Name: <input type="text" name="items[][name]" /><br />
Amount: <input type="text" name="items[][amount]" /><br />
<button class="delete">Delete</button>
</div>
PHP会自动处理,当它接收到的数据生成右偏移的索引。
但是,为了回答你的问题,一旦你克隆你的块,你只需要浏览其结构,并更改名称用递增的号码属性。 或者更好的浏览所有输入和重新索引他们时,使用了添加或删除按钮......这将允许删除。
/// find each row with inputs
$('div.form_row').each(function(rowIndex){
/// find each input with a name attribute inside each row
$(this).find('input[name]').each(function(){
var name;
name = $(this).attr('name');
name = name.replace(/\[[0-9]+\]/g, '['+rowIndex+']');
$(this).attr('name',name);
});
});
以上就可以了(并已测试)与下面的标记,你应该看到指标得到重新排序:
<div class="form_row"><input name="something[0][abc]"></div>
<div class="form_row"><input name="something[2][abc]"></div>
<div class="form_row"><input name="something[3][abc]"></div>
更正!
刚刚意识到错误与依靠PHP生成索引......如果你的索引是阵列结构的最后一部分,它将工作:
something[abc][]
something[def][]
但是,如果你正在使用(像你):
something[][abc]
something[][def]
你最终将以下PHP端:
array (
'0' => array( 'abc' => 'value' ),
'1' => array( 'def' => 'value' ),
)
而不是:
array (
'0' => array(
'abc' => 'value',
'def' => 'value',
),
);
这可能是更你想要什么。 因此,对于你的例子忽略我提到了PHP的路线,并使用jQuery的片段来代替。 PHP的解决方案仍然是有用的,如果你只有每行一个输入但是...
如果你想使用其他的指标,同时将其拷贝会比较复杂一点做一些事情:
var name = $('input').attr('name'),
newId = parseInt(name.match(/\d+/)[1])++;
// clone the input and use newId for something else
$('input.new').attr('name', name.replace(/\d+/, newId));