2012-02-08 75 views
12

我必须处理由第三部分生成的表单。此表单提供了一些复选框“多选”属性。但输入名称是相同的,并且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> 

有没有一种方法来识别具有相同名称的输入组?

+0

是否有你的JavaScript这样做的理由而不是直接修改标记?我想你不介意用JS禁用用户疏远用户,对吗? – 2012-02-08 12:10:09

+0

这个HTML表单由第三部分提供(XML由XSL转换),我不想修改提供的XSL(它是版本化的,我从web服务中获得它)。你说得对,我不处理JS禁用的用户(它不是一个公共网站,而是一个在线服务应用程序)。 – AlterPHP 2012-02-08 12:52:45

回答

19

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

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/

+0

不错! +1一个简单的解决方案:) – Stefan 2012-02-08 12:15:18

+0

谢谢,这正是我需要的! – AlterPHP 2012-02-08 12:19:18

+0

@PéCé不客气。 – 2012-02-08 13:01:37

4

试试这个:

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

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

我只想匹配具有相同名称的兄弟姐妹的输入,而不是所有的输入。我不知道它是否真的有可能... – AlterPHP 2012-02-08 12:05:36

+0

你能详细解释一下吗?像只有复选框?在我的回答中,我正在使用':checkbox'选择器更改仅复选框控件的名称。 – 2012-02-08 12:09:26

+0

我想改变名称,只有当输入有一个同名的兄弟。这就是为什么你的解决方案不完美;) – AlterPHP 2012-02-08 12:21:21

0

你需要在你的情况下使用$('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> 

希望这可以帮助你。

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+"[]"); 
       }); 
0
$("input[name=attr\\[\\]]"); 

得到所有输入其中name = attr[]

相关问题