如何使用多个选择输入中的JQuery构建List参数?

时间:2011-05-12 18:00:03

标签: javascript jquery forms post

我需要POST一个JSON字符串,其中包含来自多选表单的一个或多个值的List。在我提出的JQuery解决方案中,我得到了列表中选择的所有值,但它们作为单独的参数返回。

$(document).ready(function() {
  $("#fooForm").submit(function(event) {
    event.preventDefault();         
    var $form = $(this),
    loc = $form.find('input[name="location"]').val(),
    url = $form.attr('action'),
    keys = $('#people :selected').map(function(){return $(this).val();}).get();
    $.post(url, {people:keys, location:loc},
        function(data) {
          $("#result").html(data);
        }
    );
  });
});

<form id="fooForm" method="" action="/api/people/location">
  <input type="hidden" name="location" value="{{location}}" />
  <select id="people" multiple size=4>
   <option value="{{a.key}}">{{a.name}}</option>
   <option value="{{b.key}}">{{b.name}}</option>
   <option value="{{c.key}}">{{c.name}}</option>
   <option value="{{d.key}}">{{d.name}}</option>
  </select> 
  <input type="submit" value="Submit" />    
</form>

如果选择了三个人,则会产生以下参数:

location     91.001,-11.23
people[] agxzdXBlcmxhcnAtc2ty_foo
people[] agxzdXBlcmxhcnAtc2ty_spam
people[] agxzdXBlcmxhcnAtc2ty_eggs

我希望有一个包含三个键值的人员参数。


更新 这是我提出的最优雅的解决方案:

$(document).ready(function() {
  $("#fooForm").submit(function(event) {
    event.preventDefault();         
var dataToBeSent = $("#fooFoorm").serialize();
var url = $("#fooForm").attr('action');
    $.post(url, dataToBeSent,
        function(data) {
          $("#result").html(data);
        }, "json"
    );
  });
});

<form id="fooForm" method="" action="/api/people/location">
  <input type="hidden" name="location" value="{{location}}" />
  <select name="people" multiple size=4>
   <option value="{{a.key}}">{{a.name}}</option>
   <option value="{{b.key}}">{{b.name}}</option>
   <option value="{{c.key}}">{{c.name}}</option>
   <option value="{{d.key}}">{{d.name}}</option>
  </select> 
  <input type="submit" value="Submit" />    
</form>

2 个答案:

答案 0 :(得分:1)

在参数中发送列表的标准方法是对列表中的每个项使用一个参数(然后将其命名为param“whatever []”以表示它是列表)。

另外,你真的应该使用SELECT的名字,而不是id;你不应该在页面上有多个具有相同ID的元素,而name实际上是“命名”表单数据的属性。

执行您尝试执行的操作的更简单方法是使用jQuery serialize方法。这可以让你做到:

keys = $("#fooForm").serialize()

但是,我非常肯定会做多个参数的事情,所以如果你真的必须有一个参数,那么你就会遇到这样的问题:

keys = ""
$('#people :selected').each(function(){
    keys += $(this).val() + ",";
});
// Strip off the trailing comma if present

答案 1 :(得分:0)

也许用逗号加入keys数组?