重新编号文本输入数组索引与jQuery(Re-numbering text input array

2019-09-22 07:27发布

我有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数据,所以我不希望如果可能更改命名方案。

Answer 1:

您可以实现像这样重命名每个克隆/删除后的元素:

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/



Answer 2:

如果您使用的是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的解决方案仍然是有用的,如果你只有每行一个输入但是...



Answer 3:

如果你想使用其他的指标,同时将其拷贝会比较复杂一点做一些事情:

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


文章来源: Re-numbering text input array indices with jQuery
标签: jquery forms