如何选择所有具有相同名称的输入并将它们的名称编入索引
问题描述:
我必须处理由第三部分生成的表单。此表单提供了一些复选框“多选”属性。但输入名称是相同的,并且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>
有没有一种方法来识别具有相同名称的输入组?
答
如果存在另一个具有相同名称的项目,这将在每个复选框项目的名称后附加[]
。
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];
});
答
试试这个:
var group = $('input[name="attr1"]');
if (group.length > 1){
group.each(function() {
$(this).attr("name",$(this).attr("name")+"[]");
});
}
答
你需要在你的情况下使用$('input[name^="attr"]')
。由于您的物品有attr1
,attr2
,attr3
等。上述选择器将匹配所有。
您可以@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>
希望这可以帮助你。
答
这是很长的解决方案
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+"[]");
});
答
$("input[name=attr\\[\\]]");
得到所有输入其中name = attr[]
是否有你的JavaScript这样做的理由而不是直接修改标记?我想你不介意用JS禁用用户疏远用户,对吗? – 2012-02-08 12:10:09
这个HTML表单由第三部分提供(XML由XSL转换),我不想修改提供的XSL(它是版本化的,我从web服务中获得它)。你说得对,我不处理JS禁用的用户(它不是一个公共网站,而是一个在线服务应用程序)。 – AlterPHP 2012-02-08 12:52:45