jQuery:将复选框的值作为数组返回?

时间:2011-12-06 21:32:56

标签: jquery forms jquery-selectors checkbox

这让我很难过。我可以轻松地将多选的值作为数组获取,并将其传递给ajax请求:

<select id="countries" class="multiselect" multiple="multiple" name="countries[]">
  <option value="AFG">Afghanistan</option>
  <etc>
...
$countries_input = $("#countries");
var countries = $countries_input.val();
$.ajax({
  data: {
    country : countries,
    ...
  },
  ...
});

但我找不到任何等效方法来获取具有多个选择的复选框的值。明显的东西不起作用:

<input type="checkbox" name="check[]" value="foo1"/>foo1<br/>
<input type="checkbox" name="check[]" value="foo2"/>foo2<br/>
...
var bar = $('input:checkbox[name=check]').val();         // undefined
var bar = $('input:checkbox[name=check[]]').val();       // also undefined
var bar = $('input:checkbox[name=check]:checked').val(); // also undefined

有什么想法吗?感谢。

3 个答案:

答案 0 :(得分:7)

没有内置的jQuery功能。你必须自己做。您可以通过简单的循环轻松完成:

var vals = []
$('input:checkbox[name="check[]"]').each(function() {
    vals.push(this.value);
});

或者如果你只想要检查的那些:

var vals = []
$('input:checkbox[name="check[]"]').each(function() {
    if (this.checked) {
        vals.push(this.value);
    }
});

或者您可以使用mapget

var vals = $('input:checkbox[name="check[]"]').map(function() {
    return this.value;
}).get();

或者如果你只想要检查的那些:

var vals = $('input:checkbox[name="check[]"]').map(function() {
    return this.checked ? this.value : undefined;
}).get();

附注1:jQuery需要属性值选择器中的值(上面的那种)始终在引号中,尽管在撰写本文时尽管记录它仍然松懈。这是一个jQuery的东西,但在这种情况下你也需要CSS(CSS2 Reference | CSS3 Reference),因为你的值包括[],它对没有引号的值无效在CSS中。 (在CSS中,如果没有引号,则值必须为identifiers。)


附注2:注意我在上面的迭代器函数中使用了this.value来获取input的值,而不是$(this).val()。它几乎只是一种风格的东西,从各方面来看都不比另一种更好。 this.value更直接,如果你完全了解DOM(并且每个网络程序员都应该),那就非常清楚了。但是,当然,虽然完全可靠的跨浏览器与复选框和大多数其他input元素,但它不是可靠的跨浏览器与一些其他表单字段(例如select框)。 {j}密集型应用程序中$(this).val()更为惯用,您不必担心thisinput还是select。是的,它增加了开销,但如果你没有成千上万的,那就不重要了。

答案 1 :(得分:4)

  • 如果您不熟悉.map()方法,请介绍我最喜欢的方法之一。手册页上的示例还包含复选框。 .get()方法可用于将jQuery集合转换为对象。
  

.map():通过函数传递当前匹配集中的每个元素,   生成一个包含返回值的新jQuery对象。

  • 您需要的其他知识是,您在属性选择器中使用反斜杠转义[]name=check\[\]]修改:当然,如果您使用标准属性选择器语法,则没有问题:name="check[]"

这样的东西就足够了:

var checkedValues = $('input:checkbox[name="check[]"]:checked').map(function () {
    return $(this).val();
}).get();

jsFiddle Demo

答案 2 :(得分:0)

我认为serialize()serializeArray()数组会起作用,但显然它们只适用于选择的孩子。

最糟糕的情况我只会使用map()来获取数组

country : $("your input selector").map(function() {return $(this).val();})