在表单中动态添加未知数量的多个选择元素

时间:2014-04-21 19:20:26

标签: javascript php html forms

我正在处理一个表单,用户可以使用多个属性集添加任意数量的select元素,但我无法获得正确的结果。我的简化测试用例如下,但是我们使用名称fieldLocation[<id of field in database>][]添加现有选择(当用户编辑项目时),当它提交时,值被放在同一个数组中(即数组(1,2))但是当我们在使用fieldLocation[][]的地方添加新元素时,它会返回它自己的数组(array(array(1),array(2)))中的每个选择。有没有办法动态添加元素而不必生成名称?

示例:

<form method="post">
    <select size="4" multiple="multiple" name="fieldLocation[][]">
        <option value="1">item1</option>
        <option value="2">item2</option>
        <option value="3">item3</option>
        <option value="4">item4</option>
    </select>

    <input type="submit">
</form>

结果:

array(2) {
  [0]=>
  array(1) {
    [0]=>
    string(1) "1"
  }
  [1]=>
  array(1) {
    [0]=>
    string(1) "2"
  }
}

我们想要的结果:

array(1) {
  [1]=>
  array(2) {
    [0]=>
    string(1) "1"
    [1]=>
    string(1) "2"
  }
}

1 个答案:

答案 0 :(得分:0)

虽然我至少可以对此部分错误,但我不相信第一级数组之外的任何内容都适用于名称。所以fieldLocation [] []只能是fieldLocation []。

解决这个问题的一种方法是在提交表单时预处理表单,使用javascript获取所有选择的值并使用JSON对它们进行编码以发送到服务器。

这样的事情:

$(form_submit_button).on('click',function(event){
 event.preventDefault();
 var data = form.serializeArray();
 data = JSON.stringify(data);
 $(<input/>,{value:data,type:'hidden',name:'fieldLocation'}).appendTo(form);
 form.submit();
});

示例很粗糙,但您将click事件绑定到提交按钮(正常按钮或链接,而不是实际的提交按钮会更好)。然后序列化表单并将其转换为字符串。最后,在提交表单之前,使用数据创建一个新的隐藏输入元素。这应该允许您在php中使用json_decode来根据需要提取数据。我不确定serializeArray是否可以使用您拥有的名称结构,如果没有,那么您需要手动序列化数据。