如何选择具有相同名称的所有输入并按名称对其进行索引

时间:2012-02-08 11:50:52

标签: jquery jquery-selectors

我必须处理由第三部分生成的表单。此表单提供了一些复选框“多选”属性。但输入名称是相同的,并且PHP $ _POST无法处理相同的键(仅处理最后的数据)。

以下是表单的示例:

<form>
    <input type="checkbox" name="attr1" value="1" />
    <input type="checkbox" name="attr1" value="2" />
    <input type="checkbox" name="attr1" value="3" />
    <input type="checkbox" name="attr1" value="4" />
    <input type="checkbox" name="attr2" value="xx" />
    <input type="checkbox" name="attr3" value="a" />
    <input type="checkbox" name="attr3" value="b" />
    <input type="checkbox" name="attr3" value="c" />
    <input type="checkbox" name="attr3" value="d" />
    <input type="text" name="attr4" value="" />
</form>

我想解析所有复选框输入,只获取相同名称输入的组,并在其名称后附加“[]”...

jQuery处理后我想得到的东西:

<form>
    <input type="checkbox" name="attr1[]" value="1" />
    <input type="checkbox" name="attr1[]" value="2" />
    <input type="checkbox" name="attr1[]" value="3" />
    <input type="checkbox" name="attr1[]" value="4" />
    <input type="checkbox" name="attr2" value="xx" />
    <input type="checkbox" name="attr3[]" value="a" />
    <input type="checkbox" name="attr3[]" value="b" />
    <input type="checkbox" name="attr3[]" value="c" />
    <input type="checkbox" name="attr3[]" value="d" />
    <input type="text" name="attr4" value="" />
</form>

有没有办法识别具有相同名称的输入组?

5 个答案:

答案 0 :(得分:21)

如果存在另一个具有相同名称的项目,则会将[]附加到每个复选框项的名称。

var name_map = {};
$("input[type=checkbox]")  // for all checkboxes
    .each(function() {  // first pass, create name mapping
        var name = this.name;
        name_map[name] = (name_map[name]) ? name + "[]" : name;
    })
    .each(function() {  // replace name based on mapping
        this.name = name_map[this.name];
    });

演示:http://jsfiddle.net/gnfsG/

答案 1 :(得分:4)

试试这个:

var group = $('input[name="attr1"]');

if (group.length > 1){
   group.each(function () {
        $(this).attr("name",$(this).attr("name")+"[]");
   });
}

答案 2 :(得分:1)

在您的情况下,您需要使用$('input[name^="attr"]')。由于您的商品有attr1attr2attr3等,以上选择器将与所有商品匹配。

您可以在@ http://jsfiddle.net/cT78Y/2/

中查看此操作
$('input[name^="attr"]:checkbox').each(function(i){
   $(this).attr("name",$(this).attr("name")+"[]");
});

这会给你。

<form>
  <input type="checkbox" name="attr1[]" value="1">
  <input type="checkbox" name="attr1[]" value="2">
  <input type="checkbox" name="attr1[]" value="3">
  <input type="checkbox" name="attr1[]" value="4">
  <input type="checkbox" name="attr2[]" value="xx">
  <input type="checkbox" name="attr3[]" value="a">
  <input type="checkbox" name="attr3[]" value="b">
  <input type="checkbox" name="attr3[]" value="c">
  <input type="checkbox" name="attr3[]" value="d">
  <input type="text" name="attr4" value="">
</form>

希望这会对你有所帮助。

答案 3 :(得分:0)

这是一个很长的解决方案

var array =[];
                $('input[type="checkbox"]').each(function(){
                    array.push($(this).attr('name'));
                });

                var sorted_arr = array.sort(); // You can define the comparing function here.
                // JS by default uses a crappy string compare.
                var results = [];
                for (var i = 0; i < array.length - 1; i++) {
                    if (sorted_arr[i + 1] == sorted_arr[i]) {
                        results.push(sorted_arr[i]);
                    }
                }
                var names = [];
                names = jQuery.unique(results);
                $.each(names ,function(key,value){
                    $('input[name ="'+value+'"]').attr("name",value+"[]");
                });

答案 4 :(得分:0)

$("input[name=attr\\[\\]]");

获取name = attr[]

的所有输入