使用jQuery clone在表单的输入字段中增加多维数组中的键

时间:2011-12-22 21:00:57

标签: jquery

我正在尝试将这两个答案中的信息拼凑起来,但似乎都没有以我可以推断并为我的情况工作的方式来解决问题。所以如果这看似重复,请不要惩罚我;我认为不是。

Increment multidimensional array when form fields are cloned

Copy table row and increment all name attributes

<tr>
    <td><input type="text" name="pricing['prices'][0]['label']" value="" /></td>
    <td><input type="text" name="pricing['prices'][0]['price']" value="" /></td>
    <td><input type="text" name="pricing['prices'][0]['expires']" value="" /></td>
    <td><input type="text" name="pricing['prices'][0]['bulk-price']" value="" /></td>
    <td><input type="text" name="pricing['prices'][0]['bulk-qty']" value="" /></td>
</tr>
我正试图克隆

,使用此按钮:

<input type="button" id="newRowButton" value="Add Another Price" />

脚本(到目前为止,克隆工作,但它不会将“0”更改为“1”。我显然遗漏了一些我无法通过拼凑其他两个答案中的示例来解决的问题)

$("#newRowButton").live('click',function(e) {
    e.preventDefault();
  $("table.tablearray tr:last")
      .clone()
      .find(':input')
      .each(function(){
            this.name = this.name.replace(/\[(\d+)\]$/,
                                          function(str,p1){
                                              return '[' + (parseInt(p1,10)+1) + ']';
                                          });
        })
    .end()
    .appendTo("table")
});

任何帮助将不胜感激。理想情况下,我也想添加一个“删除行”按钮。

2 个答案:

答案 0 :(得分:6)

从正则表达式中取出$符号,如下所示:

$("#newRowButton").live('click',function(e) {
    e.preventDefault();
  $("table.tablearray tr:last")
      .clone()
      .find(':input')
      .each(function(){
            this.name = this.name.replace(/\[(\d+)\]/, function(str,p1){
                return '[' + (parseInt(p1,10)+1) + ']';
            });
        })
    .end()
    .appendTo("table")
});

$强迫它在名称末尾寻找[0],而不是你拥有的。{/ p>

此处的演示演示:http://jsfiddle.net/jfriend00/S9Q8W/

答案 1 :(得分:1)

你的正则表达式有轻微错误:

this.name = this.name.replace(/\[(\d+)\]$/,

这只与[0]匹配,当它是元素名称的 end 时,因为$表示“字符串的结尾”。如果删除它,转换工作正常:

this.name = this.name.replace(/\[(\d+)\]/,
                                      function(str,p1){
                                          return '[' + (parseInt(p1,10)+1) + ']';
                                      });